Merge "Added private event flag for committed states" into main
diff --git a/apct-tests/perftests/core/src/android/libcore/regression/ExpensiveObjectsPerfTest.java b/apct-tests/perftests/core/src/android/libcore/regression/ExpensiveObjectsPerfTest.java
index ecbfc71..10ec2bf 100644
--- a/apct-tests/perftests/core/src/android/libcore/regression/ExpensiveObjectsPerfTest.java
+++ b/apct-tests/perftests/core/src/android/libcore/regression/ExpensiveObjectsPerfTest.java
@@ -75,8 +75,19 @@
     @Test(timeout = 900000)
     public void timeNewCollator() {
         BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+        int i = 0;
         while (state.keepRunning()) {
             Collator.getInstance(Locale.US);
+
+            if (++i % 1000 == 0) {
+                state.pauseTiming();
+                // GC and finalize occasionally to avoid GC for alloc and/or
+                // blocking on finalization during benchmark time.
+                // See: b/394961590
+                System.gc();
+                System.runFinalization();
+                state.resumeTiming();
+            }
         }
     }
 
@@ -84,8 +95,19 @@
     public void timeClonedCollator() {
         Collator c = Collator.getInstance(Locale.US);
         BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+        int i = 0;
         while (state.keepRunning()) {
             c.clone();
+
+            if (++i % 1000 == 0) {
+                state.pauseTiming();
+                // GC and finalize occasionally to avoid GC for alloc and/or
+                // blocking on finalization during benchmark time.
+                // See: b/394961590
+                System.gc();
+                System.runFinalization();
+                state.resumeTiming();
+            }
         }
     }
 
diff --git a/apex/jobscheduler/service/aconfig/job.aconfig b/apex/jobscheduler/service/aconfig/job.aconfig
index 86ed06b..29df80f 100644
--- a/apex/jobscheduler/service/aconfig/job.aconfig
+++ b/apex/jobscheduler/service/aconfig/job.aconfig
@@ -105,4 +105,14 @@
     metadata {
         purpose: PURPOSE_BUGFIX
     }
-}
\ No newline at end of file
+}
+
+flag {
+    name: "include_trace_tag_in_job_name"
+    namespace: "backstage_power"
+    description: "Add the trace tag to the job name"
+    bug: "354795473"
+    metadata {
+        purpose: PURPOSE_BUGFIX
+    }
+}
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 aaf6986..2d069f9 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
@@ -674,6 +674,12 @@
         this.job = job;
 
         StringBuilder batteryName = new StringBuilder();
+        if (com.android.server.job.Flags.includeTraceTagInJobName()) {
+            final String filteredTraceTag = this.getFilteredTraceTag();
+            if (filteredTraceTag != null) {
+                batteryName.append("#").append(filteredTraceTag).append("#");
+            }
+        }
         if (namespace != null) {
             batteryName.append("@").append(namespace).append("@");
         }
diff --git a/cmds/svc/src/com/android/commands/svc/OWNERS b/cmds/svc/src/com/android/commands/svc/OWNERS
index d5a5d7b..a901dfd 100644
--- a/cmds/svc/src/com/android/commands/svc/OWNERS
+++ b/cmds/svc/src/com/android/commands/svc/OWNERS
@@ -1,2 +1,2 @@
 # Bug component: 48448
-per-file NfcCommand.java = file:platform/packages/apps/Nfc:/OWNERS
+per-file NfcCommand.java = file:platform/packages/modules/Nfc:/OWNERS
diff --git a/core/api/current.txt b/core/api/current.txt
index 050cad4..fde139b 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -100,6 +100,9 @@
     field public static final String EXECUTE_APP_ACTION = "android.permission.EXECUTE_APP_ACTION";
     field @FlaggedApi("android.app.appfunctions.flags.enable_app_function_manager") public static final String EXECUTE_APP_FUNCTIONS = "android.permission.EXECUTE_APP_FUNCTIONS";
     field public static final String EXPAND_STATUS_BAR = "android.permission.EXPAND_STATUS_BAR";
+    field @FlaggedApi("android.xr.xr_manifest_entries") public static final String EYE_TRACKING_COARSE = "android.permission.EYE_TRACKING_COARSE";
+    field @FlaggedApi("android.xr.xr_manifest_entries") public static final String EYE_TRACKING_FINE = "android.permission.EYE_TRACKING_FINE";
+    field @FlaggedApi("android.xr.xr_manifest_entries") public static final String FACE_TRACKING = "android.permission.FACE_TRACKING";
     field public static final String FACTORY_TEST = "android.permission.FACTORY_TEST";
     field public static final String FOREGROUND_SERVICE = "android.permission.FOREGROUND_SERVICE";
     field public static final String FOREGROUND_SERVICE_CAMERA = "android.permission.FOREGROUND_SERVICE_CAMERA";
@@ -120,6 +123,8 @@
     field public static final String GET_PACKAGE_SIZE = "android.permission.GET_PACKAGE_SIZE";
     field @Deprecated public static final String GET_TASKS = "android.permission.GET_TASKS";
     field public static final String GLOBAL_SEARCH = "android.permission.GLOBAL_SEARCH";
+    field @FlaggedApi("android.xr.xr_manifest_entries") public static final String HAND_TRACKING = "android.permission.HAND_TRACKING";
+    field @FlaggedApi("android.xr.xr_manifest_entries") public static final String HEAD_TRACKING = "android.permission.HEAD_TRACKING";
     field public static final String HIDE_OVERLAY_WINDOWS = "android.permission.HIDE_OVERLAY_WINDOWS";
     field public static final String HIGH_SAMPLING_RATE_SENSORS = "android.permission.HIGH_SAMPLING_RATE_SENSORS";
     field public static final String INSTALL_LOCATION_PROVIDER = "android.permission.INSTALL_LOCATION_PROVIDER";
@@ -295,6 +300,8 @@
     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 public static final String RUN_USER_INITIATED_JOBS = "android.permission.RUN_USER_INITIATED_JOBS";
+    field @FlaggedApi("android.xr.xr_manifest_entries") public static final String SCENE_UNDERSTANDING_COARSE = "android.permission.SCENE_UNDERSTANDING_COARSE";
+    field @FlaggedApi("android.xr.xr_manifest_entries") public static final String SCENE_UNDERSTANDING_FINE = "android.permission.SCENE_UNDERSTANDING_FINE";
     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";
     field public static final String SEND_SMS = "android.permission.SEND_SMS";
@@ -362,6 +369,8 @@
     field public static final String SENSORS = "android.permission-group.SENSORS";
     field public static final String SMS = "android.permission-group.SMS";
     field public static final String STORAGE = "android.permission-group.STORAGE";
+    field @FlaggedApi("android.xr.xr_manifest_entries") public static final String XR_TRACKING = "android.permission-group.XR_TRACKING";
+    field @FlaggedApi("android.xr.xr_manifest_entries") public static final String XR_TRACKING_SENSITIVE = "android.permission-group.XR_TRACKING_SENSITIVE";
   }
 
   public final class R {
@@ -2419,6 +2428,7 @@
     field public static final int accessibilityActionScrollRight = 16908347; // 0x102003b
     field public static final int accessibilityActionScrollToPosition = 16908343; // 0x1020037
     field public static final int accessibilityActionScrollUp = 16908344; // 0x1020038
+    field @FlaggedApi("android.view.accessibility.a11y_selection_api") public static final int accessibilityActionSetExtendedSelection;
     field public static final int accessibilityActionSetProgress = 16908349; // 0x102003d
     field public static final int accessibilityActionShowOnScreen = 16908342; // 0x1020036
     field public static final int accessibilityActionShowTextSuggestions = 16908376; // 0x1020058
@@ -5478,37 +5488,37 @@
     method public android.net.Uri getConditionId();
     method @Nullable public android.content.ComponentName getConfigurationActivity();
     method public long getCreationTime();
-    method @FlaggedApi("android.app.modes_api") @Nullable public android.service.notification.ZenDeviceEffects getDeviceEffects();
-    method @FlaggedApi("android.app.modes_api") @DrawableRes public int getIconResId();
+    method @Nullable public android.service.notification.ZenDeviceEffects getDeviceEffects();
+    method @DrawableRes public int getIconResId();
     method public int getInterruptionFilter();
     method public String getName();
     method public android.content.ComponentName getOwner();
-    method @FlaggedApi("android.app.modes_api") @Nullable public String getTriggerDescription();
-    method @FlaggedApi("android.app.modes_api") public int getType();
+    method @Nullable public String getTriggerDescription();
+    method public int getType();
     method @Nullable public android.service.notification.ZenPolicy getZenPolicy();
     method public boolean isEnabled();
-    method @FlaggedApi("android.app.modes_api") public boolean isManualInvocationAllowed();
+    method public boolean isManualInvocationAllowed();
     method public void setConditionId(android.net.Uri);
     method public void setConfigurationActivity(@Nullable android.content.ComponentName);
-    method @FlaggedApi("android.app.modes_api") public void setDeviceEffects(@Nullable android.service.notification.ZenDeviceEffects);
+    method public void setDeviceEffects(@Nullable android.service.notification.ZenDeviceEffects);
     method public void setEnabled(boolean);
     method public void setInterruptionFilter(int);
     method public void setName(String);
     method public void setZenPolicy(@Nullable android.service.notification.ZenPolicy);
     method public void writeToParcel(android.os.Parcel, int);
     field @NonNull public static final android.os.Parcelable.Creator<android.app.AutomaticZenRule> CREATOR;
-    field @FlaggedApi("android.app.modes_api") public static final int TYPE_BEDTIME = 3; // 0x3
-    field @FlaggedApi("android.app.modes_api") public static final int TYPE_DRIVING = 4; // 0x4
-    field @FlaggedApi("android.app.modes_api") public static final int TYPE_IMMERSIVE = 5; // 0x5
-    field @FlaggedApi("android.app.modes_api") public static final int TYPE_MANAGED = 7; // 0x7
-    field @FlaggedApi("android.app.modes_api") public static final int TYPE_OTHER = 0; // 0x0
-    field @FlaggedApi("android.app.modes_api") public static final int TYPE_SCHEDULE_CALENDAR = 2; // 0x2
-    field @FlaggedApi("android.app.modes_api") public static final int TYPE_SCHEDULE_TIME = 1; // 0x1
-    field @FlaggedApi("android.app.modes_api") public static final int TYPE_THEATER = 6; // 0x6
-    field @FlaggedApi("android.app.modes_api") public static final int TYPE_UNKNOWN = -1; // 0xffffffff
+    field public static final int TYPE_BEDTIME = 3; // 0x3
+    field public static final int TYPE_DRIVING = 4; // 0x4
+    field public static final int TYPE_IMMERSIVE = 5; // 0x5
+    field public static final int TYPE_MANAGED = 7; // 0x7
+    field public static final int TYPE_OTHER = 0; // 0x0
+    field public static final int TYPE_SCHEDULE_CALENDAR = 2; // 0x2
+    field public static final int TYPE_SCHEDULE_TIME = 1; // 0x1
+    field public static final int TYPE_THEATER = 6; // 0x6
+    field public static final int TYPE_UNKNOWN = -1; // 0xffffffff
   }
 
-  @FlaggedApi("android.app.modes_api") public static final class AutomaticZenRule.Builder {
+  public static final class AutomaticZenRule.Builder {
     ctor public AutomaticZenRule.Builder(@NonNull android.app.AutomaticZenRule);
     ctor public AutomaticZenRule.Builder(@NonNull String, @NonNull android.net.Uri);
     method @NonNull public android.app.AutomaticZenRule build();
@@ -7126,7 +7136,7 @@
 
   public class NotificationManager {
     method public String addAutomaticZenRule(android.app.AutomaticZenRule);
-    method @FlaggedApi("android.app.modes_api") public boolean areAutomaticZenRulesUserManaged();
+    method public boolean areAutomaticZenRulesUserManaged();
     method @Deprecated public boolean areBubblesAllowed();
     method public boolean areBubblesEnabled();
     method public boolean areNotificationsEnabled();
@@ -7146,7 +7156,7 @@
     method public void deleteNotificationChannelGroup(String);
     method public android.service.notification.StatusBarNotification[] getActiveNotifications();
     method public android.app.AutomaticZenRule getAutomaticZenRule(String);
-    method @FlaggedApi("android.app.modes_api") public int getAutomaticZenRuleState(@NonNull String);
+    method public int getAutomaticZenRuleState(@NonNull String);
     method public java.util.Map<java.lang.String,android.app.AutomaticZenRule> getAutomaticZenRules();
     method public int getBubblePreference();
     method @NonNull public android.app.NotificationManager.Policy getConsolidatedNotificationPolicy();
@@ -7175,14 +7185,14 @@
     field public static final String ACTION_APP_BLOCK_STATE_CHANGED = "android.app.action.APP_BLOCK_STATE_CHANGED";
     field public static final String ACTION_AUTOMATIC_ZEN_RULE = "android.app.action.AUTOMATIC_ZEN_RULE";
     field public static final String ACTION_AUTOMATIC_ZEN_RULE_STATUS_CHANGED = "android.app.action.AUTOMATIC_ZEN_RULE_STATUS_CHANGED";
-    field @FlaggedApi("android.app.modes_api") public static final String ACTION_CONSOLIDATED_NOTIFICATION_POLICY_CHANGED = "android.app.action.CONSOLIDATED_NOTIFICATION_POLICY_CHANGED";
+    field public static final String ACTION_CONSOLIDATED_NOTIFICATION_POLICY_CHANGED = "android.app.action.CONSOLIDATED_NOTIFICATION_POLICY_CHANGED";
     field public static final String ACTION_INTERRUPTION_FILTER_CHANGED = "android.app.action.INTERRUPTION_FILTER_CHANGED";
     field public static final String ACTION_NOTIFICATION_CHANNEL_BLOCK_STATE_CHANGED = "android.app.action.NOTIFICATION_CHANNEL_BLOCK_STATE_CHANGED";
     field public static final String ACTION_NOTIFICATION_CHANNEL_GROUP_BLOCK_STATE_CHANGED = "android.app.action.NOTIFICATION_CHANNEL_GROUP_BLOCK_STATE_CHANGED";
     field public static final String ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED = "android.app.action.NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED";
     field public static final String ACTION_NOTIFICATION_POLICY_CHANGED = "android.app.action.NOTIFICATION_POLICY_CHANGED";
-    field @FlaggedApi("android.app.modes_api") public static final int AUTOMATIC_RULE_STATUS_ACTIVATED = 4; // 0x4
-    field @FlaggedApi("android.app.modes_api") public static final int AUTOMATIC_RULE_STATUS_DEACTIVATED = 5; // 0x5
+    field public static final int AUTOMATIC_RULE_STATUS_ACTIVATED = 4; // 0x4
+    field public static final int AUTOMATIC_RULE_STATUS_DEACTIVATED = 5; // 0x5
     field public static final int AUTOMATIC_RULE_STATUS_DISABLED = 2; // 0x2
     field public static final int AUTOMATIC_RULE_STATUS_ENABLED = 1; // 0x1
     field public static final int AUTOMATIC_RULE_STATUS_REMOVED = 3; // 0x3
@@ -7196,7 +7206,7 @@
     field public static final String EXTRA_BLOCKED_STATE = "android.app.extra.BLOCKED_STATE";
     field public static final String EXTRA_NOTIFICATION_CHANNEL_GROUP_ID = "android.app.extra.NOTIFICATION_CHANNEL_GROUP_ID";
     field public static final String EXTRA_NOTIFICATION_CHANNEL_ID = "android.app.extra.NOTIFICATION_CHANNEL_ID";
-    field @FlaggedApi("android.app.modes_api") public static final String EXTRA_NOTIFICATION_POLICY = "android.app.extra.NOTIFICATION_POLICY";
+    field public static final String EXTRA_NOTIFICATION_POLICY = "android.app.extra.NOTIFICATION_POLICY";
     field public static final int IMPORTANCE_DEFAULT = 3; // 0x3
     field public static final int IMPORTANCE_HIGH = 4; // 0x4
     field public static final int IMPORTANCE_LOW = 2; // 0x2
@@ -9187,6 +9197,14 @@
 
 }
 
+package android.app.contextualsearch {
+
+  @FlaggedApi("android.app.contextualsearch.flags.self_invocation") public final class ContextualSearchManager {
+    method @FlaggedApi("android.app.contextualsearch.flags.self_invocation") public void startContextualSearch();
+  }
+
+}
+
 package android.app.jank {
 
   @FlaggedApi("android.app.jank.detailed_app_jank_metrics_api") public final class AppJankStats {
@@ -17603,6 +17621,7 @@
     method public void setIntUniform(@NonNull String, int, int, int);
     method public void setIntUniform(@NonNull String, int, int, int, int);
     method public void setIntUniform(@NonNull String, @NonNull int[]);
+    method @FlaggedApi("com.android.graphics.hwui.flags.shader_color_space") public void setWorkingColorSpace(@Nullable android.graphics.ColorSpace);
   }
 
   @FlaggedApi("com.android.graphics.hwui.flags.runtime_color_filters_blenders") public class RuntimeXfermode extends android.graphics.Xfermode {
@@ -25038,8 +25057,10 @@
     method public final void notifySessionCreated(long, @NonNull android.media.RoutingSessionInfo);
     method public final void notifySessionReleased(@NonNull String);
     method public final void notifySessionUpdated(@NonNull android.media.RoutingSessionInfo);
+    method @FlaggedApi("com.android.media.flags.enable_mirroring_in_media_router_2") @Nullable @RequiresPermission("android.permission.MODIFY_AUDIO_ROUTING") public final android.media.MediaRoute2ProviderService.MediaStreams notifySystemRoutingSessionCreated(long, @NonNull android.media.RoutingSessionInfo, @NonNull android.media.MediaRoute2ProviderService.MediaStreamsFormats);
     method @CallSuper @Nullable public android.os.IBinder onBind(@NonNull android.content.Intent);
     method public abstract void onCreateSession(long, @NonNull String, @NonNull String, @Nullable android.os.Bundle);
+    method @FlaggedApi("com.android.media.flags.enable_mirroring_in_media_router_2") public void onCreateSystemRoutingSession(long, @NonNull String, @NonNull android.media.MediaRoute2ProviderService.SystemRoutingSessionParams);
     method public abstract void onDeselectRoute(long, @NonNull String, @NonNull String);
     method public void onDiscoveryPreferenceChanged(@NonNull android.media.RouteDiscoveryPreference);
     method public abstract void onReleaseSession(long, @NonNull String);
@@ -25047,15 +25068,44 @@
     method public abstract void onSetRouteVolume(long, @NonNull String, int);
     method public abstract void onSetSessionVolume(long, @NonNull String, int);
     method public abstract void onTransferToRoute(long, @NonNull String, @NonNull String);
+    field @FlaggedApi("com.android.media.flags.enable_mirroring_in_media_router_2") public static final String CATEGORY_SYSTEM_MEDIA = "android.media.MediaRoute2ProviderService.SYSTEM_MEDIA";
+    field @FlaggedApi("com.android.media.flags.enable_mirroring_in_media_router_2") public static final int REASON_FAILED_TO_REROUTE_SYSTEM_MEDIA = 6; // 0x6
     field public static final int REASON_INVALID_COMMAND = 4; // 0x4
     field public static final int REASON_NETWORK_ERROR = 2; // 0x2
     field public static final int REASON_REJECTED = 1; // 0x1
     field public static final int REASON_ROUTE_NOT_AVAILABLE = 3; // 0x3
+    field @FlaggedApi("com.android.media.flags.enable_mirroring_in_media_router_2") public static final int REASON_UNIMPLEMENTED = 5; // 0x5
     field public static final int REASON_UNKNOWN_ERROR = 0; // 0x0
     field public static final long REQUEST_ID_NONE = 0L; // 0x0L
     field public static final String SERVICE_INTERFACE = "android.media.MediaRoute2ProviderService";
   }
 
+  @FlaggedApi("com.android.media.flags.enable_mirroring_in_media_router_2") public static final class MediaRoute2ProviderService.MediaStreams {
+    method @Nullable public android.media.AudioRecord getAudioRecord();
+  }
+
+  @FlaggedApi("com.android.media.flags.enable_mirroring_in_media_router_2") public static final class MediaRoute2ProviderService.MediaStreamsFormats {
+    method @FlaggedApi("com.android.media.flags.enable_mirroring_in_media_router_2") @Nullable public android.media.AudioFormat getAudioFormat();
+  }
+
+  @FlaggedApi("com.android.media.flags.enable_mirroring_in_media_router_2") public static final class MediaRoute2ProviderService.MediaStreamsFormats.Builder {
+    ctor public MediaRoute2ProviderService.MediaStreamsFormats.Builder();
+    method @NonNull public android.media.MediaRoute2ProviderService.MediaStreamsFormats build();
+    method @NonNull public android.media.MediaRoute2ProviderService.MediaStreamsFormats.Builder setAudioFormat(@NonNull android.media.AudioFormat);
+  }
+
+  @FlaggedApi("com.android.media.flags.enable_mirroring_in_media_router_2") public static final class MediaRoute2ProviderService.SystemRoutingSessionParams {
+    method @FlaggedApi("com.android.media.flags.enable_mirroring_in_media_router_2") @NonNull public android.os.Bundle getExtras();
+    method @FlaggedApi("com.android.media.flags.enable_mirroring_in_media_router_2") @NonNull public String getPackageName();
+  }
+
+  public static final class MediaRoute2ProviderService.SystemRoutingSessionParams.Builder {
+    ctor public MediaRoute2ProviderService.SystemRoutingSessionParams.Builder();
+    method @NonNull public android.media.MediaRoute2ProviderService.SystemRoutingSessionParams build();
+    method @NonNull public android.media.MediaRoute2ProviderService.SystemRoutingSessionParams.Builder setExtras(@NonNull android.os.Bundle);
+    method @NonNull public android.media.MediaRoute2ProviderService.SystemRoutingSessionParams.Builder setPackageName(@NonNull String);
+  }
+
   public class MediaRouter {
     method public void addCallback(int, android.media.MediaRouter.Callback);
     method public void addCallback(int, android.media.MediaRouter.Callback, int);
@@ -38231,7 +38281,7 @@
     field public static final String ACTION_APP_OPEN_BY_DEFAULT_SETTINGS = "android.settings.APP_OPEN_BY_DEFAULT_SETTINGS";
     field public static final String ACTION_APP_SEARCH_SETTINGS = "android.settings.APP_SEARCH_SETTINGS";
     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_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 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";
@@ -38325,7 +38375,7 @@
     field public static final String EXTRA_AIRPLANE_MODE_ENABLED = "airplane_mode_enabled";
     field public static final String EXTRA_APP_PACKAGE = "android.provider.extra.APP_PACKAGE";
     field public static final String EXTRA_AUTHORITIES = "authorities";
-    field @FlaggedApi("android.app.modes_api") public static final String EXTRA_AUTOMATIC_ZEN_RULE_ID = "android.provider.extra.AUTOMATIC_ZEN_RULE_ID";
+    field public static final String EXTRA_AUTOMATIC_ZEN_RULE_ID = "android.provider.extra.AUTOMATIC_ZEN_RULE_ID";
     field public static final String EXTRA_BATTERY_SAVER_MODE_ENABLED = "android.settings.extra.battery_saver_mode_enabled";
     field public static final String EXTRA_BIOMETRIC_AUTHENTICATORS_ALLOWED = "android.provider.extra.BIOMETRIC_AUTHENTICATORS_ALLOWED";
     field public static final String EXTRA_CHANNEL_FILTER_LIST = "android.provider.extra.CHANNEL_FILTER_LIST";
@@ -42117,9 +42167,9 @@
 
   public final class Condition implements android.os.Parcelable {
     ctor public Condition(android.net.Uri, String, int);
-    ctor @FlaggedApi("android.app.modes_api") public Condition(@Nullable android.net.Uri, @Nullable String, int, int);
+    ctor public Condition(@Nullable android.net.Uri, @Nullable String, int, int);
     ctor public Condition(android.net.Uri, String, String, String, int, int, int);
-    ctor @FlaggedApi("android.app.modes_api") public Condition(@Nullable android.net.Uri, @Nullable String, @Nullable String, @Nullable String, int, int, int, int);
+    ctor public Condition(@Nullable android.net.Uri, @Nullable String, @Nullable String, @Nullable String, int, int, int, int);
     ctor public Condition(android.os.Parcel);
     method public android.service.notification.Condition copy();
     method public int describeContents();
@@ -42132,10 +42182,10 @@
     field public static final int FLAG_RELEVANT_ALWAYS = 2; // 0x2
     field public static final int FLAG_RELEVANT_NOW = 1; // 0x1
     field public static final String SCHEME = "condition";
-    field @FlaggedApi("android.app.modes_api") public static final int SOURCE_CONTEXT = 3; // 0x3
-    field @FlaggedApi("android.app.modes_api") public static final int SOURCE_SCHEDULE = 2; // 0x2
-    field @FlaggedApi("android.app.modes_api") public static final int SOURCE_UNKNOWN = 0; // 0x0
-    field @FlaggedApi("android.app.modes_api") public static final int SOURCE_USER_ACTION = 1; // 0x1
+    field public static final int SOURCE_CONTEXT = 3; // 0x3
+    field public static final int SOURCE_SCHEDULE = 2; // 0x2
+    field public static final int SOURCE_UNKNOWN = 0; // 0x0
+    field public static final int SOURCE_USER_ACTION = 1; // 0x1
     field public static final int STATE_ERROR = 3; // 0x3
     field public static final int STATE_FALSE = 0; // 0x0
     field public static final int STATE_TRUE = 1; // 0x1
@@ -42145,7 +42195,7 @@
     field public final android.net.Uri id;
     field public final String line1;
     field public final String line2;
-    field @FlaggedApi("android.app.modes_api") public final int source;
+    field public final int source;
     field public final int state;
     field public final String summary;
   }
@@ -42316,7 +42366,7 @@
     field @NonNull public static final android.os.Parcelable.Creator<android.service.notification.StatusBarNotification> CREATOR;
   }
 
-  @FlaggedApi("android.app.modes_api") public final class ZenDeviceEffects implements android.os.Parcelable {
+  public final class ZenDeviceEffects implements android.os.Parcelable {
     method public int describeContents();
     method public boolean shouldDimWallpaper();
     method public boolean shouldDisplayGrayscale();
@@ -42326,7 +42376,7 @@
     field @NonNull public static final android.os.Parcelable.Creator<android.service.notification.ZenDeviceEffects> CREATOR;
   }
 
-  @FlaggedApi("android.app.modes_api") public static final class ZenDeviceEffects.Builder {
+  public static final class ZenDeviceEffects.Builder {
     ctor public ZenDeviceEffects.Builder();
     ctor public ZenDeviceEffects.Builder(@NonNull android.service.notification.ZenDeviceEffects);
     method @NonNull public android.service.notification.ZenDeviceEffects build();
@@ -42348,7 +42398,7 @@
     method public int getPriorityCategoryReminders();
     method public int getPriorityCategoryRepeatCallers();
     method public int getPriorityCategorySystem();
-    method @FlaggedApi("android.app.modes_api") public int getPriorityChannelsAllowed();
+    method public int getPriorityChannelsAllowed();
     method public int getPriorityConversationSenders();
     method public int getPriorityMessageSenders();
     method public int getVisualEffectAmbient();
@@ -42383,7 +42433,7 @@
     method @NonNull public android.service.notification.ZenPolicy.Builder allowEvents(boolean);
     method @NonNull public android.service.notification.ZenPolicy.Builder allowMedia(boolean);
     method @NonNull public android.service.notification.ZenPolicy.Builder allowMessages(int);
-    method @FlaggedApi("android.app.modes_api") @NonNull public android.service.notification.ZenPolicy.Builder allowPriorityChannels(boolean);
+    method @NonNull public android.service.notification.ZenPolicy.Builder allowPriorityChannels(boolean);
     method @NonNull public android.service.notification.ZenPolicy.Builder allowReminders(boolean);
     method @NonNull public android.service.notification.ZenPolicy.Builder allowRepeatCallers(boolean);
     method @NonNull public android.service.notification.ZenPolicy.Builder allowSystem(boolean);
@@ -45121,6 +45171,7 @@
     field public static final String KEY_RTT_UPGRADE_SUPPORTED_BOOL = "rtt_upgrade_supported_bool";
     field public static final String KEY_RTT_UPGRADE_SUPPORTED_FOR_DOWNGRADED_VT_CALL_BOOL = "rtt_upgrade_supported_for_downgraded_vt_call";
     field @FlaggedApi("com.android.internal.telephony.flags.carrier_enabled_satellite_flag") public static final String KEY_SATELLITE_ATTACH_SUPPORTED_BOOL = "satellite_attach_supported_bool";
+    field @FlaggedApi("com.android.internal.telephony.flags.satellite_25q4_apis") public static final String KEY_SATELLITE_CONNECTED_NOTIFICATION_THROTTLE_MILLIS_INT = "satellite_connected_notification_throttle_millis_int";
     field @FlaggedApi("com.android.internal.telephony.flags.carrier_enabled_satellite_flag") public static final String KEY_SATELLITE_CONNECTION_HYSTERESIS_SEC_INT = "satellite_connection_hysteresis_sec_int";
     field @FlaggedApi("com.android.internal.telephony.flags.satellite_system_apis") public static final String KEY_SATELLITE_DATA_SUPPORT_MODE_INT = "satellite_data_support_mode_int";
     field @FlaggedApi("com.android.internal.telephony.flags.satellite_system_apis") public static final String KEY_SATELLITE_DISPLAY_NAME_STRING = "satellite_display_name_string";
@@ -56266,6 +56317,7 @@
     method public android.view.accessibility.AccessibilityNodeInfo getParent();
     method @Nullable public android.view.accessibility.AccessibilityNodeInfo getParent(int);
     method public android.view.accessibility.AccessibilityNodeInfo.RangeInfo getRangeInfo();
+    method @FlaggedApi("android.view.accessibility.a11y_selection_api") @Nullable public android.view.accessibility.AccessibilityNodeInfo.Selection getSelection();
     method @Nullable public CharSequence getStateDescription();
     method @FlaggedApi("android.view.accessibility.supplemental_description") @Nullable public CharSequence getSupplementalDescription();
     method public CharSequence getText();
@@ -56374,6 +56426,7 @@
     method public void setScreenReaderFocusable(boolean);
     method public void setScrollable(boolean);
     method public void setSelected(boolean);
+    method @FlaggedApi("android.view.accessibility.a11y_selection_api") public void setSelection(@Nullable android.view.accessibility.AccessibilityNodeInfo.Selection);
     method public void setShowingHintText(boolean);
     method public void setSource(android.view.View);
     method public void setSource(android.view.View, int);
@@ -56406,6 +56459,7 @@
     field public static final String ACTION_ARGUMENT_ROW_INT = "android.view.accessibility.action.ARGUMENT_ROW_INT";
     field @FlaggedApi("android.view.accessibility.granular_scrolling") public static final String ACTION_ARGUMENT_SCROLL_AMOUNT_FLOAT = "android.view.accessibility.action.ARGUMENT_SCROLL_AMOUNT_FLOAT";
     field public static final String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
+    field @FlaggedApi("android.view.accessibility.a11y_selection_api") public static final String ACTION_ARGUMENT_SELECTION_PARCELABLE = "android.view.accessibility.action.ARGUMENT_SELECTION_PARCELABLE";
     field public static final String ACTION_ARGUMENT_SELECTION_START_INT = "ACTION_ARGUMENT_SELECTION_START_INT";
     field public static final String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE = "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
     field public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 128; // 0x80
@@ -56503,6 +56557,7 @@
     field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_SCROLL_TO_POSITION;
     field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_SCROLL_UP;
     field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_SELECT;
+    field @FlaggedApi("android.view.accessibility.a11y_selection_api") @NonNull public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_SET_EXTENDED_SELECTION;
     field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_SET_PROGRESS;
     field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_SET_SELECTION;
     field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_SET_TEXT;
@@ -56588,6 +56643,26 @@
     field public static final int RANGE_TYPE_PERCENT = 2; // 0x2
   }
 
+  @FlaggedApi("android.view.accessibility.a11y_selection_api") public static final class AccessibilityNodeInfo.Selection implements android.os.Parcelable {
+    ctor public AccessibilityNodeInfo.Selection(@NonNull android.view.accessibility.AccessibilityNodeInfo.SelectionPosition, @NonNull android.view.accessibility.AccessibilityNodeInfo.SelectionPosition);
+    method public int describeContents();
+    method @NonNull public android.view.accessibility.AccessibilityNodeInfo.SelectionPosition getEnd();
+    method @NonNull public android.view.accessibility.AccessibilityNodeInfo.SelectionPosition getStart();
+    method public void writeToParcel(@NonNull android.os.Parcel, int);
+    field @NonNull public static final android.os.Parcelable.Creator<android.view.accessibility.AccessibilityNodeInfo.Selection> CREATOR;
+  }
+
+  @FlaggedApi("android.view.accessibility.a11y_selection_api") public static final class AccessibilityNodeInfo.SelectionPosition implements android.os.Parcelable {
+    ctor public AccessibilityNodeInfo.SelectionPosition(@NonNull android.view.accessibility.AccessibilityNodeInfo, int);
+    ctor public AccessibilityNodeInfo.SelectionPosition(@NonNull android.view.View, int);
+    ctor public AccessibilityNodeInfo.SelectionPosition(@NonNull android.view.View, int, int);
+    method public int describeContents();
+    method @Nullable public android.view.accessibility.AccessibilityNodeInfo getNode();
+    method public int getOffset();
+    method public void writeToParcel(@NonNull android.os.Parcel, int);
+    field @NonNull public static final android.os.Parcelable.Creator<android.view.accessibility.AccessibilityNodeInfo.SelectionPosition> CREATOR;
+  }
+
   public static final class AccessibilityNodeInfo.TouchDelegateInfo implements android.os.Parcelable {
     ctor public AccessibilityNodeInfo.TouchDelegateInfo(@NonNull java.util.Map<android.graphics.Region,android.view.View>);
     method public int describeContents();
diff --git a/core/api/lint-baseline.txt b/core/api/lint-baseline.txt
index e71dffa..577113b 100644
--- a/core/api/lint-baseline.txt
+++ b/core/api/lint-baseline.txt
@@ -1,3 +1,4 @@
+
 // Baseline format: 1.0
 BroadcastBehavior: android.app.AlarmManager#ACTION_NEXT_ALARM_CLOCK_CHANGED:
     Field 'ACTION_NEXT_ALARM_CLOCK_CHANGED' is missing @BroadcastBehavior
@@ -243,8 +244,6 @@
     Field 'ACTION_SUBSCRIPTION_SPECIFIC_CARRIER_IDENTITY_CHANGED' is missing @BroadcastBehavior
 BroadcastBehavior: android.telephony.euicc.EuiccManager#ACTION_NOTIFY_CARRIER_SETUP_INCOMPLETE:
     Field 'ACTION_NOTIFY_CARRIER_SETUP_INCOMPLETE' is missing @BroadcastBehavior
-
-
 DeprecationMismatch: android.accounts.AccountManager#newChooseAccountIntent(android.accounts.Account, java.util.ArrayList<android.accounts.Account>, String[], boolean, String, String, String[], android.os.Bundle):
     Method android.accounts.AccountManager.newChooseAccountIntent(android.accounts.Account, java.util.ArrayList<android.accounts.Account>, String[], boolean, String, String, String[], android.os.Bundle): @Deprecated annotation (present) and @deprecated doc tag (not present) do not match
 DeprecationMismatch: android.app.Activity#enterPictureInPictureMode():
@@ -381,8 +380,6 @@
     Method android.webkit.WebViewDatabase.hasFormData(): @Deprecated annotation (present) and @deprecated doc tag (not present) do not match
 DeprecationMismatch: javax.microedition.khronos.egl.EGL10#eglCreatePixmapSurface(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLConfig, Object, int[]):
     Method javax.microedition.khronos.egl.EGL10.eglCreatePixmapSurface(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLConfig, Object, int[]): @Deprecated annotation (present) and @deprecated doc tag (not present) do not match
-
-
 FlaggedApiLiteral: android.Manifest.permission#BIND_APP_FUNCTION_SERVICE:
     @FlaggedApi contains a string literal, but should reference the field generated by aconfig (android.app.appfunctions.flags.Flags.FLAG_ENABLE_APP_FUNCTION_MANAGER).
 FlaggedApiLiteral: android.Manifest.permission#BIND_TV_AD_SERVICE:
@@ -405,26 +402,22 @@
     @FlaggedApi contains a string literal, but should reference the field generated by aconfig (android.content.pm.Flags.FLAG_SDK_LIB_INDEPENDENCE).
 FlaggedApiLiteral: android.R.attr#supplementalDescription:
     @FlaggedApi contains a string literal, but should reference the field generated by aconfig (android.view.accessibility.Flags.FLAG_SUPPLEMENTAL_DESCRIPTION).
+FlaggedApiLiteral: android.R.id#accessibilityActionSetExtendedSelection:
+    @FlaggedApi contains a string literal, but should reference the field generated by aconfig (android.view.accessibility.Flags.FLAG_A11Y_SELECTION_API).
 FlaggedApiLiteral: android.accessibilityservice.AccessibilityService#OVERLAY_RESULT_INTERNAL_ERROR:
     @FlaggedApi contains a string literal, but should reference the field generated by aconfig (android.view.accessibility.Flags.FLAG_A11Y_OVERLAY_CALLBACKS).
 FlaggedApiLiteral: android.accessibilityservice.AccessibilityService#OVERLAY_RESULT_INVALID:
     @FlaggedApi contains a string literal, but should reference the field generated by aconfig (android.view.accessibility.Flags.FLAG_A11Y_OVERLAY_CALLBACKS).
 FlaggedApiLiteral: android.accessibilityservice.AccessibilityService#OVERLAY_RESULT_SUCCESS:
     @FlaggedApi contains a string literal, but should reference the field generated by aconfig (android.view.accessibility.Flags.FLAG_A11Y_OVERLAY_CALLBACKS).
-
-
 InvalidNullabilityOverride: android.app.Notification.TvExtender#extend(android.app.Notification.Builder) parameter #0:
     Invalid nullability on parameter `builder` in method `extend`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
 InvalidNullabilityOverride: android.media.midi.MidiUmpDeviceService#onBind(android.content.Intent) parameter #0:
     Invalid nullability on parameter `intent` in method `onBind`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
-
-
 KotlinOperator: android.graphics.Matrix44#get(int, int):
     Method can be invoked with an indexing operator from Kotlin: `get` (this is usually desirable; just make sure it makes sense for this type of object)
 KotlinOperator: android.graphics.Matrix44#set(int, int, float):
     Method can be invoked with an indexing operator from Kotlin: `set` (this is usually desirable; just make sure it makes sense for this type of object)
-
-
 MissingGetterMatchingBuilder: android.os.RemoteCallbackList.Builder#setInterfaceDiedCallback(android.os.RemoteCallbackList.Builder.InterfaceDiedCallback<E>):
     android.os.RemoteCallbackList does not declare a `getInterfaceDiedCallback()` method matching method android.os.RemoteCallbackList.Builder.setInterfaceDiedCallback(android.os.RemoteCallbackList.Builder.InterfaceDiedCallback<E>)
 RequiresPermission: android.accounts.AccountManager#getAccountsByTypeAndFeatures(String, String[], android.accounts.AccountManagerCallback<android.accounts.Account[]>, android.os.Handler):
@@ -1117,14 +1110,10 @@
     Method 'setBlockNetworkLoads' documentation mentions permissions without declaring @RequiresPermission
 RequiresPermission: android.webkit.WebSettings#setGeolocationEnabled(boolean):
     Method 'setGeolocationEnabled' documentation mentions permissions without declaring @RequiresPermission
-
-
 Todo: android.hardware.camera2.params.StreamConfigurationMap:
     Documentation mentions 'TODO'
 Todo: android.provider.ContactsContract.RawContacts#newEntityIterator(android.database.Cursor):
     Documentation mentions 'TODO'
-
-
 UnflaggedApi: android.R.color#on_surface_disabled_material:
     New API must be flagged with @FlaggedApi: field android.R.color.on_surface_disabled_material
 UnflaggedApi: android.R.color#outline_disabled_material:
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index 76cce74..03607d4 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -7,7 +7,7 @@
     field public static final String ACCESS_BROADCAST_RADIO = "android.permission.ACCESS_BROADCAST_RADIO";
     field public static final String ACCESS_BROADCAST_RESPONSE_STATS = "android.permission.ACCESS_BROADCAST_RESPONSE_STATS";
     field public static final String ACCESS_CACHE_FILESYSTEM = "android.permission.ACCESS_CACHE_FILESYSTEM";
-    field @FlaggedApi("android.app.contextualsearch.flags.enable_service") public static final String ACCESS_CONTEXTUAL_SEARCH = "android.permission.ACCESS_CONTEXTUAL_SEARCH";
+    field public static final String ACCESS_CONTEXTUAL_SEARCH = "android.permission.ACCESS_CONTEXTUAL_SEARCH";
     field public static final String ACCESS_CONTEXT_HUB = "android.permission.ACCESS_CONTEXT_HUB";
     field public static final String ACCESS_DRM_CERTIFICATES = "android.permission.ACCESS_DRM_CERTIFICATES";
     field @FlaggedApi("android.permission.flags.fine_power_monitor_permission") public static final String ACCESS_FINE_POWER_MONITORS = "android.permission.ACCESS_FINE_POWER_MONITORS";
@@ -151,6 +151,8 @@
     field @FlaggedApi("android.content.pm.emergency_install_permission") public static final String EMERGENCY_INSTALL_PACKAGES = "android.permission.EMERGENCY_INSTALL_PACKAGES";
     field public static final String ENTER_CAR_MODE_PRIORITIZED = "android.permission.ENTER_CAR_MODE_PRIORITIZED";
     field public static final String EXEMPT_FROM_AUDIO_RECORD_RESTRICTIONS = "android.permission.EXEMPT_FROM_AUDIO_RECORD_RESTRICTIONS";
+    field @FlaggedApi("android.xr.xr_manifest_entries") public static final String EYE_CALIBRATION = "android.permission.EYE_CALIBRATION";
+    field @FlaggedApi("android.xr.xr_manifest_entries") public static final String FACE_TRACKING_CALIBRATION = "android.permission.FACE_TRACKING_CALIBRATION";
     field public static final String FORCE_BACK = "android.permission.FORCE_BACK";
     field public static final String FORCE_STOP_PACKAGES = "android.permission.FORCE_STOP_PACKAGES";
     field public static final String GET_APP_METADATA = "android.permission.GET_APP_METADATA";
@@ -168,6 +170,7 @@
     field public static final String HARDWARE_TEST = "android.permission.HARDWARE_TEST";
     field public static final String HDMI_CEC = "android.permission.HDMI_CEC";
     field @Deprecated public static final String HIDE_NON_SYSTEM_OVERLAY_WINDOWS = "android.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS";
+    field @FlaggedApi("android.xr.xr_manifest_entries") public static final String IMPORT_XR_ANCHOR = "android.permission.IMPORT_XR_ANCHOR";
     field public static final String INJECT_EVENTS = "android.permission.INJECT_EVENTS";
     field @FlaggedApi("android.content.pm.sdk_dependency_installer") public static final String INSTALL_DEPENDENCY_SHARED_LIBRARIES = "android.permission.INSTALL_DEPENDENCY_SHARED_LIBRARIES";
     field public static final String INSTALL_DPC_PACKAGES = "android.permission.INSTALL_DPC_PACKAGES";
@@ -450,6 +453,7 @@
     field public static final String WRITE_SECURITY_LOG = "android.permission.WRITE_SECURITY_LOG";
     field public static final String WRITE_SMS = "android.permission.WRITE_SMS";
     field @FlaggedApi("android.provider.user_keys") public static final String WRITE_VERIFICATION_STATE_E2EE_CONTACT_KEYS = "android.permission.WRITE_VERIFICATION_STATE_E2EE_CONTACT_KEYS";
+    field @FlaggedApi("android.xr.xr_manifest_entries") public static final String XR_TRACKING_IN_BACKGROUND = "android.permission.XR_TRACKING_IN_BACKGROUND";
   }
 
   public static final class Manifest.permission_group {
@@ -2231,7 +2235,7 @@
     field @NonNull public static final android.os.Parcelable.Creator<android.app.contextualsearch.CallbackToken> CREATOR;
   }
 
-  public final class ContextualSearchManager {
+  @FlaggedApi("android.app.contextualsearch.flags.self_invocation") 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
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index e8ff546..85b65bb 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -393,25 +393,25 @@
   }
 
   public class NotificationManager {
-    method @FlaggedApi("android.app.modes_api") @NonNull public String addAutomaticZenRule(@NonNull android.app.AutomaticZenRule, boolean);
+    method @NonNull public String addAutomaticZenRule(@NonNull android.app.AutomaticZenRule, boolean);
     method @FlaggedApi("android.service.notification.notification_classification") public void allowAssistantAdjustment(@NonNull String);
     method public void cleanUpCallersAfter(long);
     method @FlaggedApi("android.service.notification.notification_classification") public void disallowAssistantAdjustment(@NonNull String);
-    method @FlaggedApi("android.app.modes_api") @NonNull public android.service.notification.ZenPolicy getDefaultZenPolicy();
+    method @NonNull public android.service.notification.ZenPolicy getDefaultZenPolicy();
     method public android.content.ComponentName getEffectsSuppressor();
     method @FlaggedApi("android.service.notification.notification_classification") @NonNull public java.util.Set<java.lang.String> getUnsupportedAdjustmentTypes();
     method public boolean isNotificationPolicyAccessGrantedForPackage(@NonNull String);
-    method @FlaggedApi("android.app.modes_api") public boolean removeAutomaticZenRule(@NonNull String, boolean);
+    method public boolean removeAutomaticZenRule(@NonNull String, boolean);
     method @FlaggedApi("android.service.notification.notification_classification") public void setAssistantAdjustmentKeyTypeState(int, boolean);
     method @FlaggedApi("android.app.api_rich_ongoing") public void setCanPostPromotedNotifications(@NonNull String, int, boolean);
     method @RequiresPermission(android.Manifest.permission.MANAGE_NOTIFICATION_LISTENERS) public void setNotificationListenerAccessGranted(@NonNull android.content.ComponentName, boolean, boolean);
     method @RequiresPermission(android.Manifest.permission.MANAGE_TOAST_RATE_LIMITING) public void setToastRateLimitingEnabled(boolean);
-    method @FlaggedApi("android.app.modes_api") public boolean updateAutomaticZenRule(@NonNull String, @NonNull android.app.AutomaticZenRule, boolean);
+    method public boolean updateAutomaticZenRule(@NonNull String, @NonNull android.app.AutomaticZenRule, boolean);
     method public void updateNotificationChannel(@NonNull String, int, @NonNull android.app.NotificationChannel);
   }
 
   public static class NotificationManager.Policy implements android.os.Parcelable {
-    method @FlaggedApi("android.app.modes_api") public boolean allowPriorityChannels();
+    method public boolean allowPriorityChannels();
   }
 
   public final class PendingIntent implements android.os.Parcelable {
@@ -478,8 +478,8 @@
     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 @Deprecated public boolean injectInputEvent(@NonNull android.view.InputEvent, boolean, boolean);
+    method @Deprecated 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);
@@ -490,15 +490,15 @@
   }
 
   public class UiModeManager {
-    method @FlaggedApi("android.app.modes_api") @RequiresPermission(android.Manifest.permission.MODIFY_DAY_NIGHT_MODE) public int getAttentionModeThemeOverlay();
+    method @RequiresPermission(android.Manifest.permission.MODIFY_DAY_NIGHT_MODE) public int getAttentionModeThemeOverlay();
     method public boolean isNightModeLocked();
     method public boolean isUiModeLocked();
     method @RequiresPermission(value=android.Manifest.permission.TOGGLE_AUTOMOTIVE_PROJECTION, conditional=true) public boolean releaseProjection(int);
     method @RequiresPermission(value=android.Manifest.permission.TOGGLE_AUTOMOTIVE_PROJECTION, conditional=true) public boolean requestProjection(int);
-    field @FlaggedApi("android.app.modes_api") public static final int MODE_ATTENTION_THEME_OVERLAY_DAY = 1002; // 0x3ea
-    field @FlaggedApi("android.app.modes_api") public static final int MODE_ATTENTION_THEME_OVERLAY_NIGHT = 1001; // 0x3e9
-    field @FlaggedApi("android.app.modes_api") public static final int MODE_ATTENTION_THEME_OVERLAY_OFF = 1000; // 0x3e8
-    field @FlaggedApi("android.app.modes_api") public static final int MODE_ATTENTION_THEME_OVERLAY_UNKNOWN = -1; // 0xffffffff
+    field public static final int MODE_ATTENTION_THEME_OVERLAY_DAY = 1002; // 0x3ea
+    field public static final int MODE_ATTENTION_THEME_OVERLAY_NIGHT = 1001; // 0x3e9
+    field public static final int MODE_ATTENTION_THEME_OVERLAY_OFF = 1000; // 0x3e8
+    field public static final int MODE_ATTENTION_THEME_OVERLAY_UNKNOWN = -1; // 0xffffffff
     field public static final int PROJECTION_TYPE_ALL = -1; // 0xffffffff
     field public static final int PROJECTION_TYPE_AUTOMOTIVE = 1; // 0x1
     field public static final int PROJECTION_TYPE_NONE = 0; // 0x0
@@ -1716,7 +1716,7 @@
   }
 
   public final class ColorDisplayManager {
-    method @FlaggedApi("android.app.modes_api") @RequiresPermission(android.Manifest.permission.CONTROL_DISPLAY_COLOR_TRANSFORMS) public boolean isSaturationActivated();
+    method @RequiresPermission(android.Manifest.permission.CONTROL_DISPLAY_COLOR_TRANSFORMS) public boolean isSaturationActivated();
   }
 
   public final class DisplayManager {
@@ -1806,17 +1806,17 @@
   }
 
   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 public static int getAccessibilityBounceKeysThreshold(@NonNull android.content.Context);
+    method public static int getAccessibilitySlowKeysThreshold(@NonNull android.content.Context);
     method @FlaggedApi("com.android.input.flags.keyboard_repeat_keys") public static int getRepeatKeysDelay(@NonNull android.content.Context);
     method @FlaggedApi("com.android.input.flags.keyboard_repeat_keys") public static int getRepeatKeysTimeout(@NonNull android.content.Context);
     method @FlaggedApi("com.android.hardware.input.keyboard_a11y_mouse_keys") public static boolean isAccessibilityMouseKeysEnabled(@NonNull android.content.Context);
-    method @FlaggedApi("com.android.hardware.input.keyboard_a11y_sticky_keys_flag") public static boolean isAccessibilityStickyKeysEnabled(@NonNull android.content.Context);
+    method public static boolean isAccessibilityStickyKeysEnabled(@NonNull android.content.Context);
     method @FlaggedApi("com.android.input.flags.keyboard_repeat_keys") public static boolean isRepeatKeysEnabled(@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 @RequiresPermission(android.Manifest.permission.WRITE_SETTINGS) public static void setAccessibilityBounceKeysThreshold(@NonNull android.content.Context, int);
     method @FlaggedApi("com.android.hardware.input.keyboard_a11y_mouse_keys") @RequiresPermission(android.Manifest.permission.WRITE_SETTINGS) public static void setAccessibilityMouseKeysEnabled(@NonNull android.content.Context, boolean);
-    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_SETTINGS) public static void setAccessibilitySlowKeysThreshold(@NonNull android.content.Context, int);
+    method @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);
     method @FlaggedApi("com.android.input.flags.keyboard_repeat_keys") @RequiresPermission(android.Manifest.permission.WRITE_SETTINGS) public static void setRepeatKeysDelay(@NonNull android.content.Context, int);
     method @FlaggedApi("com.android.input.flags.keyboard_repeat_keys") @RequiresPermission(android.Manifest.permission.WRITE_SETTINGS) public static void setRepeatKeysEnabled(@NonNull android.content.Context, boolean);
@@ -3237,16 +3237,16 @@
     method @Deprecated public boolean isBound();
   }
 
-  @FlaggedApi("android.app.modes_api") public final class ZenDeviceEffects implements android.os.Parcelable {
+  public final class ZenDeviceEffects implements android.os.Parcelable {
     method @NonNull public java.util.Set<java.lang.String> getExtraEffects();
   }
 
-  @FlaggedApi("android.app.modes_api") public static final class ZenDeviceEffects.Builder {
+  public static final class ZenDeviceEffects.Builder {
     method @NonNull public android.service.notification.ZenDeviceEffects.Builder setExtraEffects(@NonNull java.util.Set<java.lang.String>);
   }
 
   public final class ZenPolicy implements android.os.Parcelable {
-    method @FlaggedApi("android.app.modes_api") @NonNull public android.service.notification.ZenPolicy overwrittenWith(@Nullable android.service.notification.ZenPolicy);
+    method @NonNull public android.service.notification.ZenPolicy overwrittenWith(@Nullable android.service.notification.ZenPolicy);
   }
 
   public static final class ZenPolicy.Builder {
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 2d7ed46..f63170a 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -104,6 +104,7 @@
 import android.content.res.AssetManager;
 import android.content.res.CompatibilityInfo;
 import android.content.res.Configuration;
+import android.content.res.ResourceTimer;
 import android.content.res.Resources;
 import android.content.res.ResourcesImpl;
 import android.content.res.loader.ResourcesLoader;
@@ -5283,6 +5284,7 @@
 
             Resources.dumpHistory(pw, "");
             pw.flush();
+            ResourceTimer.dumpTimers(info.fd.getFileDescriptor(), "-refresh");
             if (info.finishCallback != null) {
                 info.finishCallback.sendResult(null);
             }
diff --git a/core/java/android/app/AutomaticZenRule.java b/core/java/android/app/AutomaticZenRule.java
index 9d1d9c7..fa977c9 100644
--- a/core/java/android/app/AutomaticZenRule.java
+++ b/core/java/android/app/AutomaticZenRule.java
@@ -19,7 +19,6 @@
 import static com.android.internal.util.Preconditions.checkArgument;
 
 import android.annotation.DrawableRes;
-import android.annotation.FlaggedApi;
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
@@ -52,48 +51,40 @@
      * and the value returned if the true type was added in an API level higher than the calling
      * app's targetSdk.
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int TYPE_UNKNOWN = -1;
     /**
      * Rule is of a known type, but not one of the specific types.
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int TYPE_OTHER = 0;
     /**
      * The type for rules triggered according to a time-based schedule.
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int TYPE_SCHEDULE_TIME = 1;
     /**
      * The type for rules triggered by calendar events.
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int TYPE_SCHEDULE_CALENDAR = 2;
     /**
      * The type for rules triggered by bedtime/sleeping, like time of day, or snore detection.
      *
      * <p>Only the 'Wellbeing' app may own rules of this type.
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int TYPE_BEDTIME = 3;
     /**
      * The type for rules triggered by driving detection, like Bluetooth connections or vehicle
      * sounds.
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int TYPE_DRIVING = 4;
     /**
      * The type for rules triggered by the user entering an immersive activity, like opening an app
      * using {@link WindowInsetsController#hide(int)}.
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int TYPE_IMMERSIVE = 5;
     /**
      * The type for rules that have a {@link ZenPolicy} that implies that the
      * device should not make sound and potentially hide some visual effects; may be triggered
      * when entering a location where silence is requested, like a theater.
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int TYPE_THEATER = 6;
     /**
      * The type for rules created and managed by a device owner. These rules may not be fully
@@ -101,7 +92,6 @@
      *
      * <p>Only a 'Device Owner' app may own rules of this type.
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int TYPE_MANAGED = 7;
 
     /** @hide */
@@ -127,17 +117,14 @@
     /**
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int FIELD_NAME = 1 << 0;
     /**
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int FIELD_INTERRUPTION_FILTER = 1 << 1;
     /**
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int FIELD_ICON = 1 << 2;
 
     private boolean enabled;
@@ -149,10 +136,8 @@
     private long creationTime;
     private ZenPolicy mZenPolicy;
     private ZenDeviceEffects mDeviceEffects;
-    // TODO: b/310620812 - Remove this once FLAG_MODES_API is inlined.
-    private boolean mModified = false;
     private String mPkg;
-    private int mType = Flags.modesApi() ? TYPE_UNKNOWN : 0;
+    private int mType = TYPE_UNKNOWN;
     private int mIconResId;
     private String mTriggerDescription;
     private boolean mAllowManualInvocation;
@@ -229,8 +214,10 @@
 
     /**
      * @hide
+     * @deprecated Do not add new usages; will be removed soon.
      */
-    // TODO: b/310620812 - Remove when the flag is inlined (all system callers should use Builder).
+    // TODO: b/368247671 - Remove when modes_ui is inlined (remaining usages are in obsolete tests)
+    @Deprecated
     public AutomaticZenRule(String name, ComponentName owner, ComponentName configurationActivity,
             Uri conditionId, ZenPolicy policy, int interruptionFilter, boolean enabled,
             long creationTime) {
@@ -251,15 +238,12 @@
                 source.readParcelable(null, android.content.ComponentName.class));
         creationTime = source.readLong();
         mZenPolicy = source.readParcelable(null, ZenPolicy.class);
-        mModified = source.readInt() == ENABLED;
         mPkg = source.readString();
-        if (Flags.modesApi()) {
-            mDeviceEffects = source.readParcelable(null, ZenDeviceEffects.class);
-            mAllowManualInvocation = source.readBoolean();
-            mIconResId = source.readInt();
-            mTriggerDescription = getTrimmedString(source.readString(), MAX_DESC_LENGTH);
-            mType = source.readInt();
-        }
+        mDeviceEffects = source.readParcelable(null, ZenDeviceEffects.class);
+        mAllowManualInvocation = source.readBoolean();
+        mIconResId = source.readInt();
+        mTriggerDescription = getTrimmedString(source.readString(), MAX_DESC_LENGTH);
+        mType = source.readInt();
     }
 
     /**
@@ -306,15 +290,6 @@
     }
 
     /**
-     * Returns whether this rule's name has been modified by the user.
-     * @hide
-     */
-    // TODO: b/310620812 - Consider removing completely. Seems not be used anywhere except tests.
-    public boolean isModified() {
-        return mModified;
-    }
-
-    /**
      * Gets the {@link ZenPolicy} applied if {@link #getInterruptionFilter()} is
      * {@link NotificationManager#INTERRUPTION_FILTER_PRIORITY}.
      */
@@ -325,7 +300,6 @@
 
     /** Gets the {@link ZenDeviceEffects} of this rule. */
     @Nullable
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public ZenDeviceEffects getDeviceEffects() {
         return mDeviceEffects;
     }
@@ -378,14 +352,6 @@
     }
 
     /**
-     * Sets modified state of this rule.
-     * @hide
-     */
-    public void setModified(boolean modified) {
-        this.mModified = modified;
-    }
-
-    /**
      * Sets the {@link ZenPolicy} applied if {@link #getInterruptionFilter()} is
      * {@link NotificationManager#INTERRUPTION_FILTER_PRIORITY}.
      *
@@ -404,7 +370,6 @@
      * <p>When updating an existing rule via {@link NotificationManager#updateAutomaticZenRule},
      * a {@code null} value here means the previous set of effects is retained.
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public void setDeviceEffects(@Nullable ZenDeviceEffects deviceEffects) {
         mDeviceEffects = deviceEffects;
     }
@@ -458,7 +423,6 @@
     /**
      * Gets the type of the rule.
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public @Type int getType() {
         return mType;
     }
@@ -467,7 +431,6 @@
      * Sets the type of the rule.
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public void setType(@Type int type) {
         mType = checkValidType(type);
     }
@@ -476,7 +439,6 @@
      * Gets the user visible description of when this rule is active
      * (see {@link Condition#STATE_TRUE}).
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public @Nullable String getTriggerDescription() {
         return mTriggerDescription;
     }
@@ -489,7 +451,6 @@
      * "When connected to [Car Name]".
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public void setTriggerDescription(@Nullable String triggerDescription) {
         mTriggerDescription = triggerDescription;
     }
@@ -497,7 +458,6 @@
     /**
      * Gets the resource id of the drawable icon for this rule.
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public @DrawableRes int getIconResId() {
         return mIconResId;
     }
@@ -506,7 +466,6 @@
      * Sets a resource id of a tintable vector drawable representing the rule in image form.
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public void setIconResId(int iconResId) {
         mIconResId = iconResId;
     }
@@ -515,7 +474,6 @@
      * Gets whether this rule can be manually activated by the user even when the triggering
      * condition for the rule is not met.
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public boolean isManualInvocationAllowed() {
         return mAllowManualInvocation;
     }
@@ -525,23 +483,18 @@
      * condition for the rule is not met.
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public void setManualInvocationAllowed(boolean allowManualInvocation) {
         mAllowManualInvocation = allowManualInvocation;
     }
 
     /** @hide */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public void validate() {
-        if (Flags.modesApi()) {
-            checkValidType(mType);
-            if (mDeviceEffects != null) {
-                mDeviceEffects.validate();
-            }
+        checkValidType(mType);
+        if (mDeviceEffects != null) {
+            mDeviceEffects.validate();
         }
     }
 
-    @FlaggedApi(Flags.FLAG_MODES_API)
     @Type
     private static int checkValidType(@Type int type) {
         checkArgument(type >= TYPE_UNKNOWN && type <= TYPE_MANAGED,
@@ -571,39 +524,34 @@
         dest.writeParcelable(configurationActivity, 0);
         dest.writeLong(creationTime);
         dest.writeParcelable(mZenPolicy, 0);
-        dest.writeInt(mModified ? ENABLED : DISABLED);
         dest.writeString(mPkg);
-        if (Flags.modesApi()) {
-            dest.writeParcelable(mDeviceEffects, 0);
-            dest.writeBoolean(mAllowManualInvocation);
-            dest.writeInt(mIconResId);
-            dest.writeString(mTriggerDescription);
-            dest.writeInt(mType);
-        }
+        dest.writeParcelable(mDeviceEffects, 0);
+        dest.writeBoolean(mAllowManualInvocation);
+        dest.writeInt(mIconResId);
+        dest.writeString(mTriggerDescription);
+        dest.writeInt(mType);
     }
 
     @Override
     public String toString() {
-        StringBuilder sb = new StringBuilder(AutomaticZenRule.class.getSimpleName()).append('[')
+        return new StringBuilder(AutomaticZenRule.class.getSimpleName())
+                .append('[')
                 .append("enabled=").append(enabled)
                 .append(",name=").append(name)
+                .append(",type=").append(mType)
                 .append(",interruptionFilter=").append(interruptionFilter)
                 .append(",pkg=").append(mPkg)
                 .append(",conditionId=").append(conditionId)
                 .append(",owner=").append(owner)
                 .append(",configActivity=").append(configurationActivity)
                 .append(",creationTime=").append(creationTime)
-                .append(",mZenPolicy=").append(mZenPolicy);
-
-        if (Flags.modesApi()) {
-            sb.append(",deviceEffects=").append(mDeviceEffects)
-                    .append(",allowManualInvocation=").append(mAllowManualInvocation)
-                    .append(",iconResId=").append(mIconResId)
-                    .append(",triggerDescription=").append(mTriggerDescription)
-                    .append(",type=").append(mType);
-        }
-
-        return sb.append(']').toString();
+                .append(",mZenPolicy=").append(mZenPolicy)
+                .append(",deviceEffects=").append(mDeviceEffects)
+                .append(",allowManualInvocation=").append(mAllowManualInvocation)
+                .append(",iconResId=").append(mIconResId)
+                .append(",triggerDescription=").append(mTriggerDescription)
+                .append(']')
+                .toString();
     }
 
     /** @hide */
@@ -626,8 +574,7 @@
         if (!(o instanceof AutomaticZenRule)) return false;
         if (o == this) return true;
         final AutomaticZenRule other = (AutomaticZenRule) o;
-        boolean finalEquals = other.enabled == enabled
-                && other.mModified == mModified
+        return other.enabled == enabled
                 && Objects.equals(other.name, name)
                 && other.interruptionFilter == interruptionFilter
                 && Objects.equals(other.conditionId, conditionId)
@@ -635,27 +582,19 @@
                 && Objects.equals(other.mZenPolicy, mZenPolicy)
                 && Objects.equals(other.configurationActivity, configurationActivity)
                 && Objects.equals(other.mPkg, mPkg)
-                && other.creationTime == creationTime;
-        if (Flags.modesApi()) {
-            return finalEquals
-                    && Objects.equals(other.mDeviceEffects, mDeviceEffects)
-                    && other.mAllowManualInvocation == mAllowManualInvocation
-                    && other.mIconResId == mIconResId
-                    && Objects.equals(other.mTriggerDescription, mTriggerDescription)
-                    && other.mType == mType;
-        }
-        return finalEquals;
+                && other.creationTime == creationTime
+                && Objects.equals(other.mDeviceEffects, mDeviceEffects)
+                && other.mAllowManualInvocation == mAllowManualInvocation
+                && other.mIconResId == mIconResId
+                && Objects.equals(other.mTriggerDescription, mTriggerDescription)
+                && other.mType == mType;
     }
 
     @Override
     public int hashCode() {
-        if (Flags.modesApi()) {
-            return Objects.hash(enabled, name, interruptionFilter, conditionId, owner,
-                    configurationActivity, mZenPolicy, mDeviceEffects, mModified, creationTime,
-                    mPkg, mAllowManualInvocation, mIconResId, mTriggerDescription, mType);
-        }
         return Objects.hash(enabled, name, interruptionFilter, conditionId, owner,
-                configurationActivity, mZenPolicy, mModified, creationTime, mPkg);
+                configurationActivity, mZenPolicy, mDeviceEffects, creationTime,
+                mPkg, mAllowManualInvocation, mIconResId, mTriggerDescription, mType);
     }
 
     public static final @android.annotation.NonNull Parcelable.Creator<AutomaticZenRule> CREATOR
@@ -705,7 +644,6 @@
         return input;
     }
 
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final class Builder {
         private String mName;
         private ComponentName mOwner;
diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl
index 6fedcbe..00df724 100644
--- a/core/java/android/app/INotificationManager.aidl
+++ b/core/java/android/app/INotificationManager.aidl
@@ -126,6 +126,7 @@
     boolean areChannelsBypassingDnd();
     ParceledListSlice getNotificationChannelsBypassingDnd(String pkg, int uid);
     ParceledListSlice getPackagesBypassingDnd(int userId);
+    List<String> getPackagesWithAnyChannels(int userId);
     boolean isPackagePaused(String pkg);
     void deleteNotificationHistoryItem(String pkg, int uid, long postedTime);
     boolean isPermissionFixed(String pkg, int userId);
@@ -224,8 +225,6 @@
     ZenPolicy getDefaultZenPolicy();
     AutomaticZenRule getAutomaticZenRule(String id);
     Map<String, AutomaticZenRule> getAutomaticZenRules();
-    // TODO: b/310620812 - Remove getZenRules() when MODES_API is inlined.
-    List<ZenModeConfig.ZenRule> getZenRules();
     String addAutomaticZenRule(in AutomaticZenRule automaticZenRule, String pkg, boolean fromUser);
     boolean updateAutomaticZenRule(String id, in AutomaticZenRule automaticZenRule, boolean fromUser);
     boolean removeAutomaticZenRule(String id, boolean fromUser);
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index dce15b8..0ca4a32 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -11204,10 +11204,15 @@
      * </pre>
      *
      *
-     *
+     * <p>
      * NOTE: The progress bar layout will be mirrored for RTL layout.
+     * </p>
+     *
+     * <p>
      * NOTE: The extras set by {@link Notification.Builder#setProgress} will be overridden by
-     * the values set on this style object when the notification is built.
+     * the values set on this style object when the notification is built.  Therefore, that method
+     * is not used with this style.
+     * </p>
      *
      */
     @FlaggedApi(Flags.FLAG_API_RICH_ONGOING)
@@ -11370,7 +11375,7 @@
             if (mProgressPoints == null) {
                 mProgressPoints = new ArrayList<>();
             }
-            if (point.getPosition() >= 0) {
+            if (point.getPosition() > 0) {
                 mProgressPoints.add(point);
 
                 if (mProgressPoints.size() > MAX_PROGRESS_POINT_LIMIT) {
@@ -11379,7 +11384,7 @@
                 }
 
             } else {
-                Log.w(TAG, "Dropped the point. The position is a negative integer.");
+                Log.w(TAG, "Dropped the point. The position is a negative or zero integer.");
             }
 
             return this;
@@ -11893,7 +11898,9 @@
                 final List<Point> points = new ArrayList<>();
                 for (Point point : mProgressPoints) {
                     final int position = point.getPosition();
-                    if (position < 0 || position > totalLength) continue;
+                    // The points at start/end aren't supposed to show in the progress bar.
+                    // Therefore those are also dropped here.
+                    if (position <= 0 || position >= totalLength) continue;
                     points.add(sanitizePoint(point, backgroundColor, defaultProgressColor));
                     if (points.size() == MAX_PROGRESS_POINT_LIMIT) {
                         break;
diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java
index 00f896d..726999a 100644
--- a/core/java/android/app/NotificationManager.java
+++ b/core/java/android/app/NotificationManager.java
@@ -356,7 +356,6 @@
      * a DND component, the rule owner should activate any extra behavior that's part of that mode
      * in response to this broadcast.
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int AUTOMATIC_RULE_STATUS_ACTIVATED = 4;
 
     /**
@@ -367,7 +366,6 @@
      * longer met) and then {@link Condition#STATE_TRUE} when the trigger criteria is freshly met,
      * or when the user re-activates it.
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int AUTOMATIC_RULE_STATUS_DEACTIVATED = 5;
 
     /**
@@ -415,7 +413,6 @@
      * <p>This broadcast is only sent to registered receivers and receivers in packages that have
      * been granted Notification Policy access (see {@link #isNotificationPolicyAccessGranted()}).
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_CONSOLIDATED_NOTIFICATION_POLICY_CHANGED =
             "android.app.action.CONSOLIDATED_NOTIFICATION_POLICY_CHANGED";
@@ -425,7 +422,6 @@
      * {@link #ACTION_CONSOLIDATED_NOTIFICATION_POLICY_CHANGED} containing the new
      * {@link Policy} value.
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final String EXTRA_NOTIFICATION_POLICY =
             "android.app.extra.NOTIFICATION_POLICY";
 
@@ -1726,9 +1722,8 @@
      * rule management to system settings/uis via
      * {@link Settings#ACTION_AUTOMATIC_ZEN_RULE_SETTINGS}.
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public boolean areAutomaticZenRulesUserManaged() {
-        if (Flags.modesApi() && Flags.modesUi()) {
+        if (Flags.modesUi()) {
             PackageManager pm = mContext.getPackageManager();
             return !pm.hasSystemFeature(PackageManager.FEATURE_WATCH)
                     && !pm.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)
@@ -1748,21 +1743,7 @@
     public Map<String, AutomaticZenRule> getAutomaticZenRules() {
         INotificationManager service = service();
         try {
-            if (Flags.modesApi()) {
-                return service.getAutomaticZenRules();
-            } else {
-                List<ZenModeConfig.ZenRule> rules = service.getZenRules();
-                Map<String, AutomaticZenRule> ruleMap = new HashMap<>();
-                for (ZenModeConfig.ZenRule rule : rules) {
-                    AutomaticZenRule azr = new AutomaticZenRule(rule.name, rule.component,
-                            rule.configurationActivity, rule.conditionId, rule.zenPolicy,
-                            zenModeToInterruptionFilter(rule.zenMode), rule.enabled,
-                            rule.creationTime);
-                    azr.setPackageName(rule.pkg);
-                    ruleMap.put(rule.id, azr);
-                }
-                return ruleMap;
-            }
+            return service.getAutomaticZenRules();
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -1804,7 +1785,6 @@
 
     /** @hide */
     @TestApi
-    @FlaggedApi(Flags.FLAG_MODES_API)
     @NonNull
     public String addAutomaticZenRule(@NonNull AutomaticZenRule automaticZenRule,
             boolean fromUser) {
@@ -1840,7 +1820,6 @@
 
     /** @hide */
     @TestApi
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public boolean updateAutomaticZenRule(@NonNull String id,
             @NonNull AutomaticZenRule automaticZenRule, boolean fromUser) {
         INotificationManager service = service();
@@ -1860,7 +1839,6 @@
      * @param id The id of the rule
      * @return the state of the rule.
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     @Condition.State
     public int getAutomaticZenRuleState(@NonNull String id) {
         INotificationManager service = service();
@@ -1935,7 +1913,6 @@
 
     /** @hide */
     @TestApi
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public boolean removeAutomaticZenRule(@NonNull String id, boolean fromUser) {
         INotificationManager service = service();
         try {
@@ -2326,7 +2303,6 @@
      * @hide
      */
     @TestApi
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public @NonNull ZenPolicy getDefaultZenPolicy() {
         INotificationManager service = service();
         try {
@@ -2693,7 +2669,7 @@
         /**
          * @hide
          */
-        public static final int STATE_CHANNELS_BYPASSING_DND = 1 << 0;
+        public static final int STATE_HAS_PRIORITY_CHANNELS = 1 << 0;
 
         /**
          * Whether the policy indicates that even priority channels are NOT permitted to bypass DND.
@@ -2918,7 +2894,7 @@
 
         @Override
         public String toString() {
-            StringBuilder sb = new StringBuilder().append("NotificationManager.Policy[")
+            return new StringBuilder().append("NotificationManager.Policy[")
                     .append("priorityCategories=")
                     .append(priorityCategoriesToString(priorityCategories))
                     .append(",priorityCallSenders=")
@@ -2928,24 +2904,19 @@
                     .append(",priorityConvSenders=")
                     .append(conversationSendersToString(priorityConversationSenders))
                     .append(",suppressedVisualEffects=")
-                    .append(suppressedEffectsToString(suppressedVisualEffects));
-            if (Flags.modesApi()) {
-                sb.append(",hasPriorityChannels=");
-            } else {
-                sb.append(",areChannelsBypassingDnd=");
-            }
-            sb.append((state == STATE_UNSET
-                    ? "unset"
-                    : ((state & STATE_CHANNELS_BYPASSING_DND) != 0)
-                            ? "true"
-                            : "false"));
-            if (Flags.modesApi()) {
-                sb.append(",allowPriorityChannels=")
-                        .append((state == STATE_UNSET
-                                ? "unset"
-                                : (allowPriorityChannels() ? "true" : "false")));
-            }
-            return sb.append("]").toString();
+                    .append(suppressedEffectsToString(suppressedVisualEffects))
+                    .append(",hasPriorityChannels=")
+                    .append((state == STATE_UNSET
+                            ? "unset"
+                            : ((state & STATE_HAS_PRIORITY_CHANNELS) != 0)
+                                    ? "true"
+                                    : "false"))
+                    .append(",allowPriorityChannels=")
+                    .append((state == STATE_UNSET
+                            ? "unset"
+                            : (allowPriorityChannels() ? "true" : "false")))
+                    .append("]")
+                    .toString();
         }
 
         /** @hide */
@@ -3220,7 +3191,6 @@
         }
 
         /** @hide **/
-        @FlaggedApi(Flags.FLAG_MODES_API)
         @TestApi // so CTS tests can read this state without having to use implementation detail
         public boolean allowPriorityChannels() {
             if (state == STATE_UNSET) {
@@ -3230,17 +3200,15 @@
         }
 
         /** @hide */
-        @FlaggedApi(Flags.FLAG_MODES_API)
         public boolean hasPriorityChannels() {
-            return (state & STATE_CHANNELS_BYPASSING_DND) != 0;
+            return (state & STATE_HAS_PRIORITY_CHANNELS) != 0;
         }
 
         /** @hide **/
-        @FlaggedApi(Flags.FLAG_MODES_API)
         public static int policyState(boolean hasPriorityChannels, boolean allowPriorityChannels) {
             int state = 0;
             if (hasPriorityChannels) {
-                state |= STATE_CHANNELS_BYPASSING_DND;
+                state |= STATE_HAS_PRIORITY_CHANNELS;
             }
             if (!allowPriorityChannels) {
                 state |= STATE_PRIORITY_CHANNELS_BLOCKED;
diff --git a/core/java/android/app/UiAutomation.java b/core/java/android/app/UiAutomation.java
index 7b63ab8..464bcc0 100644
--- a/core/java/android/app/UiAutomation.java
+++ b/core/java/android/app/UiAutomation.java
@@ -956,10 +956,9 @@
      * <p>
      * <strong>Note:</strong> It is caller's responsibility to recycle the event.
      * </p>
-     *
-     * @param event The event to inject.
-     * @param sync Whether to inject the event synchronously.
-     * @return Whether event injection succeeded.
+     * @param event the event to inject
+     * @param sync whether to inject the event synchronously
+     * @return {@code true} if event injection succeeded
      */
     public boolean injectInputEvent(InputEvent event, boolean sync) {
         return injectInputEvent(event, sync, true /* waitForAnimations */);
@@ -972,15 +971,21 @@
      * <strong>Note:</strong> It is caller's responsibility to recycle the event.
      * </p>
      *
-     * @param event The event to inject.
-     * @param sync  Whether to inject the event synchronously.
-     * @param waitForAnimations Whether to wait for all window container animations and surface
-     *   operations to complete.
-     * @return Whether event injection succeeded.
+     * @param event the event to inject
+     * @param sync  whether to inject the event synchronously.
+     * @param waitForAnimations whether to wait for all window container animations and surface
+     *   operations to complete
+     * @return {@code true} if event injection succeeded
      *
+     * @deprecated for CTS tests prefer inject input events using uinput
+     *   (com.android.cts.input.UinputDevice) or hid devices (com.android.cts.input.HidDevice).
+     *   Alternatively, InjectInputInProcess (com.android.cts.input.InjectInputProcess) can be used
+     *   for in-process injection.
      * @hide
      */
     @TestApi
+    @Deprecated  // Deprecated for CTS tests
+    @SuppressLint("UnflaggedApi")  // @FlaggedApi breaks previously released @TestApi, b/395889250
     public boolean injectInputEvent(@NonNull InputEvent event, boolean sync,
             boolean waitForAnimations) {
         try {
@@ -1003,9 +1008,15 @@
      * Events injected to the input subsystem using the standard {@link #injectInputEvent} method
      * skip the accessibility input filter to avoid feedback loops.
      *
+     * @deprecated for CTS tests prefer inject input events using uinput
+     *   (com.android.cts.input.UinputDevice) or hid devices (com.android.cts.input.HidDevice).
+     *   Alternatively, InjectInputInProcess (com.android.cts.input.InjectInputProcess) can be used
+     *   for in-process injection.
      * @hide
      */
     @TestApi
+    @Deprecated
+    @SuppressLint("UnflaggedApi")  // @FlaggedApi breaks previously released @TestApi, b/395889250
     public void injectInputEventToInputFilter(@NonNull InputEvent event) {
         try {
             mUiAutomationConnection.injectInputEventToInputFilter(event);
diff --git a/core/java/android/app/UiModeManager.java b/core/java/android/app/UiModeManager.java
index f6c789d5..33466dd 100644
--- a/core/java/android/app/UiModeManager.java
+++ b/core/java/android/app/UiModeManager.java
@@ -312,7 +312,6 @@
      * #getAttentionModeThemeOverlay()}: Keeps night mode as set by {@link #setNightMode(int)}.
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     @TestApi
     public static final int MODE_ATTENTION_THEME_OVERLAY_OFF = 1000;
 
@@ -321,7 +320,6 @@
      * #getAttentionModeThemeOverlay()}: Maintains night mode always on.
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     @TestApi
     public static final int MODE_ATTENTION_THEME_OVERLAY_NIGHT = 1001;
 
@@ -330,7 +328,6 @@
      * #getAttentionModeThemeOverlay()}: Maintains night mode always off (Light).
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     @TestApi
     public static final int MODE_ATTENTION_THEME_OVERLAY_DAY = 1002;
 
@@ -338,7 +335,6 @@
      * Constant for {@link #getAttentionModeThemeOverlay()}: Error communication with server.
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     @TestApi
     public static final int MODE_ATTENTION_THEME_OVERLAY_UNKNOWN = -1;
 
@@ -940,7 +936,6 @@
      *                                  {@code AttentionModeThemeOverlayType}.
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     @RequiresPermission(android.Manifest.permission.MODIFY_DAY_NIGHT_MODE)
     public void setAttentionModeThemeOverlay(
             @AttentionModeThemeOverlayType int attentionModeThemeOverlayType) {
@@ -967,7 +962,6 @@
      *
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     @TestApi
     @RequiresPermission(android.Manifest.permission.MODIFY_DAY_NIGHT_MODE)
     public @AttentionModeThemeOverlayReturnType int getAttentionModeThemeOverlay() {
diff --git a/core/java/android/app/contextualsearch/ContextualSearchManager.java b/core/java/android/app/contextualsearch/ContextualSearchManager.java
index 2ce431d..4e5fa6b 100644
--- a/core/java/android/app/contextualsearch/ContextualSearchManager.java
+++ b/core/java/android/app/contextualsearch/ContextualSearchManager.java
@@ -32,6 +32,9 @@
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
 
 /**
  * {@link ContextualSearchManager} is a system service to facilitate contextual search experience on
@@ -39,10 +42,8 @@
  * <p>
  * This class lets a caller start contextual search by calling {@link #startContextualSearch}
  * method.
- *
- * @hide
  */
-@SystemApi
+@FlaggedApi(Flags.FLAG_SELF_INVOCATION)
 public final class ContextualSearchManager {
 
     /**
@@ -50,7 +51,9 @@
      * Only supposed to be used with ACTION_LAUNCH_CONTEXTUAL_SEARCH.
      *
      * @see #ACTION_LAUNCH_CONTEXTUAL_SEARCH
+     * @hide
      */
+    @SystemApi
     public static final String EXTRA_ENTRYPOINT =
             "android.app.contextualsearch.extra.ENTRYPOINT";
 
@@ -60,7 +63,9 @@
      * Only supposed to be used with ACTION_LAUNCH_CONTEXTUAL_SEARCH.
      *
      * @see #ACTION_LAUNCH_CONTEXTUAL_SEARCH
+     * @hide
      */
+    @SystemApi
     public static final String EXTRA_FLAG_SECURE_FOUND =
             "android.app.contextualsearch.extra.FLAG_SECURE_FOUND";
 
@@ -69,7 +74,9 @@
      * Only supposed to be used with ACTION_LAUNCH_CONTEXTUAL_SEARCH.
      *
      * @see #ACTION_LAUNCH_CONTEXTUAL_SEARCH
+     * @hide
      */
+    @SystemApi
     public static final String EXTRA_SCREENSHOT =
             "android.app.contextualsearch.extra.SCREENSHOT";
 
@@ -79,7 +86,9 @@
      * Only supposed to be used with ACTION_LAUNCH_CONTEXTUAL_SEARCH.
      *
      * @see #ACTION_LAUNCH_CONTEXTUAL_SEARCH
+     * @hide
      */
+    @SystemApi
     public static final String EXTRA_IS_MANAGED_PROFILE_VISIBLE =
             "android.app.contextualsearch.extra.IS_MANAGED_PROFILE_VISIBLE";
 
@@ -89,7 +98,9 @@
      * Only supposed to be used with ACTION_LAUNCH_CONTEXTUAL_SEARCH.
      *
      * @see #ACTION_LAUNCH_CONTEXTUAL_SEARCH
+     * @hide
      */
+    @SystemApi
     public static final String EXTRA_VISIBLE_PACKAGE_NAMES =
             "android.app.contextualsearch.extra.VISIBLE_PACKAGE_NAMES";
 
@@ -98,10 +109,9 @@
      * {@link SystemClock#uptimeMillis()}.
      * Only supposed to be used with ACTION_LAUNCH_CONTEXTUAL_SEARCH.
      *
-     * @see #ACTION_LAUNCH_CONTEXTUAL_SEARCH
-     *
      * TODO: un-hide in W
      *
+     * @see #ACTION_LAUNCH_CONTEXTUAL_SEARCH
      * @hide
      */
     public static final String EXTRA_INVOCATION_TIME_MS =
@@ -113,7 +123,9 @@
      * Only supposed to be used with ACTION_LAUNCH_CONTEXTUAL_SEARCH.
      *
      * @see #ACTION_LAUNCH_CONTEXTUAL_SEARCH
+     * @hide
      */
+    @SystemApi
     public static final String EXTRA_TOKEN = "android.app.contextualsearch.extra.TOKEN";
 
     /**
@@ -132,7 +144,10 @@
      * experience must add this intent filter action to the activity it wants to be launched.
      * <br>
      * <b>Note</b> This activity must not be exported.
+     *
+     * @hide
      */
+    @SystemApi
     public static final String ACTION_LAUNCH_CONTEXTUAL_SEARCH =
             "android.app.contextualsearch.action.LAUNCH_CONTEXTUAL_SEARCH";
 
@@ -144,23 +159,63 @@
     public static final String FEATURE_CONTEXTUAL_SEARCH =
             "com.google.android.feature.CONTEXTUAL_SEARCH";
 
-    /** Entrypoint to be used when a user long presses on the nav handle. */
+    /**
+     * Entrypoint to be used when a user long presses on the nav handle.
+     *
+     * @hide
+     */
+    @SystemApi
     public static final int ENTRYPOINT_LONG_PRESS_NAV_HANDLE = 1;
-    /** Entrypoint to be used when a user long presses on the home button. */
+
+    /** Entrypoint to be used when a user long presses on the home button.
+     *
+     * @hide
+     */
+    @SystemApi
     public static final int ENTRYPOINT_LONG_PRESS_HOME = 2;
-    /** Entrypoint to be used when a user long presses on the overview button. */
+
+    /** Entrypoint to be used when a user long presses on the overview button.
+     *
+     * @hide
+     */
+    @SystemApi
     public static final int ENTRYPOINT_LONG_PRESS_OVERVIEW = 3;
-    /** Entrypoint to be used when a user presses the action button in overview. */
+
+    /**
+     * Entrypoint to be used when a user presses the action button in overview.
+     *
+     * @hide
+     */
+    @SystemApi
     public static final int ENTRYPOINT_OVERVIEW_ACTION = 4;
-    /** Entrypoint to be used when a user presses the context menu button in overview. */
+
+    /**
+     * Entrypoint to be used when a user presses the context menu button in overview.
+     *
+     * @hide
+     */
+    @SystemApi
     public static final int ENTRYPOINT_OVERVIEW_MENU = 5;
-    /** Entrypoint to be used by system actions like TalkBack, Accessibility etc. */
+
+    /**
+     * Entrypoint to be used by system actions like TalkBack, Accessibility etc.
+     *
+     * @hide
+     */
+    @SystemApi
     public static final int ENTRYPOINT_SYSTEM_ACTION = 9;
-    /** Entrypoint to be used when a user long presses on the meta key. */
+
+    /**
+     * Entrypoint to be used when a user long presses on the meta key.
+     *
+     * @hide
+     */
+    @SystemApi
     public static final int ENTRYPOINT_LONG_PRESS_META = 10;
+
     /**
      * The {@link Entrypoint} annotation is used to standardize the entrypoints supported by
-     * {@link #startContextualSearch} method.
+     * {@link #startContextualSearch(int entrypoint)} method.
      *
      * @hide
      */
@@ -174,8 +229,18 @@
             ENTRYPOINT_LONG_PRESS_META
     })
     @Retention(RetentionPolicy.SOURCE)
-    public @interface Entrypoint {
-    }
+    public @interface Entrypoint {}
+
+    private static final Set<Integer> VALID_ENTRYPOINT_VALUES = new HashSet<>(Arrays.asList(
+            ENTRYPOINT_LONG_PRESS_NAV_HANDLE,
+            ENTRYPOINT_LONG_PRESS_HOME,
+            ENTRYPOINT_LONG_PRESS_OVERVIEW,
+            ENTRYPOINT_OVERVIEW_ACTION,
+            ENTRYPOINT_OVERVIEW_MENU,
+            ENTRYPOINT_SYSTEM_ACTION,
+            ENTRYPOINT_LONG_PRESS_META
+    ));
+
     private static final String TAG = ContextualSearchManager.class.getSimpleName();
     private static final boolean DEBUG = false;
 
@@ -189,7 +254,7 @@
     }
 
     /**
-     * Used to start contextual search.
+     * Used to start contextual search for a given system entrypoint.
      * <p>
      *     When {@link #startContextualSearch} is called, the system server does the following:
      *     <ul>
@@ -202,9 +267,15 @@
      * </p>
      *
      * @param entrypoint the invocation entrypoint
+     *
+     * @hide
      */
     @RequiresPermission(ACCESS_CONTEXTUAL_SEARCH)
+    @SystemApi
     public void startContextualSearch(@Entrypoint int entrypoint) {
+        if (!VALID_ENTRYPOINT_VALUES.contains(entrypoint)) {
+            throw new IllegalArgumentException("Invalid entrypoint: " + entrypoint);
+        }
         if (DEBUG) Log.d(TAG, "startContextualSearch for entrypoint: " + entrypoint);
         try {
             mService.startContextualSearch(entrypoint);
@@ -213,4 +284,22 @@
             e.rethrowFromSystemServer();
         }
     }
+
+    /**
+     * Used to start contextual search from within an app.
+     *
+     * <p>System apps should use the available System APIs rather than this method.
+     *
+     * @throws SecurityException if the caller does not have a foreground Activity.
+     */
+    @FlaggedApi(Flags.FLAG_SELF_INVOCATION)
+    public void startContextualSearch() {
+        if (DEBUG) Log.d(TAG, "startContextualSearch from app");
+        try {
+            mService.startContextualSearchForForegroundApp();
+        } catch (RemoteException e) {
+            if (DEBUG) Log.d(TAG, "Failed to startContextualSearch", e);
+            e.rethrowFromSystemServer();
+        }
+    }
 }
diff --git a/core/java/android/app/contextualsearch/IContextualSearchManager.aidl b/core/java/android/app/contextualsearch/IContextualSearchManager.aidl
index 9b0b8b7..8789daa 100644
--- a/core/java/android/app/contextualsearch/IContextualSearchManager.aidl
+++ b/core/java/android/app/contextualsearch/IContextualSearchManager.aidl
@@ -4,7 +4,8 @@
 /**
  * @hide
  */
-oneway interface IContextualSearchManager {
-  void startContextualSearch(int entrypoint);
-  void getContextualSearchState(in IBinder token, in IContextualSearchCallback callback);
+interface IContextualSearchManager {
+  void startContextualSearchForForegroundApp();
+  oneway void startContextualSearch(int entrypoint);
+  oneway void getContextualSearchState(in IBinder token, in IContextualSearchCallback callback);
 }
diff --git a/core/java/android/app/contextualsearch/flags.aconfig b/core/java/android/app/contextualsearch/flags.aconfig
index d81ec1e..bc1f7ce 100644
--- a/core/java/android/app/contextualsearch/flags.aconfig
+++ b/core/java/android/app/contextualsearch/flags.aconfig
@@ -39,3 +39,11 @@
     description: "Add audio playing status to the contextual search invocation intent."
     bug: "372935419"
 }
+
+flag {
+  name: "self_invocation"
+  namespace: "sysui_integrations"
+  description: "Enable apps to self-invoke Contextual Search."
+  bug: "368653769"
+  is_exported: true
+}
diff --git a/core/java/android/app/notification.aconfig b/core/java/android/app/notification.aconfig
index a10b6ff..bb4f556 100644
--- a/core/java/android/app/notification.aconfig
+++ b/core/java/android/app/notification.aconfig
@@ -26,6 +26,7 @@
   bug: "378660052"
 }
 
+# Flag for finalized API: In Nextfood but exported (and therefore must stay).
 flag {
   name: "modes_api"
   is_exported: true
@@ -308,10 +309,20 @@
 }
 
 flag {
+  name: "nm_binder_perf_get_apps_with_channels"
+  namespace: "systemui"
+  description: "Use a single binder call to get the set of apps with channels for a user"
+  bug: "362981561"
+  metadata {
+    purpose: PURPOSE_BUGFIX
+  }
+}
+
+flag {
   name: "no_sbnholder"
   namespace: "systemui"
   description: "removes sbnholder from NLS"
-  bug: "362981561"
+  bug: "378128805"
 }
 
 flag {
diff --git a/core/java/android/appwidget/flags.aconfig b/core/java/android/appwidget/flags.aconfig
index 9914ba2..58bf4ef 100644
--- a/core/java/android/appwidget/flags.aconfig
+++ b/core/java/android/appwidget/flags.aconfig
@@ -97,16 +97,6 @@
 }
 
 flag {
-  name: "check_remote_views_uri_permission"
-  namespace: "app_widgets"
-  description: "Check that the widget provider has permissions to access any URIs within its RemoteViews"
-  bug: "369137473"
-  metadata {
-    purpose: PURPOSE_BUGFIX
-  }
-}
-
-flag {
   name: "engagement_metrics"
   namespace: "app_widgets"
   description: "Enable collection of widget engagement metrics"
diff --git a/core/java/android/companion/CompanionDeviceManager.java b/core/java/android/companion/CompanionDeviceManager.java
index 566e78a..2b0e941 100644
--- a/core/java/android/companion/CompanionDeviceManager.java
+++ b/core/java/android/companion/CompanionDeviceManager.java
@@ -277,6 +277,23 @@
      */
     public static final int MESSAGE_ONEWAY_TO_WEARABLE = 0x43847987; // +TOW
 
+
+    /** @hide */
+    @IntDef(flag = true, prefix = { "TRANSPORT_FLAG_" }, value = {
+            TRANSPORT_FLAG_EXTEND_PATCH_DIFF,
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface TransportFlags {}
+
+    /**
+     * A security flag that allows transports to be attached to devices that may be more vulnerable
+     * due to infrequent updates. Can only be used for associations with
+     * {@link AssociationRequest#DEVICE_PROFILE_WEARABLE_SENSING} device profile.
+     *
+     * @hide
+     */
+    public static final int TRANSPORT_FLAG_EXTEND_PATCH_DIFF = 1;
+
     /**
      * Callback for applications to receive updates about and the outcome of
      * {@link AssociationRequest} issued via {@code associate()} call.
@@ -1452,7 +1469,52 @@
             }
 
             try {
-                final Transport transport = new Transport(associationId, in, out);
+                final Transport transport = new Transport(associationId, in, out, 0);
+                mTransports.put(associationId, transport);
+                transport.start();
+            } catch (IOException e) {
+                throw new RuntimeException("Failed to attach transport", e);
+            }
+        }
+    }
+
+    /**
+     * Attach a bidirectional communication stream to be used as a transport channel for
+     * transporting system data between associated devices. Flags can be provided to further
+     * customize the behavior of the transport.
+     *
+     * @param associationId id of the associated device.
+     * @param in Already connected stream of data incoming from remote
+     *           associated device.
+     * @param out Already connected stream of data outgoing to remote associated
+     *            device.
+     * @param flags Flags to customize transport behavior.
+     * @throws DeviceNotAssociatedException Thrown if the associationId was not previously
+     * associated with this app.
+     *
+     * @see #buildPermissionTransferUserConsentIntent(int)
+     * @see #startSystemDataTransfer(int, Executor, OutcomeReceiver)
+     * @see #detachSystemDataTransport(int)
+     *
+     * @hide
+     */
+    @RequiresPermission(android.Manifest.permission.DELIVER_COMPANION_MESSAGES)
+    public void attachSystemDataTransport(int associationId,
+            @NonNull InputStream in,
+            @NonNull OutputStream out,
+            @TransportFlags int flags) throws DeviceNotAssociatedException {
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
+            return;
+        }
+
+        synchronized (mTransports) {
+            if (mTransports.contains(associationId)) {
+                detachSystemDataTransport(associationId);
+            }
+
+            try {
+                final Transport transport = new Transport(associationId, in, out, flags);
                 mTransports.put(associationId, transport);
                 transport.start();
             } catch (IOException e) {
@@ -1931,16 +1993,22 @@
         private final int mAssociationId;
         private final InputStream mRemoteIn;
         private final OutputStream mRemoteOut;
+        private final int mFlags;
 
         private InputStream mLocalIn;
         private OutputStream mLocalOut;
 
         private volatile boolean mStopped;
 
-        public Transport(int associationId, InputStream remoteIn, OutputStream remoteOut) {
+        Transport(int associationId, InputStream remoteIn, OutputStream remoteOut) {
+            this(associationId, remoteIn, remoteOut, 0);
+        }
+
+        Transport(int associationId, InputStream remoteIn, OutputStream remoteOut, int flags) {
             mAssociationId = associationId;
             mRemoteIn = remoteIn;
             mRemoteOut = remoteOut;
+            mFlags = flags;
         }
 
         public void start() throws IOException {
@@ -1957,7 +2025,7 @@
 
             try {
                 mService.attachSystemDataTransport(mContext.getOpPackageName(),
-                        mContext.getUserId(), mAssociationId, remoteFd);
+                        mContext.getUserId(), mAssociationId, remoteFd, mFlags);
             } catch (RemoteException e) {
                 throw new IOException("Failed to configure transport", e);
             }
diff --git a/core/java/android/companion/ICompanionDeviceManager.aidl b/core/java/android/companion/ICompanionDeviceManager.aidl
index a2b7dd9..787e8b6 100644
--- a/core/java/android/companion/ICompanionDeviceManager.aidl
+++ b/core/java/android/companion/ICompanionDeviceManager.aidl
@@ -113,7 +113,7 @@
         in ISystemDataTransferCallback callback);
 
     @EnforcePermission("DELIVER_COMPANION_MESSAGES")
-    void attachSystemDataTransport(String packageName, int userId, int associationId, in ParcelFileDescriptor fd);
+    void attachSystemDataTransport(String packageName, int userId, int associationId, in ParcelFileDescriptor fd, int flags);
 
     @EnforcePermission("DELIVER_COMPANION_MESSAGES")
     void detachSystemDataTransport(String packageName, int userId, int associationId);
diff --git a/core/java/android/content/AttributionSource.java b/core/java/android/content/AttributionSource.java
index ffed536..ebf522b 100644
--- a/core/java/android/content/AttributionSource.java
+++ b/core/java/android/content/AttributionSource.java
@@ -34,6 +34,7 @@
 import android.permission.PermissionManager;
 import android.permission.flags.Flags;
 import android.util.ArraySet;
+import android.util.Log;
 
 import com.android.internal.annotations.Immutable;
 
@@ -90,6 +91,7 @@
  */
 @Immutable
 public final class AttributionSource implements Parcelable {
+    private static final String TAG = "AttributionSource";
     private static final String DESCRIPTOR = "android.content.AttributionSource";
 
     private static final Binder sDefaultToken = new Binder(DESCRIPTOR);
@@ -273,6 +275,13 @@
 
         final AttributionSource globalSource = ActivityThread.currentAttributionSource();
         if (globalSource != null) {
+            if (Flags.enforceDefaultDeviceIdInMyAttributionSource()
+                    && globalSource.getDeviceId() != Context.DEVICE_ID_DEFAULT) {
+                Log.w(TAG,
+                        "Avoid using myAttributionSource() to fetch an attributionSource with a "
+                                + "non-default device Id");
+                return globalSource.withDeviceId(Context.DEVICE_ID_DEFAULT);
+            }
             return globalSource;
         }
 
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 8378695..3391e79 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -3334,7 +3334,7 @@
      * this case, only one of these can be returned directly by the function;
      * which of these that is returned is arbitrarily decided by the system.
      *
-     * <p>If you know the Intent your are registering for is sticky, you can
+     * <p>If you know the Intent you are registering for is sticky, you can
      * supply null for your <var>receiver</var>.  In this case, no receiver is
      * registered -- the function simply returns the sticky Intent that
      * matches <var>filter</var>.  In the case of multiple matches, the same
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 0312ad7..0387561 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -8181,7 +8181,7 @@
     /**
      * Create an intent from a URI.  This URI may encode the action,
      * category, and other intent fields, if it was returned by
-     * {@link #toUri}.  If the Intent was not generate by toUri(), its data
+     * {@link #toUri}.  If the Intent was not generated by toUri(), its data
      * will be the entire URI and its action will be ACTION_VIEW.
      *
      * <p>The URI given here must not be relative -- that is, it must include
diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java
index 37f3f17..e645060 100644
--- a/core/java/android/content/pm/ActivityInfo.java
+++ b/core/java/android/content/pm/ActivityInfo.java
@@ -1643,6 +1643,19 @@
     public static final long OVERRIDE_ENABLE_INSETS_DECOUPLED_CONFIGURATION = 327313645L;
 
     /**
+     * When the override is enabled, the activity receives configuration coupled with caption bar
+     * insets. Normally, caption bar insets are decoupled from configuration.
+     *
+     * <p>Override applies only if the activity targets SDK level 34 or earlier version.
+     *
+     * @hide
+     */
+    @ChangeId
+    @Overridable
+    @Disabled
+    public static final long OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS = 388014743L;
+
+    /**
      * Optional set of a certificates identifying apps that are allowed to embed this activity. From
      * the "knownActivityEmbeddingCerts" attribute.
      */
diff --git a/core/java/android/content/pm/multiuser.aconfig b/core/java/android/content/pm/multiuser.aconfig
index e6082d0..5c904c1 100644
--- a/core/java/android/content/pm/multiuser.aconfig
+++ b/core/java/android/content/pm/multiuser.aconfig
@@ -622,3 +622,10 @@
      description: "Add API to logout user"
      bug: "350045389"
 }
+
+flag {
+    name: "enable_moving_content_into_private_space"
+    namespace: "profile_experiences"
+    description: "Enable moving content into the Private Space"
+    bug: "360066001"
+}
diff --git a/core/java/android/content/res/ApkAssets.java b/core/java/android/content/res/ApkAssets.java
index 0754578..f538e9f 100644
--- a/core/java/android/content/res/ApkAssets.java
+++ b/core/java/android/content/res/ApkAssets.java
@@ -25,6 +25,7 @@
 import android.ravenwood.annotation.RavenwoodClassLoadHook;
 import android.ravenwood.annotation.RavenwoodKeepWholeClass;
 import android.text.TextUtils;
+import android.util.Log;
 
 import com.android.internal.annotations.GuardedBy;
 
@@ -50,6 +51,7 @@
 @RavenwoodKeepWholeClass
 @RavenwoodClassLoadHook(RavenwoodClassLoadHook.LIBANDROID_LOADING_HOOK)
 public final class ApkAssets {
+    private static final boolean DEBUG = false;
 
     /**
      * The apk assets contains framework resource values specified by the system.
@@ -134,6 +136,17 @@
     @Nullable
     private final AssetsProvider mAssets;
 
+    @NonNull
+    private String mName;
+
+    private static final int UPTODATE_FALSE = 0;
+    private static final int UPTODATE_TRUE = 1;
+    private static final int UPTODATE_ALWAYS_TRUE = 2;
+
+    // Start with the only value that may change later and would force a native call to
+    // double check it.
+    private int mPreviousUpToDateResult = UPTODATE_TRUE;
+
     /**
      * Creates a new ApkAssets instance from the given path on disk.
      *
@@ -304,7 +317,7 @@
 
     private ApkAssets(@FormatType int format, @NonNull String path, @PropertyFlags int flags,
             @Nullable AssetsProvider assets) throws IOException {
-        this(format, flags, assets);
+        this(format, flags, assets, path);
         Objects.requireNonNull(path, "path");
         mNativePtr = nativeLoad(format, path, flags, assets);
         mStringBlock = new StringBlock(nativeGetStringBlock(mNativePtr), true /*useSparse*/);
@@ -313,7 +326,7 @@
     private ApkAssets(@FormatType int format, @NonNull FileDescriptor fd,
             @NonNull String friendlyName, @PropertyFlags int flags, @Nullable AssetsProvider assets)
             throws IOException {
-        this(format, flags, assets);
+        this(format, flags, assets, friendlyName);
         Objects.requireNonNull(fd, "fd");
         Objects.requireNonNull(friendlyName, "friendlyName");
         mNativePtr = nativeLoadFd(format, fd, friendlyName, flags, assets);
@@ -323,7 +336,7 @@
     private ApkAssets(@FormatType int format, @NonNull FileDescriptor fd,
             @NonNull String friendlyName, long offset, long length, @PropertyFlags int flags,
             @Nullable AssetsProvider assets) throws IOException {
-        this(format, flags, assets);
+        this(format, flags, assets, friendlyName);
         Objects.requireNonNull(fd, "fd");
         Objects.requireNonNull(friendlyName, "friendlyName");
         mNativePtr = nativeLoadFdOffsets(format, fd, friendlyName, offset, length, flags, assets);
@@ -331,16 +344,17 @@
     }
 
     private ApkAssets(@PropertyFlags int flags, @Nullable AssetsProvider assets) {
-        this(FORMAT_APK, flags, assets);
+        this(FORMAT_APK, flags, assets, "empty");
         mNativePtr = nativeLoadEmpty(flags, assets);
         mStringBlock = null;
     }
 
     private ApkAssets(@FormatType int format, @PropertyFlags int flags,
-            @Nullable AssetsProvider assets) {
+            @Nullable AssetsProvider assets, @NonNull String name) {
         mFlags = flags;
         mAssets = assets;
         mIsOverlay = format == FORMAT_IDMAP;
+        if (DEBUG) mName = name;
     }
 
     @UnsupportedAppUsage
@@ -421,13 +435,41 @@
         }
     }
 
+    private static double intervalMs(long beginNs, long endNs) {
+        return (endNs - beginNs) / 1000000.0;
+    }
+
     /**
      * Returns false if the underlying APK was changed since this ApkAssets was loaded.
      */
     public boolean isUpToDate() {
-        synchronized (this) {
-            return nativeIsUpToDate(mNativePtr);
+        // This function is performance-critical - it's called multiple times on every Resources
+        // object creation, and on few other cache accesses - so it's important to avoid the native
+        // call when we know for sure what it will return (which is the case for both ALWAYS_TRUE
+        // and FALSE).
+        if (mPreviousUpToDateResult != UPTODATE_TRUE) {
+            return mPreviousUpToDateResult == UPTODATE_ALWAYS_TRUE;
         }
+        final long beforeTs, afterLockTs, afterNativeTs, afterUnlockTs;
+        if (DEBUG) beforeTs = System.nanoTime();
+        final int res;
+        synchronized (this) {
+            if (DEBUG) afterLockTs = System.nanoTime();
+            res = nativeIsUpToDate(mNativePtr);
+            if (DEBUG) afterNativeTs = System.nanoTime();
+        }
+        if (DEBUG) {
+            afterUnlockTs = System.nanoTime();
+            if (afterUnlockTs - beforeTs >= 10L * 1000000) {
+                Log.d("ApkAssets", "isUpToDate(" + mName + ") took "
+                        + intervalMs(beforeTs, afterUnlockTs)
+                        + " ms: " + intervalMs(beforeTs, afterLockTs)
+                        + " / " + intervalMs(afterLockTs, afterNativeTs)
+                        + " / " + intervalMs(afterNativeTs, afterUnlockTs));
+            }
+        }
+        mPreviousUpToDateResult = res;
+        return res != UPTODATE_FALSE;
     }
 
     public boolean isSystem() {
@@ -487,7 +529,7 @@
     private static native @NonNull String nativeGetAssetPath(long ptr);
     private static native @NonNull String nativeGetDebugName(long ptr);
     private static native long nativeGetStringBlock(long ptr);
-    @CriticalNative private static native boolean nativeIsUpToDate(long ptr);
+    @CriticalNative private static native int nativeIsUpToDate(long ptr);
     private static native long nativeOpenXml(long ptr, @NonNull String fileName) throws IOException;
     private static native @Nullable OverlayableInfo nativeGetOverlayableInfo(long ptr,
             String overlayableName) throws IOException;
diff --git a/core/java/android/content/res/ResourceTimer.java b/core/java/android/content/res/ResourceTimer.java
index d51f64c..2d1bf4d 100644
--- a/core/java/android/content/res/ResourceTimer.java
+++ b/core/java/android/content/res/ResourceTimer.java
@@ -17,13 +17,10 @@
 package android.content.res;
 
 import android.annotation.NonNull;
-import android.annotation.Nullable;
-
 import android.app.AppProtoEnums;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
-import android.os.ParcelFileDescriptor;
 import android.os.Process;
 import android.os.SystemClock;
 import android.text.TextUtils;
@@ -33,6 +30,7 @@
 import com.android.internal.util.FastPrintWriter;
 import com.android.internal.util.FrameworkStatsLog;
 
+import java.io.FileDescriptor;
 import java.io.FileOutputStream;
 import java.io.PrintWriter;
 import java.util.Arrays;
@@ -277,38 +275,40 @@
      * Update the metrics information and dump it.
      * @hide
      */
-    public static void dumpTimers(@NonNull ParcelFileDescriptor pfd, @Nullable String[] args) {
-        FileOutputStream fout = new FileOutputStream(pfd.getFileDescriptor());
-        PrintWriter pw = new FastPrintWriter(fout);
-        synchronized (sLock) {
-            if (!sEnabled || (sConfig == null)) {
+    public static void dumpTimers(@NonNull FileDescriptor fd, String... args) {
+        try (PrintWriter pw = new FastPrintWriter(new FileOutputStream(fd))) {
+            pw.println("\nDumping ResourceTimers");
+
+            final boolean enabled;
+            synchronized (sLock) {
+                enabled = sEnabled && sConfig != null;
+            }
+            if (!enabled) {
                 pw.println("  Timers are not enabled in this process");
-                pw.flush();
                 return;
             }
-        }
 
-        // Look for the --refresh switch.  If the switch is present, then sTimers is updated.
-        // Otherwise, the current value of sTimers is displayed.
-        boolean refresh = Arrays.asList(args).contains("-refresh");
+            // Look for the --refresh switch.  If the switch is present, then sTimers is updated.
+            // Otherwise, the current value of sTimers is displayed.
+            boolean refresh = Arrays.asList(args).contains("-refresh");
 
-        synchronized (sLock) {
-            update(refresh);
-            long runtime = sLastUpdated - sProcessStart;
-            pw.format("  config runtime=%d proc=%s\n", runtime, Process.myProcessName());
-            for (int i = 0; i < sTimers.length; i++) {
-                Timer t = sTimers[i];
-                if (t.count != 0) {
-                    String name = sConfig.timers[i];
-                    pw.format("  stats timer=%s cnt=%d avg=%d min=%d max=%d pval=%s "
-                        + "largest=%s\n",
-                        name, t.count, t.total / t.count, t.mintime, t.maxtime,
-                        packedString(t.percentile),
-                        packedString(t.largest));
+            synchronized (sLock) {
+                update(refresh);
+                long runtime = sLastUpdated - sProcessStart;
+                pw.format("  config runtime=%d proc=%s\n", runtime, Process.myProcessName());
+                for (int i = 0; i < sTimers.length; i++) {
+                    Timer t = sTimers[i];
+                    if (t.count != 0) {
+                        String name = sConfig.timers[i];
+                        pw.format("  stats timer=%s cnt=%d avg=%d min=%d max=%d pval=%s "
+                                        + "largest=%s\n",
+                                name, t.count, t.total / t.count, t.mintime, t.maxtime,
+                                packedString(t.percentile),
+                                packedString(t.largest));
+                    }
                 }
             }
         }
-        pw.flush();
     }
 
     // Enable (or disabled) the runtime timers.  Note that timers are disabled by default.  This
diff --git a/core/java/android/content/res/flags.aconfig b/core/java/android/content/res/flags.aconfig
index 027eb9d..88fbdad 100644
--- a/core/java/android/content/res/flags.aconfig
+++ b/core/java/android/content/res/flags.aconfig
@@ -137,4 +137,15 @@
     namespace: "resource_manager"
     description: "flag always meant to be false, for testing resource flagging within cts tests"
     bug: "377974898"
-}
\ No newline at end of file
+}
+
+flag {
+    name: "use_new_aconfig_storage"
+    is_exported: true
+    namespace: "resource_manager"
+    description: "Retrieve flag values from new Aconfig flag storage in AconfigFlags.java"
+    bug: "352348353"
+    metadata {
+        purpose: PURPOSE_BUGFIX
+    }
+}
diff --git a/core/java/android/hardware/contexthub/HubEndpointSession.java b/core/java/android/hardware/contexthub/HubEndpointSession.java
index dd6e52f..ca59be8 100644
--- a/core/java/android/hardware/contexthub/HubEndpointSession.java
+++ b/core/java/android/hardware/contexthub/HubEndpointSession.java
@@ -27,6 +27,7 @@
 import android.hardware.location.IContextHubTransactionCallback;
 import android.util.CloseGuard;
 
+import java.util.Objects;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
@@ -160,6 +161,32 @@
         return stringBuilder.toString();
     }
 
+    @Override
+    public boolean equals(@Nullable Object object) {
+        if (object == this) {
+            return true;
+        }
+
+        boolean isEqual = false;
+        if (object instanceof HubEndpointSession other) {
+            isEqual = (other.getId() == mId);
+            if (mServiceDescriptor != null) {
+                isEqual &= mServiceDescriptor.equals(other.getServiceDescriptor());
+            } else {
+                isEqual &= (other.getServiceDescriptor() == null);
+            }
+            isEqual &=
+                    mInitiator.equals(other.mInitiator) && mDestination.equals(other.mDestination);
+        }
+
+        return isEqual;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(mId, mServiceDescriptor, mInitiator, mDestination);
+    }
+
     /** @hide */
     protected void finalize() throws Throwable {
         try {
diff --git a/core/java/android/hardware/display/ColorDisplayManager.java b/core/java/android/hardware/display/ColorDisplayManager.java
index 0d9db1f..7debab9 100644
--- a/core/java/android/hardware/display/ColorDisplayManager.java
+++ b/core/java/android/hardware/display/ColorDisplayManager.java
@@ -17,7 +17,6 @@
 package android.hardware.display;
 
 import android.Manifest;
-import android.annotation.FlaggedApi;
 import android.annotation.IntDef;
 import android.annotation.IntRange;
 import android.annotation.NonNull;
@@ -401,7 +400,6 @@
      * @hide
      */
     @TestApi
-    @FlaggedApi(android.app.Flags.FLAG_MODES_API)
     @RequiresPermission(Manifest.permission.CONTROL_DISPLAY_COLOR_TRANSFORMS)
     public boolean isSaturationActivated() {
         return mManager.isSaturationActivated();
diff --git a/core/java/android/hardware/input/InputManager.java b/core/java/android/hardware/input/InputManager.java
index 0ead823..49db54d 100644
--- a/core/java/android/hardware/input/InputManager.java
+++ b/core/java/android/hardware/input/InputManager.java
@@ -19,7 +19,6 @@
 import static com.android.input.flags.Flags.FLAG_INPUT_DEVICE_VIEW_BEHAVIOR_API;
 import static com.android.input.flags.Flags.FLAG_DEVICE_ASSOCIATIONS;
 import static com.android.hardware.input.Flags.enableCustomizableInputGestures;
-import static com.android.hardware.input.Flags.keyboardLayoutPreviewFlag;
 import static com.android.hardware.input.Flags.keyboardGlyphMap;
 
 import android.Manifest;
@@ -966,9 +965,6 @@
     @Nullable
     public Drawable getKeyboardLayoutPreview(@Nullable KeyboardLayout keyboardLayout, int width,
             int height) {
-        if (!keyboardLayoutPreviewFlag()) {
-            return null;
-        }
         PhysicalKeyLayout keyLayout = new PhysicalKeyLayout(
                 mGlobal.getKeyCharacterMap(keyboardLayout), keyboardLayout);
         return new KeyboardLayoutPreviewDrawable(mContext, keyLayout, width, height);
@@ -1403,9 +1399,6 @@
     @RequiresPermission(Manifest.permission.MONITOR_STICKY_MODIFIER_STATE)
     public void registerStickyModifierStateListener(@NonNull Executor executor,
             @NonNull StickyModifierStateListener listener) throws IllegalArgumentException {
-        if (!InputSettings.isAccessibilityStickyKeysFeatureEnabled()) {
-            return;
-        }
         mGlobal.registerStickyModifierStateListener(executor, listener);
     }
 
@@ -1419,9 +1412,6 @@
     @RequiresPermission(Manifest.permission.MONITOR_STICKY_MODIFIER_STATE)
     public void unregisterStickyModifierStateListener(
             @NonNull StickyModifierStateListener listener) {
-        if (!InputSettings.isAccessibilityStickyKeysFeatureEnabled()) {
-            return;
-        }
         mGlobal.unregisterStickyModifierStateListener(listener);
     }
 
diff --git a/core/java/android/hardware/input/InputSettings.java b/core/java/android/hardware/input/InputSettings.java
index af40188..3d4b885 100644
--- a/core/java/android/hardware/input/InputSettings.java
+++ b/core/java/android/hardware/input/InputSettings.java
@@ -16,15 +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_MOUSE_KEYS;
-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.enableCustomizableInputGestures;
-import static com.android.hardware.input.Flags.keyboardA11yBounceKeysFlag;
 import static com.android.hardware.input.Flags.keyboardA11yMouseKeys;
-import static com.android.hardware.input.Flags.keyboardA11ySlowKeysFlag;
-import static com.android.hardware.input.Flags.keyboardA11yStickyKeysFlag;
 import static com.android.hardware.input.Flags.mouseScrollingAcceleration;
 import static com.android.hardware.input.Flags.mouseReverseVerticalScrolling;
 import static com.android.hardware.input.Flags.mouseSwapPrimaryButton;
@@ -871,21 +865,6 @@
     }
 
     /**
-     * Whether Accessibility bounce keys feature is enabled.
-     *
-     * <p>
-     * Bounce keys’ is an accessibility feature to aid users who have physical disabilities,
-     * that allows the user to configure the device to ignore rapid, repeated keypresses of the
-     * same key.
-     * </p>
-     *
-     * @hide
-     */
-    public static boolean isAccessibilityBounceKeysFeatureEnabled() {
-        return keyboardA11yBounceKeysFlag();
-    }
-
-    /**
      * Whether Accessibility bounce keys is enabled.
      *
      * <p>
@@ -912,11 +891,7 @@
      * @hide
      */
     @TestApi
-    @FlaggedApi(FLAG_KEYBOARD_A11Y_BOUNCE_KEYS_FLAG)
     public static int getAccessibilityBounceKeysThreshold(@NonNull Context context) {
-        if (!isAccessibilityBounceKeysFeatureEnabled()) {
-            return 0;
-        }
         return Settings.Secure.getIntForUser(context.getContentResolver(),
                 Settings.Secure.ACCESSIBILITY_BOUNCE_KEYS, 0, UserHandle.USER_CURRENT);
     }
@@ -936,13 +911,9 @@
      * @hide
      */
     @TestApi
-    @FlaggedApi(FLAG_KEYBOARD_A11Y_BOUNCE_KEYS_FLAG)
     @RequiresPermission(Manifest.permission.WRITE_SETTINGS)
     public static void setAccessibilityBounceKeysThreshold(@NonNull Context context,
             int thresholdTimeMillis) {
-        if (!isAccessibilityBounceKeysFeatureEnabled()) {
-            return;
-        }
         if (thresholdTimeMillis < 0
                 || thresholdTimeMillis > MAX_ACCESSIBILITY_BOUNCE_KEYS_THRESHOLD_MILLIS) {
             throw new IllegalArgumentException(
@@ -955,21 +926,6 @@
     }
 
     /**
-     * Whether Accessibility slow keys feature flags is enabled.
-     *
-     * <p>
-     * 'Slow keys' is an accessibility feature to aid users who have physical disabilities, that
-     * allows the user to specify the duration for which one must press-and-hold a key before the
-     * system accepts the keypress.
-     * </p>
-     *
-     * @hide
-     */
-    public static boolean isAccessibilitySlowKeysFeatureFlagEnabled() {
-        return keyboardA11ySlowKeysFlag();
-    }
-
-    /**
      * Whether Accessibility slow keys is enabled.
      *
      * <p>
@@ -996,11 +952,7 @@
      * @hide
      */
     @TestApi
-    @FlaggedApi(FLAG_KEYBOARD_A11Y_SLOW_KEYS_FLAG)
     public static int getAccessibilitySlowKeysThreshold(@NonNull Context context) {
-        if (!isAccessibilitySlowKeysFeatureFlagEnabled()) {
-            return 0;
-        }
         return Settings.Secure.getIntForUser(context.getContentResolver(),
                 Settings.Secure.ACCESSIBILITY_SLOW_KEYS, 0, UserHandle.USER_CURRENT);
     }
@@ -1020,13 +972,9 @@
      * @hide
      */
     @TestApi
-    @FlaggedApi(FLAG_KEYBOARD_A11Y_SLOW_KEYS_FLAG)
     @RequiresPermission(Manifest.permission.WRITE_SETTINGS)
     public static void setAccessibilitySlowKeysThreshold(@NonNull Context context,
             int thresholdTimeMillis) {
-        if (!isAccessibilitySlowKeysFeatureFlagEnabled()) {
-            return;
-        }
         if (thresholdTimeMillis < 0
                 || thresholdTimeMillis > MAX_ACCESSIBILITY_SLOW_KEYS_THRESHOLD_MILLIS) {
             throw new IllegalArgumentException(
@@ -1039,23 +987,6 @@
     }
 
     /**
-     * Whether Accessibility sticky keys feature is enabled.
-     *
-     * <p>
-     * 'Sticky keys' is an accessibility feature that assists users who have physical
-     * disabilities or help users reduce repetitive strain injury. It serializes keystrokes
-     * instead of pressing multiple keys at a time, allowing the user to press and release a
-     * modifier key, such as Shift, Ctrl, Alt, or any other modifier key, and have it remain
-     * active until any other key is pressed.
-     * </p>
-     *
-     * @hide
-     */
-    public static boolean isAccessibilityStickyKeysFeatureEnabled() {
-        return keyboardA11yStickyKeysFlag();
-    }
-
-    /**
      * Whether Accessibility sticky keys is enabled.
      *
      * <p>
@@ -1069,11 +1000,7 @@
      * @hide
      */
     @TestApi
-    @FlaggedApi(FLAG_KEYBOARD_A11Y_STICKY_KEYS_FLAG)
     public static boolean isAccessibilityStickyKeysEnabled(@NonNull Context context) {
-        if (!isAccessibilityStickyKeysFeatureEnabled()) {
-            return false;
-        }
         return Settings.Secure.getIntForUser(context.getContentResolver(),
                 Settings.Secure.ACCESSIBILITY_STICKY_KEYS, 0, UserHandle.USER_CURRENT) != 0;
     }
@@ -1092,13 +1019,9 @@
      * @hide
      */
     @TestApi
-    @FlaggedApi(FLAG_KEYBOARD_A11Y_STICKY_KEYS_FLAG)
     @RequiresPermission(Manifest.permission.WRITE_SETTINGS)
     public static void setAccessibilityStickyKeysEnabled(@NonNull Context context,
             boolean enabled) {
-        if (!isAccessibilityStickyKeysFeatureEnabled()) {
-            return;
-        }
         Settings.Secure.putIntForUser(context.getContentResolver(),
                 Settings.Secure.ACCESSIBILITY_STICKY_KEYS, enabled ? 1 : 0,
                 UserHandle.USER_CURRENT);
diff --git a/core/java/android/hardware/input/input_framework.aconfig b/core/java/android/hardware/input/input_framework.aconfig
index 8d58296..6c2ce36 100644
--- a/core/java/android/hardware/input/input_framework.aconfig
+++ b/core/java/android/hardware/input/input_framework.aconfig
@@ -8,35 +8,6 @@
 
 flag {
     namespace: "input_native"
-    name: "keyboard_layout_preview_flag"
-    description: "Controls whether a preview will be shown in Settings when selecting a physical keyboard layout"
-    bug: "293579375"
-}
-
-
-flag {
-    namespace: "input_native"
-    name: "keyboard_a11y_sticky_keys_flag"
-    description: "Controls if the sticky keys accessibility feature for physical keyboard is available to the user"
-    bug: "294546335"
-}
-
-flag {
-    namespace: "input_native"
-    name: "keyboard_a11y_bounce_keys_flag"
-    description: "Controls if the bounce keys accessibility feature for physical keyboard is available to the user"
-    bug: "294546335"
-}
-
-flag {
-    namespace: "input_native"
-    name: "keyboard_a11y_slow_keys_flag"
-    description: "Controls if the slow keys accessibility feature for physical keyboard is available to the user"
-    bug: "294546335"
-}
-
-flag {
-    namespace: "input_native"
     name: "keyboard_glyph_map"
     description: "Allows system to provide keyboard specific key drawables and shortcuts via config files"
     bug: "345440920"
diff --git a/media/java/android/media/Image.java b/core/java/android/media/Image.java
similarity index 100%
rename from media/java/android/media/Image.java
rename to core/java/android/media/Image.java
diff --git a/media/java/android/media/ImageReader.java b/core/java/android/media/ImageReader.java
similarity index 100%
rename from media/java/android/media/ImageReader.java
rename to core/java/android/media/ImageReader.java
diff --git a/media/java/android/media/ImageUtils.java b/core/java/android/media/ImageUtils.java
similarity index 100%
rename from media/java/android/media/ImageUtils.java
rename to core/java/android/media/ImageUtils.java
diff --git a/media/java/android/media/ImageWriter.java b/core/java/android/media/ImageWriter.java
similarity index 100%
rename from media/java/android/media/ImageWriter.java
rename to core/java/android/media/ImageWriter.java
diff --git a/media/java/android/media/PublicFormatUtils.java b/core/java/android/media/PublicFormatUtils.java
similarity index 100%
rename from media/java/android/media/PublicFormatUtils.java
rename to core/java/android/media/PublicFormatUtils.java
diff --git a/core/java/android/os/TestLooperManager.java b/core/java/android/os/TestLooperManager.java
index 2d9d025..1a54f4d 100644
--- a/core/java/android/os/TestLooperManager.java
+++ b/core/java/android/os/TestLooperManager.java
@@ -159,7 +159,7 @@
      */
     public void execute(Message message) {
         checkReleased();
-        if (Looper.myLooper() == mLooper) {
+        if (mLooper.isCurrentThread()) {
             // This is being called from the thread it should be executed on, we can just dispatch.
             message.target.dispatchMessage(message);
         } else {
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index c00f31d..33bf4a2 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -982,8 +982,8 @@
     /**
      * Specifies if a user is disallowed from adding new users. This can only be set by device
      * owners or profile owners on the main user. The default value is <code>false</code>.
-     * <p> When the device is an organization-owned device provisioned with a managed profile,
-     * this restriction will be set as a base restriction which cannot be removed by any admin.
+     * <p> When the device is an organization-owned device, this restriction will be set as
+     * a base restriction which cannot be removed by any admin.
      *
      * <p>Holders of the permission
      * {@link android.Manifest.permission#MANAGE_DEVICE_POLICY_MODIFY_USERS}
@@ -2776,7 +2776,7 @@
     }
 
     /**
-     * Returns whether logging out is currently allowed for the context user.
+     * Returns whether logging out is currently allowed for the specified user.
      *
      * <p>Logging out is not allowed in the following cases:
      * <ol>
@@ -2794,11 +2794,10 @@
      * {@link #LOGOUTABILITY_STATUS_CANNOT_SWITCH}.
      * @hide
      */
-    @UserHandleAware
     @RequiresPermission(Manifest.permission.MANAGE_USERS)
-    public @UserLogoutability int getUserLogoutability() {
+    public @UserLogoutability int getUserLogoutability(@UserIdInt int userId) {
         try {
-            return mService.getUserLogoutability(mUserId);
+            return mService.getUserLogoutability(userId);
         } catch (RemoteException re) {
             throw re.rethrowFromSystemServer();
         }
diff --git a/core/java/android/os/vibrator/VibratorFrequencyProfile.java b/core/java/android/os/vibrator/VibratorFrequencyProfile.java
index 2b5f9bf..a8ed818 100644
--- a/core/java/android/os/vibrator/VibratorFrequencyProfile.java
+++ b/core/java/android/os/vibrator/VibratorFrequencyProfile.java
@@ -51,8 +51,7 @@
         Preconditions.checkArgument(!frequencyProfile.isEmpty(),
                 "Frequency profile must not be empty");
         mFrequencyProfile = frequencyProfile;
-        mFrequenciesOutputAcceleration = generateFrequencyToAccelerationMap(
-                frequencyProfile.getFrequenciesHz(), frequencyProfile.getOutputAccelerationsGs());
+        mFrequenciesOutputAcceleration = generateFrequencyToAccelerationMap(mFrequencyProfile);
     }
 
     /**
@@ -133,18 +132,21 @@
     }
 
     private static SparseArray<Float> generateFrequencyToAccelerationMap(
-            float[] frequencies, float[] accelerations) {
-        SparseArray<Float> sparseArray = new SparseArray<>(frequencies.length);
-
+            VibratorInfo.FrequencyProfile frequencyProfile) {
+        float[] frequencies = frequencyProfile.getFrequenciesHz();
+        SparseArray<Float> frequencyToAcceleration = new SparseArray<>(frequencies.length);
+        int lastFrequency = -1;
         for (int i = 0; i < frequencies.length; i++) {
             int frequency = (int) frequencies[i];
-            float acceleration = accelerations[i];
-
-            sparseArray.put(frequency,
-                    Math.min(acceleration, sparseArray.get(frequency, Float.MAX_VALUE)));
+            if (frequency == lastFrequency) {
+                continue; // Skip duplicate frequencies
+            }
+            float acceleration = frequencyProfile.getOutputAccelerationGs(frequency);
+            frequencyToAcceleration.put(frequency, acceleration);
+            lastFrequency = frequency;
 
         }
 
-        return sparseArray;
+        return frequencyToAcceleration;
     }
 }
diff --git a/core/java/android/permission/flags.aconfig b/core/java/android/permission/flags.aconfig
index daa5584..d469a2f 100644
--- a/core/java/android/permission/flags.aconfig
+++ b/core/java/android/permission/flags.aconfig
@@ -507,3 +507,10 @@
     description: "Use IoThread handler for AppOpsService background/IO work."
     bug: "394380603"
 }
+
+flag {
+    name: "enforce_default_device_id_in_my_attribution_source"
+    namespace: "permissions"
+    description: "Force AttributionSource.myAttributionSource() to return a default device id"
+    bug: "343121936"
+}
diff --git a/core/java/android/provider/DocumentsProvider.java b/core/java/android/provider/DocumentsProvider.java
index 5b527c7..1b65a88 100644
--- a/core/java/android/provider/DocumentsProvider.java
+++ b/core/java/android/provider/DocumentsProvider.java
@@ -1124,12 +1124,13 @@
         }
 
         final Uri documentUri = extraUri;
-        final String authority = documentUri.getAuthority();
+        final String authorityWithoutUserId = getAuthorityWithoutUserId(documentUri.getAuthority());
         final String documentId = DocumentsContract.getDocumentId(documentUri);
 
-        if (!mAuthority.equals(authority)) {
+        if (!mAuthority.equals(authorityWithoutUserId)) {
             throw new SecurityException(
-                    "Requested authority " + authority + " doesn't match provider " + mAuthority);
+                    "Requested authority " + authorityWithoutUserId + " doesn't match provider "
+                            + mAuthority);
         }
 
         if (METHOD_IS_CHILD_DOCUMENT.equals(method)) {
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 3cd7a00..1a9b42e 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -2119,7 +2119,6 @@
      * <p>
      * Output: Nothing.
      */
-    @FlaggedApi(android.app.Flags.FLAG_MODES_API)
     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
     public static final String ACTION_AUTOMATIC_ZEN_RULE_SETTINGS
             = "android.settings.AUTOMATIC_ZEN_RULE_SETTINGS";
@@ -2129,7 +2128,6 @@
      * <p>
      * This must be passed as an extra field to the {@link #ACTION_AUTOMATIC_ZEN_RULE_SETTINGS}.
      */
-    @FlaggedApi(android.app.Flags.FLAG_MODES_API)
     public static final String EXTRA_AUTOMATIC_ZEN_RULE_ID
             = "android.provider.extra.AUTOMATIC_ZEN_RULE_ID";
 
@@ -10269,6 +10267,16 @@
         public static final String DOZE_ALWAYS_ON = "doze_always_on";
 
         /**
+         * Indicates whether ambient wallpaper is visible with AOD.
+         * <p>
+         * Type: int (0 for false, 1 for true)
+         *
+         * @hide
+         */
+        public static final String DOZE_ALWAYS_ON_WALLPAPER_ENABLED =
+                "doze_always_on_wallpaper_enabled";
+
+        /**
          * Whether the device should pulse on pick up gesture.
          * @hide
          */
@@ -13006,6 +13014,24 @@
         public static final String STYLUS_POINTER_ICON_ENABLED = "stylus_pointer_icon_enabled";
 
         /**
+         * Toggle for whether to redact OTP notification while connected to wifi. Defaults to
+         * false/0.
+         * @hide
+         */
+        @Readable
+        public static final String REDACT_OTP_NOTIFICATION_WHILE_CONNECTED_TO_WIFI =
+                "redact_otp_on_wifi";
+
+        /**
+         * Toggle for whether to immediately redact OTP notifications, or require the device to be
+         * locked for 10 minutes. Defaults to false/0
+         * @hide
+         */
+        @Readable
+        public static final String REDACT_OTP_NOTIFICATION_IMMEDIATELY =
+                "remove_otp_redaction_delay";
+
+        /**
          * These entries are considered common between the personal and the managed profile,
          * since the managed profile doesn't get to change them.
          */
diff --git a/core/java/android/security/FileIntegrityManager.java b/core/java/android/security/FileIntegrityManager.java
index 9e02ecd..903f817 100644
--- a/core/java/android/security/FileIntegrityManager.java
+++ b/core/java/android/security/FileIntegrityManager.java
@@ -65,13 +65,7 @@
      * other fs-verity APIs.
      */
     public boolean isApkVeritySupported() {
-        try {
-            // Go through the service just to avoid exposing the vendor controlled system property
-            // to all apps.
-            return mService.isApkVeritySupported();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
+        return VerityUtils.isFsVeritySupported();
     }
 
     /**
diff --git a/core/java/android/security/IFileIntegrityService.aidl b/core/java/android/security/IFileIntegrityService.aidl
index c6def23..5a1a6a0 100644
--- a/core/java/android/security/IFileIntegrityService.aidl
+++ b/core/java/android/security/IFileIntegrityService.aidl
@@ -24,8 +24,6 @@
  * @hide
  */
 interface IFileIntegrityService {
-    boolean isApkVeritySupported();
-
     IInstalld.IFsveritySetupAuthToken createAuthToken(in ParcelFileDescriptor authFd);
 
     @EnforcePermission("SETUP_FSVERITY")
diff --git a/core/java/android/security/flags.aconfig b/core/java/android/security/flags.aconfig
index 792e6ff..3a3ea18 100644
--- a/core/java/android/security/flags.aconfig
+++ b/core/java/android/security/flags.aconfig
@@ -126,6 +126,16 @@
 }
 
 flag {
+    name: "internal_log_event_listener"
+    namespace: "hardware_backed_security"
+    description: "Use internal callback to gather SecurityMonitor logs."
+    bug: "389732143"
+    metadata {
+      purpose: PURPOSE_BUGFIX
+    }
+}
+
+flag {
     name: "protect_device_config_flags"
     namespace: "psap_ai"
     description: "Feature flag to limit adb shell to allowlisted flags"
diff --git a/core/java/android/security/intrusiondetection/IntrusionDetectionEvent.java b/core/java/android/security/intrusiondetection/IntrusionDetectionEvent.java
index 76ee448..f5f3348 100644
--- a/core/java/android/security/intrusiondetection/IntrusionDetectionEvent.java
+++ b/core/java/android/security/intrusiondetection/IntrusionDetectionEvent.java
@@ -19,10 +19,10 @@
 import android.annotation.FlaggedApi;
 import android.annotation.IntDef;
 import android.annotation.NonNull;
+import android.annotation.SystemApi;
 import android.app.admin.ConnectEvent;
 import android.app.admin.DnsEvent;
 import android.app.admin.SecurityLog.SecurityEvent;
-import android.annotation.SystemApi;
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.security.Flags;
@@ -223,13 +223,13 @@
         out.writeInt(mType);
         switch (mType) {
             case SECURITY_EVENT:
-                out.writeParcelable(mSecurityEvent, flags);
+                mSecurityEvent.writeToParcel(out, flags);
                 break;
             case NETWORK_EVENT_DNS:
-                out.writeParcelable(mNetworkEventDns, flags);
+                mNetworkEventDns.writeToParcel(out, flags);
                 break;
             case NETWORK_EVENT_CONNECT:
-                out.writeParcelable(mNetworkEventConnect, flags);
+                mNetworkEventConnect.writeToParcel(out, flags);
                 break;
             default:
                 throw new IllegalArgumentException("Invalid event type: " + mType);
diff --git a/core/java/android/service/notification/Condition.java b/core/java/android/service/notification/Condition.java
index 6e771f8..c375cfb 100644
--- a/core/java/android/service/notification/Condition.java
+++ b/core/java/android/service/notification/Condition.java
@@ -18,11 +18,9 @@
 
 import static com.android.internal.util.Preconditions.checkArgument;
 
-import android.annotation.FlaggedApi;
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
-import android.app.Flags;
 import android.content.Context;
 import android.net.Uri;
 import android.os.Parcel;
@@ -105,20 +103,15 @@
     public @interface Source {}
 
     /** The state is changing due to an unknown reason. */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int SOURCE_UNKNOWN = 0;
     /** The state is changing due to an explicit user action. */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int SOURCE_USER_ACTION = 1;
     /** The state is changing due to an automatic schedule (alarm, set time, etc). */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int SOURCE_SCHEDULE = 2;
     /** The state is changing due to a change in context (such as detected driving or sleeping). */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int SOURCE_CONTEXT = 3;
 
     /** The source of, or reason for, the state change represented by this Condition. **/
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public final @Source int source; // default = SOURCE_UNKNOWN
 
     /**
@@ -145,7 +138,6 @@
      * @param state whether the mode should be activated or deactivated
      * @param source the source of, or reason for, the state change represented by this Condition
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public Condition(@Nullable Uri id, @Nullable String summary, @State int state,
                      @Source int source) {
         this(id, summary, "", "", -1, state, source, FLAG_RELEVANT_ALWAYS);
@@ -168,7 +160,6 @@
      * @param source the source of, or reason for, the state change represented by this Condition
      * @param flags flags on this condition
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public Condition(@Nullable Uri id, @Nullable String summary, @Nullable String line1,
                      @Nullable String line2, int icon, @State int state, @Source int source,
                      int flags) {
@@ -195,15 +186,13 @@
                 source.readString(),
                 source.readInt(),
                 source.readInt(),
-                Flags.modesApi() ? source.readInt() : SOURCE_UNKNOWN,
+                source.readInt(),
                 source.readInt());
     }
 
     /** @hide */
     public void validate() {
-        if (Flags.modesApi()) {
-            checkValidSource(source);
-        }
+        checkValidSource(source);
     }
 
     private static boolean isValidState(int state) {
@@ -211,11 +200,9 @@
     }
 
     private static int checkValidSource(@Source int source) {
-        if (Flags.modesApi()) {
-            checkArgument(source >= SOURCE_UNKNOWN && source <= SOURCE_CONTEXT,
-                    "Condition source must be one of SOURCE_UNKNOWN, SOURCE_USER_ACTION, "
-                            + "SOURCE_SCHEDULE, or SOURCE_CONTEXT");
-        }
+        checkArgument(source >= SOURCE_UNKNOWN && source <= SOURCE_CONTEXT,
+                "Condition source must be one of SOURCE_UNKNOWN, SOURCE_USER_ACTION, "
+                        + "SOURCE_SCHEDULE, or SOURCE_CONTEXT");
         return source;
     }
 
@@ -227,25 +214,21 @@
         dest.writeString(line2);
         dest.writeInt(icon);
         dest.writeInt(state);
-        if (Flags.modesApi()) {
-            dest.writeInt(this.source);
-        }
+        dest.writeInt(this.source);
         dest.writeInt(this.flags);
     }
 
     @Override
     public String toString() {
-        StringBuilder sb = new StringBuilder(Condition.class.getSimpleName()).append('[')
+        return new StringBuilder(Condition.class.getSimpleName()).append('[')
                 .append("state=").append(stateToString(state))
                 .append(",id=").append(id)
                 .append(",summary=").append(summary)
                 .append(",line1=").append(line1)
                 .append(",line2=").append(line2)
-                .append(",icon=").append(icon);
-        if (Flags.modesApi()) {
-            sb.append(",source=").append(sourceToString(source));
-        }
-        return sb.append(",flags=").append(flags)
+                .append(",icon=").append(icon)
+                .append(",source=").append(sourceToString(source))
+                .append(",flags=").append(flags)
                 .append(']').toString();
 
     }
@@ -279,7 +262,6 @@
      * Provides a human-readable string version of the Source enum.
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static @NonNull String sourceToString(@Source int source) {
         if (source == SOURCE_UNKNOWN) return "SOURCE_UNKNOWN";
         if (source == SOURCE_USER_ACTION) return "SOURCE_USER_ACTION";
@@ -301,25 +283,19 @@
         if (!(o instanceof Condition)) return false;
         if (o == this) return true;
         final Condition other = (Condition) o;
-        boolean finalEquals = Objects.equals(other.id, id)
+        return Objects.equals(other.id, id)
                 && Objects.equals(other.summary, summary)
                 && Objects.equals(other.line1, line1)
                 && Objects.equals(other.line2, line2)
                 && other.icon == icon
                 && other.state == state
-                && other.flags == flags;
-        if (Flags.modesApi()) {
-            return finalEquals && other.source == source;
-        }
-        return finalEquals;
+                && other.flags == flags
+                && other.source == source;
     }
 
     @Override
     public int hashCode() {
-        if (Flags.modesApi()) {
-            return Objects.hash(id, summary, line1, line2, icon, state, source, flags);
-        }
-        return Objects.hash(id, summary, line1, line2, icon, state, flags);
+        return Objects.hash(id, summary, line1, line2, icon, state, source, flags);
     }
 
     @Override
diff --git a/core/java/android/service/notification/SystemZenRules.java b/core/java/android/service/notification/SystemZenRules.java
index f11ce16..fbee06e1 100644
--- a/core/java/android/service/notification/SystemZenRules.java
+++ b/core/java/android/service/notification/SystemZenRules.java
@@ -16,7 +16,6 @@
 
 package android.service.notification;
 
-import android.annotation.FlaggedApi;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.StringRes;
@@ -47,7 +46,6 @@
     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)) {
@@ -69,7 +67,6 @@
         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) {
diff --git a/core/java/android/service/notification/ZenAdapters.java b/core/java/android/service/notification/ZenAdapters.java
index a122b71..4f53bfa 100644
--- a/core/java/android/service/notification/ZenAdapters.java
+++ b/core/java/android/service/notification/ZenAdapters.java
@@ -17,7 +17,6 @@
 package android.service.notification;
 
 import android.annotation.NonNull;
-import android.app.Flags;
 import android.app.NotificationManager.Policy;
 
 /**
@@ -50,7 +49,8 @@
                                 : ZenPolicy.PEOPLE_TYPE_NONE)
                 .allowReminders(policy.allowReminders())
                 .allowRepeatCallers(policy.allowRepeatCallers())
-                .allowSystem(policy.allowSystem());
+                .allowSystem(policy.allowSystem())
+                .allowPriorityChannels(policy.allowPriorityChannels());
 
         if (policy.suppressedVisualEffects != Policy.SUPPRESSED_EFFECTS_UNSET) {
             zenPolicyBuilder.showBadges(policy.showBadges())
@@ -62,10 +62,6 @@
                     .showStatusBarIcons(policy.showStatusBarIcons());
         }
 
-        if (Flags.modesApi()) {
-            zenPolicyBuilder.allowPriorityChannels(policy.allowPriorityChannels());
-        }
-
         return zenPolicyBuilder.build();
     }
 
diff --git a/core/java/android/service/notification/ZenDeviceEffects.java b/core/java/android/service/notification/ZenDeviceEffects.java
index 06bd255..d88fb3e3 100644
--- a/core/java/android/service/notification/ZenDeviceEffects.java
+++ b/core/java/android/service/notification/ZenDeviceEffects.java
@@ -16,12 +16,10 @@
 
 package android.service.notification;
 
-import android.annotation.FlaggedApi;
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.TestApi;
-import android.app.Flags;
 import android.os.Parcel;
 import android.os.Parcelable;
 
@@ -37,7 +35,6 @@
  * Represents the set of device effects (affecting display and device behavior in general) that
  * are applied whenever an {@link android.app.AutomaticZenRule} is active.
  */
-@FlaggedApi(Flags.FLAG_MODES_API)
 public final class ZenDeviceEffects implements Parcelable {
 
     /**
@@ -157,7 +154,6 @@
     }
 
     /** @hide */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public void validate() {
         int extraEffectsLength = 0;
         for (String extraEffect : mExtraEffects) {
@@ -435,7 +431,6 @@
     }
 
     /** Builder class for {@link ZenDeviceEffects} objects. */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final class Builder {
 
         private boolean mGrayscale;
diff --git a/core/java/android/service/notification/ZenModeConfig.java b/core/java/android/service/notification/ZenModeConfig.java
index 4f459aa..4011574 100644
--- a/core/java/android/service/notification/ZenModeConfig.java
+++ b/core/java/android/service/notification/ZenModeConfig.java
@@ -228,7 +228,7 @@
     private static final boolean DEFAULT_ALLOW_CONV = true;
     private static final int DEFAULT_ALLOW_CONV_FROM = ZenPolicy.CONVERSATION_SENDERS_IMPORTANT;
     private static final boolean DEFAULT_ALLOW_PRIORITY_CHANNELS = true;
-    private static final boolean DEFAULT_CHANNELS_BYPASSING_DND = false;
+    private static final boolean DEFAULT_HAS_PRIORITY_CHANNELS = false;
     // Default setting here is 010011101 = 157
     private static final int DEFAULT_SUPPRESSED_VISUAL_EFFECTS =
             SUPPRESSED_EFFECT_SCREEN_OFF | SUPPRESSED_EFFECT_FULL_SCREEN_INTENT
@@ -242,9 +242,6 @@
     public static final int XML_VERSION_MODES_API = 11;
     public static final int XML_VERSION_MODES_UI = 12;
 
-    // TODO: b/310620812, b/344831624 - Update XML_VERSION and update default_zen_config.xml
-    //  accordingly when modes_api / modes_ui are inlined.
-    private static final int XML_VERSION_PRE_MODES = 10;
     public static final String ZEN_TAG = "zen";
     private static final String ZEN_ATT_VERSION = "version";
     private static final String ZEN_ATT_USER = "user";
@@ -269,7 +266,7 @@
     private static final String DISALLOW_TAG = "disallow";
     private static final String DISALLOW_ATT_VISUAL_EFFECTS = "visualEffects";
     private static final String STATE_TAG = "state";
-    private static final String STATE_ATT_CHANNELS_BYPASSING_DND = "areChannelsBypassingDnd";
+    private static final String STATE_HAS_PRIORITY_CHANNELS = "areChannelsBypassingDnd";
 
     // zen policy visual effects attributes
     private static final String SHOW_ATT_FULL_SCREEN_INTENT = "showFullScreenIntent";
@@ -303,7 +300,6 @@
     private static final String RULE_ATT_CONDITION_ID = "conditionId";
     private static final String RULE_ATT_CREATION_TIME = "creationTime";
     private static final String RULE_ATT_ENABLER = "enabler";
-    private static final String RULE_ATT_MODIFIED = "modified";
     private static final String RULE_ATT_ALLOW_MANUAL = "userInvokable";
     private static final String RULE_ATT_TYPE = "type";
     private static final String RULE_ATT_USER_MODIFIED_FIELDS = "userModifiedFields";
@@ -348,11 +344,11 @@
     public int allowConversationsFrom = DEFAULT_ALLOW_CONV_FROM;
     public int user = UserHandle.USER_SYSTEM;
     public int suppressedVisualEffects = DEFAULT_SUPPRESSED_VISUAL_EFFECTS;
-    // Note that when the modes_api flag is true, the areChannelsBypassingDnd boolean only tracks
-    // whether the current user has any priority channels. These channels may bypass DND when
-    // allowPriorityChannels is true.
-    // TODO: b/310620812 - Rename to be more accurate when modes_api flag is inlined.
-    public boolean areChannelsBypassingDnd = DEFAULT_CHANNELS_BYPASSING_DND;
+    /**
+     * Whether the current user has any priority channels. These channels may bypass DND when
+     * {@link #allowPriorityChannels} is true.
+     */
+    public boolean hasPriorityChannels = DEFAULT_HAS_PRIORITY_CHANNELS;
     public boolean allowPriorityChannels = DEFAULT_ALLOW_PRIORITY_CHANNELS;
     public int version;
 
@@ -384,22 +380,18 @@
         user = source.readInt();
         manualRule = source.readParcelable(null, ZenRule.class);
         readRulesFromParcel(automaticRules, source);
-        if (Flags.modesApi()) {
-            readRulesFromParcel(deletedRules, source);
-        }
+        readRulesFromParcel(deletedRules, source);
         if (!Flags.modesUi()) {
             allowAlarms = source.readInt() == 1;
             allowMedia = source.readInt() == 1;
             allowSystem = source.readInt() == 1;
             suppressedVisualEffects = source.readInt();
         }
-        areChannelsBypassingDnd = source.readInt() == 1;
+        hasPriorityChannels = source.readInt() == 1;
         if (!Flags.modesUi()) {
             allowConversations = source.readBoolean();
             allowConversationsFrom = source.readInt();
-            if (Flags.modesApi()) {
-                allowPriorityChannels = source.readBoolean();
-            }
+            allowPriorityChannels = source.readBoolean();
         }
     }
 
@@ -493,22 +485,18 @@
         dest.writeInt(user);
         dest.writeParcelable(manualRule, 0);
         writeRulesToParcel(automaticRules, dest);
-        if (Flags.modesApi()) {
-            writeRulesToParcel(deletedRules, dest);
-        }
+        writeRulesToParcel(deletedRules, dest);
         if (!Flags.modesUi()) {
             dest.writeInt(allowAlarms ? 1 : 0);
             dest.writeInt(allowMedia ? 1 : 0);
             dest.writeInt(allowSystem ? 1 : 0);
             dest.writeInt(suppressedVisualEffects);
         }
-        dest.writeInt(areChannelsBypassingDnd ? 1 : 0);
+        dest.writeInt(hasPriorityChannels ? 1 : 0);
         if (!Flags.modesUi()) {
             dest.writeBoolean(allowConversations);
             dest.writeInt(allowConversationsFrom);
-            if (Flags.modesApi()) {
-                dest.writeBoolean(allowPriorityChannels);
-            }
+            dest.writeBoolean(allowPriorityChannels);
         }
     }
 
@@ -549,17 +537,13 @@
                             (allowConversationsFrom))
                     .append("\nsuppressedVisualEffects=").append(suppressedVisualEffects);
         }
-        if (Flags.modesApi()) {
-            sb.append("\nhasPriorityChannels=").append(areChannelsBypassingDnd);
-            sb.append(",allowPriorityChannels=").append(allowPriorityChannels);
-        } else {
-            sb.append("\nareChannelsBypassingDnd=").append(areChannelsBypassingDnd);
-        }
+
+        sb.append("\nhasPriorityChannels=").append(hasPriorityChannels);
+        sb.append(",allowPriorityChannels=").append(allowPriorityChannels);
         sb.append(",\nautomaticRules=").append(rulesToString(automaticRules));
         sb.append(",\nmanualRule=").append(manualRule);
-        if (Flags.modesApi()) {
-            sb.append(",\ndeletedRules=").append(rulesToString(deletedRules));
-        }
+        sb.append(",\ndeletedRules=").append(rulesToString(deletedRules));
+
         return sb.append(']').toString();
     }
 
@@ -854,7 +838,7 @@
         final ZenModeConfig other = (ZenModeConfig) o;
         // The policy fields that live on config are compared directly because the fields will
         // contain data until MODES_UI is rolled out/cleaned up.
-        boolean eq = other.allowAlarms == allowAlarms
+        return other.allowAlarms == allowAlarms
                 && other.allowMedia == allowMedia
                 && other.allowSystem == allowSystem
                 && other.allowCalls == allowCalls
@@ -868,35 +852,23 @@
                 && Objects.equals(other.automaticRules, automaticRules)
                 && Objects.equals(other.manualRule, manualRule)
                 && other.suppressedVisualEffects == suppressedVisualEffects
-                && other.areChannelsBypassingDnd == areChannelsBypassingDnd
+                && other.hasPriorityChannels == hasPriorityChannels
                 && other.allowConversations == allowConversations
-                && other.allowConversationsFrom == allowConversationsFrom;
-        if (Flags.modesApi()) {
-            return eq
-                    && Objects.equals(other.deletedRules, deletedRules)
-                    && other.allowPriorityChannels == allowPriorityChannels;
-        }
-        return eq;
+                && other.allowConversationsFrom == allowConversationsFrom
+                && Objects.equals(other.deletedRules, deletedRules)
+                && other.allowPriorityChannels == allowPriorityChannels;
     }
 
     @Override
     public int hashCode() {
         // The policy fields that live on config are compared directly because the fields will
         // contain data until MODES_UI is rolled out/cleaned up.
-        if (Flags.modesApi()) {
-            return Objects.hash(allowAlarms, allowMedia, allowSystem, allowCalls,
-                    allowRepeatCallers, allowMessages,
-                    allowCallsFrom, allowMessagesFrom, allowReminders, allowEvents,
-                    user, automaticRules, manualRule,
-                    suppressedVisualEffects, areChannelsBypassingDnd, allowConversations,
-                    allowConversationsFrom, allowPriorityChannels);
-        }
         return Objects.hash(allowAlarms, allowMedia, allowSystem, allowCalls,
                 allowRepeatCallers, allowMessages,
                 allowCallsFrom, allowMessagesFrom, allowReminders, allowEvents,
                 user, automaticRules, manualRule,
-                suppressedVisualEffects, areChannelsBypassingDnd, allowConversations,
-                allowConversationsFrom);
+                suppressedVisualEffects, hasPriorityChannels, allowConversations,
+                allowConversationsFrom, allowPriorityChannels);
     }
 
     private static String toDayList(int[] days) {
@@ -952,10 +924,8 @@
     public static int getCurrentXmlVersion() {
         if (Flags.modesUi()) {
             return XML_VERSION_MODES_UI;
-        } else if (Flags.modesApi()) {
-            return XML_VERSION_MODES_API;
         } else {
-            return XML_VERSION_PRE_MODES;
+            return XML_VERSION_MODES_API;
         }
     }
 
@@ -1006,10 +976,8 @@
                     rt.allowMedia = safeBoolean(parser, ALLOW_ATT_MEDIA,
                             DEFAULT_ALLOW_MEDIA);
                     rt.allowSystem = safeBoolean(parser, ALLOW_ATT_SYSTEM, DEFAULT_ALLOW_SYSTEM);
-                    if (Flags.modesApi()) {
-                        rt.allowPriorityChannels = safeBoolean(parser, ALLOW_ATT_CHANNELS,
-                                DEFAULT_ALLOW_PRIORITY_CHANNELS);
-                    }
+                    rt.allowPriorityChannels = safeBoolean(parser, ALLOW_ATT_CHANNELS,
+                            DEFAULT_ALLOW_PRIORITY_CHANNELS);
 
                     // migrate old suppressed visual effects fields, if they still exist in the xml
                     Boolean allowWhenScreenOff = unsafeBoolean(parser, ALLOW_ATT_SCREEN_OFF);
@@ -1054,13 +1022,12 @@
                     } else {
                         readRuleCount++;
                     }
-                } else if (AUTOMATIC_TAG.equals(tag)
-                        || (Flags.modesApi() && AUTOMATIC_DELETED_TAG.equals(tag))) {
+                } else if (AUTOMATIC_TAG.equals(tag) || AUTOMATIC_DELETED_TAG.equals(tag)) {
                     final String id = parser.getAttributeValue(null, RULE_ATT_ID);
                     if (id != null) {
                         final ZenRule automaticRule = readRuleXml(parser);
                         automaticRule.id = id;
-                        if (Flags.modesApi() && AUTOMATIC_DELETED_TAG.equals(tag)) {
+                        if (AUTOMATIC_DELETED_TAG.equals(tag)) {
                             String deletedRuleKey = deletedRuleKey(automaticRule);
                             if (deletedRuleKey != null) {
                                 rt.deletedRules.put(deletedRuleKey, automaticRule);
@@ -1071,8 +1038,8 @@
                         }
                     }
                 } else if (STATE_TAG.equals(tag)) {
-                    rt.areChannelsBypassingDnd = safeBoolean(parser,
-                            STATE_ATT_CHANNELS_BYPASSING_DND, DEFAULT_CHANNELS_BYPASSING_DND);
+                    rt.hasPriorityChannels = safeBoolean(parser,
+                            STATE_HAS_PRIORITY_CHANNELS, DEFAULT_HAS_PRIORITY_CHANNELS);
                 }
             }
             if (type == XmlPullParser.END_TAG && ZEN_TAG.equals(tag)) {
@@ -1149,9 +1116,7 @@
         out.attributeBoolean(null, ALLOW_ATT_SYSTEM, allowSystem);
         out.attributeBoolean(null, ALLOW_ATT_CONV, allowConversations);
         out.attributeInt(null, ALLOW_ATT_CONV_FROM, allowConversationsFrom);
-        if (Flags.modesApi()) {
-            out.attributeBoolean(null, ALLOW_ATT_CHANNELS, allowPriorityChannels);
-        }
+        out.attributeBoolean(null, ALLOW_ATT_CHANNELS, allowPriorityChannels);
         out.endTag(null, ALLOW_TAG);
 
         out.startTag(null, DISALLOW_TAG);
@@ -1174,7 +1139,7 @@
             out.endTag(null, AUTOMATIC_TAG);
             writtenRuleCount++;
         }
-        if (Flags.modesApi() && !forBackup) {
+        if (!forBackup) {
             for (int i = 0; i < deletedRules.size(); i++) {
                 final ZenRule deletedRule = deletedRules.valueAt(i);
                 out.startTag(null, AUTOMATIC_DELETED_TAG);
@@ -1185,7 +1150,7 @@
         }
 
         out.startTag(null, STATE_TAG);
-        out.attributeBoolean(null, STATE_ATT_CHANNELS_BYPASSING_DND, areChannelsBypassingDnd);
+        out.attributeBoolean(null, STATE_HAS_PRIORITY_CHANNELS, hasPriorityChannels);
         out.endTag(null, STATE_TAG);
 
         out.endTag(null, ZEN_TAG);
@@ -1212,39 +1177,30 @@
         rt.creationTime = safeLong(parser, RULE_ATT_CREATION_TIME, 0);
         rt.enabler = parser.getAttributeValue(null, RULE_ATT_ENABLER);
         rt.condition = readConditionXml(parser);
-
-        if (!Flags.modesApi() && rt.zenMode != ZEN_MODE_IMPORTANT_INTERRUPTIONS
-                && Condition.isValidId(rt.conditionId, SYSTEM_AUTHORITY)) {
-            // all default rules and user created rules updated to zenMode important interruptions
-            Slog.i(TAG, "Updating zenMode of automatic rule " + rt.name);
-            rt.zenMode = ZEN_MODE_IMPORTANT_INTERRUPTIONS;
-        }
-        rt.modified = safeBoolean(parser, RULE_ATT_MODIFIED, false);
         rt.zenPolicy = readZenPolicyXml(parser);
-        if (Flags.modesApi()) {
-            rt.zenDeviceEffects = readZenDeviceEffectsXml(parser);
-            rt.allowManualInvocation = safeBoolean(parser, RULE_ATT_ALLOW_MANUAL, false);
-            rt.iconResName = parser.getAttributeValue(null, RULE_ATT_ICON);
-            rt.triggerDescription = parser.getAttributeValue(null, RULE_ATT_TRIGGER_DESC);
-            rt.type = safeInt(parser, RULE_ATT_TYPE, AutomaticZenRule.TYPE_UNKNOWN);
-            rt.userModifiedFields = safeInt(parser, RULE_ATT_USER_MODIFIED_FIELDS, 0);
-            rt.zenPolicyUserModifiedFields = safeInt(parser, POLICY_USER_MODIFIED_FIELDS, 0);
-            rt.zenDeviceEffectsUserModifiedFields = safeInt(parser,
-                    DEVICE_EFFECT_USER_MODIFIED_FIELDS, 0);
-            Long deletionInstant = tryParseLong(
-                    parser.getAttributeValue(null, RULE_ATT_DELETION_INSTANT), null);
-            if (deletionInstant != null) {
-                rt.deletionInstant = Instant.ofEpochMilli(deletionInstant);
-            }
-            if (Flags.modesUi()) {
-                rt.disabledOrigin = safeInt(parser, RULE_ATT_DISABLED_ORIGIN,
-                        ORIGIN_UNKNOWN);
-                rt.legacySuppressedEffects = safeInt(parser,
-                        RULE_ATT_LEGACY_SUPPRESSED_EFFECTS, 0);
-                rt.conditionOverride = safeInt(parser, RULE_ATT_CONDITION_OVERRIDE,
-                        ZenRule.OVERRIDE_NONE);
-            }
+        rt.zenDeviceEffects = readZenDeviceEffectsXml(parser);
+        rt.allowManualInvocation = safeBoolean(parser, RULE_ATT_ALLOW_MANUAL, false);
+        rt.iconResName = parser.getAttributeValue(null, RULE_ATT_ICON);
+        rt.triggerDescription = parser.getAttributeValue(null, RULE_ATT_TRIGGER_DESC);
+        rt.type = safeInt(parser, RULE_ATT_TYPE, AutomaticZenRule.TYPE_UNKNOWN);
+        rt.userModifiedFields = safeInt(parser, RULE_ATT_USER_MODIFIED_FIELDS, 0);
+        rt.zenPolicyUserModifiedFields = safeInt(parser, POLICY_USER_MODIFIED_FIELDS, 0);
+        rt.zenDeviceEffectsUserModifiedFields = safeInt(parser,
+                DEVICE_EFFECT_USER_MODIFIED_FIELDS, 0);
+        Long deletionInstant = tryParseLong(
+                parser.getAttributeValue(null, RULE_ATT_DELETION_INSTANT), null);
+        if (deletionInstant != null) {
+            rt.deletionInstant = Instant.ofEpochMilli(deletionInstant);
         }
+        if (Flags.modesUi()) {
+            rt.disabledOrigin = safeInt(parser, RULE_ATT_DISABLED_ORIGIN,
+                    ORIGIN_UNKNOWN);
+            rt.legacySuppressedEffects = safeInt(parser,
+                    RULE_ATT_LEGACY_SUPPRESSED_EFFECTS, 0);
+            rt.conditionOverride = safeInt(parser, RULE_ATT_CONDITION_OVERRIDE,
+                    ZenRule.OVERRIDE_NONE);
+        }
+
         return rt;
     }
 
@@ -1278,34 +1234,31 @@
         if (rule.zenPolicy != null) {
             writeZenPolicyXml(rule.zenPolicy, out);
         }
-        if (Flags.modesApi() && rule.zenDeviceEffects != null) {
+        if (rule.zenDeviceEffects != null) {
             writeZenDeviceEffectsXml(rule.zenDeviceEffects, out);
         }
-        out.attributeBoolean(null, RULE_ATT_MODIFIED, rule.modified);
-        if (Flags.modesApi()) {
-            out.attributeBoolean(null, RULE_ATT_ALLOW_MANUAL, rule.allowManualInvocation);
-            if (rule.iconResName != null) {
-                out.attribute(null, RULE_ATT_ICON, rule.iconResName);
-            }
-            if (rule.triggerDescription != null) {
-                out.attribute(null, RULE_ATT_TRIGGER_DESC, rule.triggerDescription);
-            }
-            out.attributeInt(null, RULE_ATT_TYPE, rule.type);
-            out.attributeInt(null, RULE_ATT_USER_MODIFIED_FIELDS, rule.userModifiedFields);
-            out.attributeInt(null, POLICY_USER_MODIFIED_FIELDS, rule.zenPolicyUserModifiedFields);
-            out.attributeInt(null, DEVICE_EFFECT_USER_MODIFIED_FIELDS,
-                    rule.zenDeviceEffectsUserModifiedFields);
-            if (rule.deletionInstant != null) {
-                out.attributeLong(null, RULE_ATT_DELETION_INSTANT,
-                        rule.deletionInstant.toEpochMilli());
-            }
-            if (Flags.modesUi()) {
-                out.attributeInt(null, RULE_ATT_DISABLED_ORIGIN, rule.disabledOrigin);
-                out.attributeInt(null, RULE_ATT_LEGACY_SUPPRESSED_EFFECTS,
-                        rule.legacySuppressedEffects);
-                if (rule.conditionOverride == ZenRule.OVERRIDE_ACTIVATE && !forBackup) {
-                    out.attributeInt(null, RULE_ATT_CONDITION_OVERRIDE, rule.conditionOverride);
-                }
+        out.attributeBoolean(null, RULE_ATT_ALLOW_MANUAL, rule.allowManualInvocation);
+        if (rule.iconResName != null) {
+            out.attribute(null, RULE_ATT_ICON, rule.iconResName);
+        }
+        if (rule.triggerDescription != null) {
+            out.attribute(null, RULE_ATT_TRIGGER_DESC, rule.triggerDescription);
+        }
+        out.attributeInt(null, RULE_ATT_TYPE, rule.type);
+        out.attributeInt(null, RULE_ATT_USER_MODIFIED_FIELDS, rule.userModifiedFields);
+        out.attributeInt(null, POLICY_USER_MODIFIED_FIELDS, rule.zenPolicyUserModifiedFields);
+        out.attributeInt(null, DEVICE_EFFECT_USER_MODIFIED_FIELDS,
+                rule.zenDeviceEffectsUserModifiedFields);
+        if (rule.deletionInstant != null) {
+            out.attributeLong(null, RULE_ATT_DELETION_INSTANT,
+                    rule.deletionInstant.toEpochMilli());
+        }
+        if (Flags.modesUi()) {
+            out.attributeInt(null, RULE_ATT_DISABLED_ORIGIN, rule.disabledOrigin);
+            out.attributeInt(null, RULE_ATT_LEGACY_SUPPRESSED_EFFECTS,
+                    rule.legacySuppressedEffects);
+            if (rule.conditionOverride == ZenRule.OVERRIDE_ACTIVATE && !forBackup) {
+                out.attributeInt(null, RULE_ATT_CONDITION_OVERRIDE, rule.conditionOverride);
             }
         }
     }
@@ -1320,12 +1273,8 @@
         final int state = safeInt(parser, CONDITION_ATT_STATE, -1);
         final int flags = safeInt(parser, CONDITION_ATT_FLAGS, -1);
         try {
-            if (Flags.modesApi()) {
-                final int source = safeInt(parser, CONDITION_ATT_SOURCE, Condition.SOURCE_UNKNOWN);
-                return new Condition(id, summary, line1, line2, icon, state, source, flags);
-            } else {
-                return new Condition(id, summary, line1, line2, icon, state, flags);
-            }
+            final int source = safeInt(parser, CONDITION_ATT_SOURCE, Condition.SOURCE_UNKNOWN);
+            return new Condition(id, summary, line1, line2, icon, state, source, flags);
         } catch (IllegalArgumentException e) {
             Slog.w(TAG, "Unable to read condition xml", e);
             return null;
@@ -1339,9 +1288,7 @@
         out.attribute(null, CONDITION_ATT_LINE2, c.line2);
         out.attributeInt(null, CONDITION_ATT_ICON, c.icon);
         out.attributeInt(null, CONDITION_ATT_STATE, c.state);
-        if (Flags.modesApi()) {
-            out.attributeInt(null, CONDITION_ATT_SOURCE, c.source);
-        }
+        out.attributeInt(null, CONDITION_ATT_SOURCE, c.source);
         out.attributeInt(null, CONDITION_ATT_FLAGS, c.flags);
     }
 
@@ -1363,12 +1310,11 @@
         final int system = safeInt(parser, ALLOW_ATT_SYSTEM, ZenPolicy.STATE_UNSET);
         final int events = safeInt(parser, ALLOW_ATT_EVENTS, ZenPolicy.STATE_UNSET);
         final int reminders = safeInt(parser, ALLOW_ATT_REMINDERS, ZenPolicy.STATE_UNSET);
-        if (Flags.modesApi()) {
-            final int channels = safeInt(parser, ALLOW_ATT_CHANNELS, ZenPolicy.STATE_UNSET);
-            if (channels != ZenPolicy.STATE_UNSET) {
-                builder.allowPriorityChannels(channels == STATE_ALLOW);
-                policySet = true;
-            }
+        final int channels = safeInt(parser, ALLOW_ATT_CHANNELS, ZenPolicy.STATE_UNSET);
+
+        if (channels != ZenPolicy.STATE_UNSET) {
+            builder.allowPriorityChannels(channels == STATE_ALLOW);
+            policySet = true;
         }
 
         if (calls != ZenPolicy.PEOPLE_TYPE_UNSET) {
@@ -1478,10 +1424,7 @@
         writeZenPolicyState(SHOW_ATT_AMBIENT, policy.getVisualEffectAmbient(), out);
         writeZenPolicyState(SHOW_ATT_NOTIFICATION_LIST, policy.getVisualEffectNotificationList(),
                 out);
-
-        if (Flags.modesApi()) {
-            writeZenPolicyState(ALLOW_ATT_CHANNELS, policy.getPriorityChannelsAllowed(), out);
-        }
+        writeZenPolicyState(ALLOW_ATT_CHANNELS, policy.getPriorityChannelsAllowed(), out);
     }
 
     private static void writeZenPolicyState(String attr, int val, TypedXmlSerializer out)
@@ -1495,7 +1438,7 @@
             if (val != ZenPolicy.CONVERSATION_SENDERS_UNSET) {
                 out.attributeInt(null, attr, val);
             }
-        } else if (Flags.modesApi() && Objects.equals(attr, ALLOW_ATT_CHANNELS)) {
+        } else if (Objects.equals(attr, ALLOW_ATT_CHANNELS)) {
             if (val != ZenPolicy.STATE_UNSET) {
                 out.attributeInt(null, attr, val);
             }
@@ -1506,7 +1449,6 @@
         }
     }
 
-    @FlaggedApi(Flags.FLAG_MODES_API)
     @Nullable
     private static ZenDeviceEffects readZenDeviceEffectsXml(TypedXmlPullParser parser) {
         ZenDeviceEffects deviceEffects =
@@ -1539,7 +1481,6 @@
         return deviceEffects.hasEffects() ? deviceEffects : null;
     }
 
-    @FlaggedApi(Flags.FLAG_MODES_API)
     private static void writeZenDeviceEffectsXml(ZenDeviceEffects deviceEffects,
             TypedXmlSerializer out) throws IOException {
         writeBooleanIfTrue(out, DEVICE_EFFECT_DISPLAY_GRAYSCALE,
@@ -1732,9 +1673,7 @@
                     (suppressedVisualEffects & Policy.SUPPRESSED_EFFECT_NOTIFICATION_LIST) == 0);
         }
 
-        if (Flags.modesApi()) {
-            builder.allowPriorityChannels(allowPriorityChannels);
-        }
+        builder.allowPriorityChannels(allowPriorityChannels);
         return builder.build();
     }
 
@@ -1860,12 +1799,9 @@
             suppressedVisualEffects |= Policy.SUPPRESSED_EFFECT_NOTIFICATION_LIST;
         }
 
-        int state = defaultPolicy.state;
-        if (Flags.modesApi()) {
-            state = Policy.policyState(defaultPolicy.hasPriorityChannels(),
-                    ZenPolicy.stateToBoolean(zenPolicy.getPriorityChannelsAllowed(),
-                            DEFAULT_ALLOW_PRIORITY_CHANNELS));
-        }
+        int state = Policy.policyState(defaultPolicy.hasPriorityChannels(),
+                ZenPolicy.stateToBoolean(zenPolicy.getPriorityChannelsAllowed(),
+                        DEFAULT_ALLOW_PRIORITY_CHANNELS));
 
         return new NotificationManager.Policy(priorityCategories, callSenders,
                 messageSenders, suppressedVisualEffects, state, conversationSenders);
@@ -1930,7 +1866,7 @@
             priorityMessageSenders = peopleTypeToPrioritySenders(
                     manualRule.zenPolicy.getPriorityMessageSenders(), DEFAULT_SOURCE);
 
-            state = Policy.policyState(areChannelsBypassingDnd,
+            state = Policy.policyState(hasPriorityChannels,
                     manualRule.zenPolicy.getPriorityChannelsAllowed() != STATE_DISALLOW);
 
             boolean suppressFullScreenIntent = !manualRule.zenPolicy.isVisualEffectAllowed(
@@ -2030,10 +1966,7 @@
             priorityConversationSenders = zenPolicyConversationSendersToNotificationPolicy(
                     getAllowConversationsFrom(), priorityConversationSenders);
 
-            state = areChannelsBypassingDnd ? Policy.STATE_CHANNELS_BYPASSING_DND : 0;
-            if (Flags.modesApi()) {
-                state = Policy.policyState(areChannelsBypassingDnd, allowPriorityChannels);
-            }
+            state = Policy.policyState(hasPriorityChannels, allowPriorityChannels);
             suppressedVisualEffects = getSuppressedVisualEffects();
         }
 
@@ -2114,13 +2047,11 @@
                     policy.priorityConversationSenders,
                     allowConversationsFrom);
             if (policy.state != Policy.STATE_UNSET) {
-                if (Flags.modesApi()) {
-                    setAllowPriorityChannels(policy.allowPriorityChannels());
-                }
+                setAllowPriorityChannels(policy.allowPriorityChannels());
             }
         }
         if (policy.state != Policy.STATE_UNSET) {
-            areChannelsBypassingDnd = (policy.state & Policy.STATE_CHANNELS_BYPASSING_DND) != 0;
+            hasPriorityChannels = (policy.state & Policy.STATE_HAS_PRIORITY_CHANNELS) != 0;
         }
     }
 
@@ -2618,8 +2549,9 @@
         @UnsupportedAppUsage
         public boolean enabled;
         @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
+        // TODO: b/368247671 - Obsolete with MODES_UI; delete when the flag is inlined
         @Deprecated
-        public boolean snoozing; // user manually disabled this instance. Obsolete with MODES_UI
+        public boolean snoozing; // user manually disabled this instance.
         @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
         public String name;              // required for automatic
         @UnsupportedAppUsage
@@ -2635,9 +2567,7 @@
         // package name, only used for manual rules when they have turned DND on.
         public String enabler;
         public ZenPolicy zenPolicy;
-        @FlaggedApi(Flags.FLAG_MODES_API)
         @Nullable public ZenDeviceEffects zenDeviceEffects;
-        public boolean modified;    // rule has been modified from initial creation
         public String pkg;
         @AutomaticZenRule.Type
         public int type = AutomaticZenRule.TYPE_UNKNOWN;
@@ -2689,27 +2619,22 @@
                 enabler = source.readString();
             }
             zenPolicy = source.readParcelable(null, android.service.notification.ZenPolicy.class);
-            if (Flags.modesApi()) {
-                zenDeviceEffects = source.readParcelable(null, ZenDeviceEffects.class);
-            }
-            modified = source.readInt() == 1;
+            zenDeviceEffects = source.readParcelable(null, ZenDeviceEffects.class);
             pkg = source.readString();
-            if (Flags.modesApi()) {
-                allowManualInvocation = source.readBoolean();
-                iconResName = source.readString();
-                triggerDescription = source.readString();
-                type = source.readInt();
-                userModifiedFields = source.readInt();
-                zenPolicyUserModifiedFields = source.readInt();
-                zenDeviceEffectsUserModifiedFields = source.readInt();
-                if (source.readInt() == 1) {
-                    deletionInstant = Instant.ofEpochMilli(source.readLong());
-                }
-                if (Flags.modesUi()) {
-                    disabledOrigin = source.readInt();
-                    legacySuppressedEffects = source.readInt();
-                    conditionOverride = source.readInt();
-                }
+            allowManualInvocation = source.readBoolean();
+            iconResName = source.readString();
+            triggerDescription = source.readString();
+            type = source.readInt();
+            userModifiedFields = source.readInt();
+            zenPolicyUserModifiedFields = source.readInt();
+            zenDeviceEffectsUserModifiedFields = source.readInt();
+            if (source.readInt() == 1) {
+                deletionInstant = Instant.ofEpochMilli(source.readLong());
+            }
+            if (Flags.modesUi()) {
+                disabledOrigin = source.readInt();
+                legacySuppressedEffects = source.readInt();
+                conditionOverride = source.readInt();
             }
         }
 
@@ -2722,7 +2647,6 @@
          *          switches).
          * </ul>
          */
-        @FlaggedApi(Flags.FLAG_MODES_API)
         public boolean canBeUpdatedByApp() {
             // The rule is considered updateable if its bitmask has no user modifications, and
             // the bitmasks of the policy and device effects have no modification.
@@ -2765,30 +2689,25 @@
                 dest.writeInt(0);
             }
             dest.writeParcelable(zenPolicy, 0);
-            if (Flags.modesApi()) {
-                dest.writeParcelable(zenDeviceEffects, 0);
-            }
-            dest.writeInt(modified ? 1 : 0);
+            dest.writeParcelable(zenDeviceEffects, 0);
             dest.writeString(pkg);
-            if (Flags.modesApi()) {
-                dest.writeBoolean(allowManualInvocation);
-                dest.writeString(iconResName);
-                dest.writeString(triggerDescription);
-                dest.writeInt(type);
-                dest.writeInt(userModifiedFields);
-                dest.writeInt(zenPolicyUserModifiedFields);
-                dest.writeInt(zenDeviceEffectsUserModifiedFields);
-                if (deletionInstant != null) {
-                    dest.writeInt(1);
-                    dest.writeLong(deletionInstant.toEpochMilli());
-                } else {
-                    dest.writeInt(0);
-                }
-                if (Flags.modesUi()) {
-                    dest.writeInt(disabledOrigin);
-                    dest.writeInt(legacySuppressedEffects);
-                    dest.writeInt(conditionOverride);
-                }
+            dest.writeBoolean(allowManualInvocation);
+            dest.writeString(iconResName);
+            dest.writeString(triggerDescription);
+            dest.writeInt(type);
+            dest.writeInt(userModifiedFields);
+            dest.writeInt(zenPolicyUserModifiedFields);
+            dest.writeInt(zenDeviceEffectsUserModifiedFields);
+            if (deletionInstant != null) {
+                dest.writeInt(1);
+                dest.writeLong(deletionInstant.toEpochMilli());
+            } else {
+                dest.writeInt(0);
+            }
+            if (Flags.modesUi()) {
+                dest.writeInt(disabledOrigin);
+                dest.writeInt(legacySuppressedEffects);
+                dest.writeInt(conditionOverride);
             }
         }
 
@@ -2816,35 +2735,31 @@
                     .append(",creationTime=").append(creationTime)
                     .append(",enabler=").append(enabler)
                     .append(",zenPolicy=").append(zenPolicy)
-                    .append(",modified=").append(modified)
-                    .append(",condition=").append(condition);
-
-            if (Flags.modesApi()) {
-                sb.append(",deviceEffects=").append(zenDeviceEffects)
-                        .append(",allowManualInvocation=").append(allowManualInvocation)
-                        .append(",iconResName=").append(iconResName)
-                        .append(",triggerDescription=").append(triggerDescription)
-                        .append(",type=").append(type);
-                if (userModifiedFields != 0) {
-                    sb.append(",userModifiedFields=")
-                            .append(AutomaticZenRule.fieldsToString(userModifiedFields));
-                }
-                if (zenPolicyUserModifiedFields != 0) {
-                    sb.append(",zenPolicyUserModifiedFields=")
-                            .append(ZenPolicy.fieldsToString(zenPolicyUserModifiedFields));
-                }
-                if (zenDeviceEffectsUserModifiedFields != 0) {
-                    sb.append(",zenDeviceEffectsUserModifiedFields=")
-                            .append(ZenDeviceEffects.fieldsToString(
-                                    zenDeviceEffectsUserModifiedFields));
-                }
-                if (deletionInstant != null) {
-                    sb.append(",deletionInstant=").append(deletionInstant);
-                }
-                if (Flags.modesUi()) {
-                    sb.append(",disabledOrigin=").append(disabledOrigin);
-                    sb.append(",legacySuppressedEffects=").append(legacySuppressedEffects);
-                }
+                    .append(",condition=").append(condition)
+                    .append(",deviceEffects=").append(zenDeviceEffects)
+                    .append(",allowManualInvocation=").append(allowManualInvocation)
+                    .append(",iconResName=").append(iconResName)
+                    .append(",triggerDescription=").append(triggerDescription)
+                    .append(",type=").append(type);
+            if (userModifiedFields != 0) {
+                sb.append(",userModifiedFields=")
+                        .append(AutomaticZenRule.fieldsToString(userModifiedFields));
+            }
+            if (zenPolicyUserModifiedFields != 0) {
+                sb.append(",zenPolicyUserModifiedFields=")
+                        .append(ZenPolicy.fieldsToString(zenPolicyUserModifiedFields));
+            }
+            if (zenDeviceEffectsUserModifiedFields != 0) {
+                sb.append(",zenDeviceEffectsUserModifiedFields=")
+                        .append(ZenDeviceEffects.fieldsToString(
+                                zenDeviceEffectsUserModifiedFields));
+            }
+            if (deletionInstant != null) {
+                sb.append(",deletionInstant=").append(deletionInstant);
+            }
+            if (Flags.modesUi()) {
+                sb.append(",disabledOrigin=").append(disabledOrigin);
+                sb.append(",legacySuppressedEffects=").append(legacySuppressedEffects);
             }
 
             return sb.append(']').toString();
@@ -2869,7 +2784,7 @@
             proto.write(ZenRuleProto.CREATION_TIME_MS, creationTime);
             proto.write(ZenRuleProto.ENABLED, enabled);
             proto.write(ZenRuleProto.ENABLER, enabler);
-            if (Flags.modesApi() && Flags.modesUi()) {
+            if (Flags.modesUi()) {
                 proto.write(ZenRuleProto.IS_SNOOZING, conditionOverride == OVERRIDE_DEACTIVATE);
             } else {
                 proto.write(ZenRuleProto.IS_SNOOZING, snoozing);
@@ -2887,7 +2802,6 @@
             if (zenPolicy != null) {
                 zenPolicy.dumpDebug(proto, ZenRuleProto.ZEN_POLICY);
             }
-            proto.write(ZenRuleProto.MODIFIED, modified);
             proto.end(token);
         }
 
@@ -2908,27 +2822,22 @@
                     && Objects.equals(other.enabler, enabler)
                     && Objects.equals(other.zenPolicy, zenPolicy)
                     && Objects.equals(other.pkg, pkg)
-                    && other.modified == modified;
+                    && Objects.equals(other.zenDeviceEffects, zenDeviceEffects)
+                    && other.allowManualInvocation == allowManualInvocation
+                    && Objects.equals(other.iconResName, iconResName)
+                    && Objects.equals(other.triggerDescription, triggerDescription)
+                    && other.type == type
+                    && other.userModifiedFields == userModifiedFields
+                    && other.zenPolicyUserModifiedFields == zenPolicyUserModifiedFields
+                    && other.zenDeviceEffectsUserModifiedFields
+                        == zenDeviceEffectsUserModifiedFields
+                    && Objects.equals(other.deletionInstant, deletionInstant);
 
-            if (Flags.modesApi()) {
+            if (Flags.modesUi()) {
                 finalEquals = finalEquals
-                        && Objects.equals(other.zenDeviceEffects, zenDeviceEffects)
-                        && other.allowManualInvocation == allowManualInvocation
-                        && Objects.equals(other.iconResName, iconResName)
-                        && Objects.equals(other.triggerDescription, triggerDescription)
-                        && other.type == type
-                        && other.userModifiedFields == userModifiedFields
-                        && other.zenPolicyUserModifiedFields == zenPolicyUserModifiedFields
-                        && other.zenDeviceEffectsUserModifiedFields
-                            == zenDeviceEffectsUserModifiedFields
-                        && Objects.equals(other.deletionInstant, deletionInstant);
-
-                if (Flags.modesUi()) {
-                    finalEquals = finalEquals
-                            && other.disabledOrigin == disabledOrigin
-                            && other.legacySuppressedEffects == legacySuppressedEffects
-                            && other.conditionOverride == conditionOverride;
-                }
+                        && other.disabledOrigin == disabledOrigin
+                        && other.legacySuppressedEffects == legacySuppressedEffects
+                        && other.conditionOverride == conditionOverride;
             }
 
             return finalEquals;
@@ -2936,26 +2845,22 @@
 
         @Override
         public int hashCode() {
-            if (Flags.modesApi()) {
-                if (Flags.modesUi()) {
-                    return Objects.hash(enabled, snoozing, name, zenMode, conditionId, condition,
-                            component, configurationActivity, pkg, id, enabler, zenPolicy,
-                            zenDeviceEffects, modified, allowManualInvocation, iconResName,
-                            triggerDescription, type, userModifiedFields,
-                            zenPolicyUserModifiedFields, zenDeviceEffectsUserModifiedFields,
-                            deletionInstant, disabledOrigin, legacySuppressedEffects,
-                            conditionOverride);
-                } else {
-                    return Objects.hash(enabled, snoozing, name, zenMode, conditionId, condition,
-                            component, configurationActivity, pkg, id, enabler, zenPolicy,
-                            zenDeviceEffects, modified, allowManualInvocation, iconResName,
-                            triggerDescription, type, userModifiedFields,
-                            zenPolicyUserModifiedFields, zenDeviceEffectsUserModifiedFields,
-                            deletionInstant);
-                }
+            if (Flags.modesUi()) {
+                return Objects.hash(enabled, snoozing, name, zenMode, conditionId, condition,
+                        component, configurationActivity, pkg, id, enabler, zenPolicy,
+                        zenDeviceEffects, allowManualInvocation, iconResName,
+                        triggerDescription, type, userModifiedFields,
+                        zenPolicyUserModifiedFields, zenDeviceEffectsUserModifiedFields,
+                        deletionInstant, disabledOrigin, legacySuppressedEffects,
+                        conditionOverride);
+            } else {
+                return Objects.hash(enabled, snoozing, name, zenMode, conditionId, condition,
+                        component, configurationActivity, pkg, id, enabler, zenPolicy,
+                        zenDeviceEffects, allowManualInvocation, iconResName,
+                        triggerDescription, type, userModifiedFields,
+                        zenPolicyUserModifiedFields, zenDeviceEffectsUserModifiedFields,
+                        deletionInstant);
             }
-            return Objects.hash(enabled, snoozing, name, zenMode, conditionId, condition,
-                    component, configurationActivity, pkg, id, enabler, zenPolicy, modified);
         }
 
         /** Returns a deep copy of the {@link ZenRule}. */
@@ -2971,7 +2876,7 @@
         }
 
         public boolean isActive() {
-            if (Flags.modesApi() && Flags.modesUi()) {
+            if (Flags.modesUi()) {
                 if (!enabled || getPkg() == null) {
                     return false;
                 } else if (conditionOverride == OVERRIDE_ACTIVATE) {
@@ -2989,7 +2894,7 @@
         @VisibleForTesting(otherwise = VisibleForTesting.NONE)
         @ConditionOverride
         public int getConditionOverride() {
-            if (Flags.modesApi() && Flags.modesUi()) {
+            if (Flags.modesUi()) {
                 return conditionOverride;
             } else {
                 return snoozing ? OVERRIDE_DEACTIVATE : OVERRIDE_NONE;
@@ -2997,7 +2902,7 @@
         }
 
         public void setConditionOverride(@ConditionOverride int value) {
-            if (Flags.modesApi() && Flags.modesUi()) {
+            if (Flags.modesUi()) {
                 conditionOverride = value;
             } else {
                 if (value == OVERRIDE_ACTIVATE) {
@@ -3026,7 +2931,7 @@
          * manual deactivation (which used to be called "snoozing").
          */
         public void reconsiderConditionOverride() {
-            if (Flags.modesApi() && Flags.modesUi()) {
+            if (Flags.modesUi()) {
                 if (conditionOverride == OVERRIDE_ACTIVATE && isTrueOrUnknown()) {
                     resetConditionOverride();
                 } else if (conditionOverride == OVERRIDE_DEACTIVATE && !isTrueOrUnknown()) {
@@ -3085,11 +2990,8 @@
                 & NotificationManager.Policy.PRIORITY_CATEGORY_REPEAT_CALLERS) != 0;
         boolean allowConversations = (policy.priorityConversationSenders
                 & Policy.PRIORITY_CATEGORY_CONVERSATIONS) != 0;
-        boolean areChannelsBypassingDnd = (policy.state & Policy.STATE_CHANNELS_BYPASSING_DND) != 0;
-        if (Flags.modesApi()) {
-            areChannelsBypassingDnd = policy.hasPriorityChannels()
-                    && policy.allowPriorityChannels();
-        }
+        boolean areChannelsBypassingDnd =
+                policy.hasPriorityChannels() && policy.allowPriorityChannels();
         boolean allowSystem = (policy.priorityCategories & Policy.PRIORITY_CATEGORY_SYSTEM) != 0;
         return !allowReminders && !allowCalls && !allowMessages && !allowEvents
                 && !allowRepeatCallers && !areChannelsBypassingDnd && !allowSystem
@@ -3129,15 +3031,12 @@
                     && !policy.isCategoryAllowed(PRIORITY_CATEGORY_EVENTS, false)
                     && !policy.isCategoryAllowed(PRIORITY_CATEGORY_REPEAT_CALLERS, false)
                     && !policy.isCategoryAllowed(PRIORITY_CATEGORY_SYSTEM, false)
-                    && !(config.areChannelsBypassingDnd && policy.getPriorityChannelsAllowed()
+                    && !(config.hasPriorityChannels && policy.getPriorityChannelsAllowed()
                     == STATE_ALLOW);
 
         } else {
-            boolean areChannelsBypassingDnd = config.areChannelsBypassingDnd;
-            if (Flags.modesApi()) {
-                areChannelsBypassingDnd = config.areChannelsBypassingDnd
-                        && config.isAllowPriorityChannels();
-            }
+            boolean areChannelsBypassingDnd = config.hasPriorityChannels
+                    && config.isAllowPriorityChannels();
             return !config.isAllowReminders() && !config.isAllowCalls() && !config.isAllowMessages()
                     && !config.isAllowEvents() && !config.isAllowRepeatCallers()
                     && !areChannelsBypassingDnd && !config.isAllowSystem();
diff --git a/core/java/android/service/notification/ZenModeDiff.java b/core/java/android/service/notification/ZenModeDiff.java
index 31acd24..c159e40 100644
--- a/core/java/android/service/notification/ZenModeDiff.java
+++ b/core/java/android/service/notification/ZenModeDiff.java
@@ -16,7 +16,6 @@
 
 package android.service.notification;
 
-import android.annotation.FlaggedApi;
 import android.annotation.IntDef;
 import android.annotation.Nullable;
 import android.app.Flags;
@@ -249,7 +248,7 @@
         public static final String FIELD_ALLOW_MESSAGES_FROM = "allowMessagesFrom";
         public static final String FIELD_ALLOW_CONVERSATIONS_FROM = "allowConversationsFrom";
         public static final String FIELD_SUPPRESSED_VISUAL_EFFECTS = "suppressedVisualEffects";
-        public static final String FIELD_ARE_CHANNELS_BYPASSING_DND = "areChannelsBypassingDnd";
+        public static final String FIELD_HAS_PRIORITY_CHANNELS = "hasPriorityChannels";
         public static final String FIELD_ALLOW_PRIORITY_CHANNELS = "allowPriorityChannels";
         private static final Set<String> PEOPLE_TYPE_FIELDS =
                 Set.of(FIELD_ALLOW_CALLS_FROM, FIELD_ALLOW_MESSAGES_FROM);
@@ -323,15 +322,13 @@
                 addField(FIELD_SUPPRESSED_VISUAL_EFFECTS,
                         new FieldDiff<>(from.suppressedVisualEffects, to.suppressedVisualEffects));
             }
-            if (from.areChannelsBypassingDnd != to.areChannelsBypassingDnd) {
-                addField(FIELD_ARE_CHANNELS_BYPASSING_DND,
-                        new FieldDiff<>(from.areChannelsBypassingDnd, to.areChannelsBypassingDnd));
+            if (from.hasPriorityChannels != to.hasPriorityChannels) {
+                addField(FIELD_HAS_PRIORITY_CHANNELS,
+                        new FieldDiff<>(from.hasPriorityChannels, to.hasPriorityChannels));
             }
-            if (Flags.modesApi()) {
-                if (from.allowPriorityChannels != to.allowPriorityChannels) {
-                    addField(FIELD_ALLOW_PRIORITY_CHANNELS,
-                            new FieldDiff<>(from.allowPriorityChannels, to.allowPriorityChannels));
-                }
+            if (from.allowPriorityChannels != to.allowPriorityChannels) {
+                addField(FIELD_ALLOW_PRIORITY_CHANNELS,
+                        new FieldDiff<>(from.allowPriorityChannels, to.allowPriorityChannels));
             }
 
             // Compare automatic and manual rules
@@ -491,7 +488,6 @@
         public static final String FIELD_ENABLER = "enabler";
         public static final String FIELD_ZEN_POLICY = "zenPolicy";
         public static final String FIELD_ZEN_DEVICE_EFFECTS = "zenDeviceEffects";
-        public static final String FIELD_MODIFIED = "modified";
         public static final String FIELD_PKG = "pkg";
         public static final String FIELD_ALLOW_MANUAL = "allowManualInvocation";
         public static final String FIELD_ICON_RES = "iconResName";
@@ -532,7 +528,7 @@
             if (from.enabled != to.enabled) {
                 addField(FIELD_ENABLED, new FieldDiff<>(from.enabled, to.enabled));
             }
-            if (Flags.modesApi() && Flags.modesUi()) {
+            if (Flags.modesUi()) {
                 if (from.conditionOverride != to.conditionOverride) {
                     addField(FIELD_CONDITION_OVERRIDE,
                             new FieldDiff<>(from.conditionOverride, to.conditionOverride));
@@ -572,51 +568,40 @@
             if (!Objects.equals(from.enabler, to.enabler)) {
                 addField(FIELD_ENABLER, new FieldDiff<>(from.enabler, to.enabler));
             }
-            if (android.app.Flags.modesApi()) {
-                PolicyDiff policyDiff = new PolicyDiff(from.zenPolicy, to.zenPolicy);
-                if (policyDiff.hasDiff()) {
-                    addField(FIELD_ZEN_POLICY, new FieldDiff<>(from.zenPolicy, to.zenPolicy,
-                            policyDiff));
-                }
-            } else {
-                if (!Objects.equals(from.zenPolicy, to.zenPolicy)) {
-                    addField(FIELD_ZEN_POLICY, new FieldDiff<>(from.zenPolicy, to.zenPolicy));
-                }
-            }
-            if (from.modified != to.modified) {
-                addField(FIELD_MODIFIED, new FieldDiff<>(from.modified, to.modified));
+            PolicyDiff policyDiff = new PolicyDiff(from.zenPolicy, to.zenPolicy);
+            if (policyDiff.hasDiff()) {
+                addField(FIELD_ZEN_POLICY, new FieldDiff<>(from.zenPolicy, to.zenPolicy,
+                        policyDiff));
             }
             if (!Objects.equals(from.pkg, to.pkg)) {
                 addField(FIELD_PKG, new FieldDiff<>(from.pkg, to.pkg));
             }
-            if (android.app.Flags.modesApi()) {
-                DeviceEffectsDiff deviceEffectsDiff = new DeviceEffectsDiff(from.zenDeviceEffects,
-                        to.zenDeviceEffects);
-                if (deviceEffectsDiff.hasDiff()) {
-                    addField(FIELD_ZEN_DEVICE_EFFECTS,
-                            new FieldDiff<>(from.zenDeviceEffects, to.zenDeviceEffects,
-                                    deviceEffectsDiff));
-                }
-                if (!Objects.equals(from.triggerDescription, to.triggerDescription)) {
-                    addField(FIELD_TRIGGER_DESCRIPTION,
-                            new FieldDiff<>(from.triggerDescription, to.triggerDescription));
-                }
-                if (from.type != to.type) {
-                    addField(FIELD_TYPE, new FieldDiff<>(from.type, to.type));
-                }
-                if (from.allowManualInvocation != to.allowManualInvocation) {
-                    addField(FIELD_ALLOW_MANUAL,
-                            new FieldDiff<>(from.allowManualInvocation, to.allowManualInvocation));
-                }
-                if (!Objects.equals(from.iconResName, to.iconResName)) {
-                    addField(FIELD_ICON_RES, new FieldDiff<>(from.iconResName, to.iconResName));
-                }
-                if (android.app.Flags.modesUi()) {
-                    if (from.legacySuppressedEffects != to.legacySuppressedEffects) {
-                        addField(FIELD_LEGACY_SUPPRESSED_EFFECTS,
-                                new FieldDiff<>(from.legacySuppressedEffects,
-                                        to.legacySuppressedEffects));
-                    }
+            DeviceEffectsDiff deviceEffectsDiff = new DeviceEffectsDiff(from.zenDeviceEffects,
+                    to.zenDeviceEffects);
+            if (deviceEffectsDiff.hasDiff()) {
+                addField(FIELD_ZEN_DEVICE_EFFECTS,
+                        new FieldDiff<>(from.zenDeviceEffects, to.zenDeviceEffects,
+                                deviceEffectsDiff));
+            }
+            if (!Objects.equals(from.triggerDescription, to.triggerDescription)) {
+                addField(FIELD_TRIGGER_DESCRIPTION,
+                        new FieldDiff<>(from.triggerDescription, to.triggerDescription));
+            }
+            if (from.type != to.type) {
+                addField(FIELD_TYPE, new FieldDiff<>(from.type, to.type));
+            }
+            if (from.allowManualInvocation != to.allowManualInvocation) {
+                addField(FIELD_ALLOW_MANUAL,
+                        new FieldDiff<>(from.allowManualInvocation, to.allowManualInvocation));
+            }
+            if (!Objects.equals(from.iconResName, to.iconResName)) {
+                addField(FIELD_ICON_RES, new FieldDiff<>(from.iconResName, to.iconResName));
+            }
+            if (android.app.Flags.modesUi()) {
+                if (from.legacySuppressedEffects != to.legacySuppressedEffects) {
+                    addField(FIELD_LEGACY_SUPPRESSED_EFFECTS,
+                            new FieldDiff<>(from.legacySuppressedEffects,
+                                    to.legacySuppressedEffects));
                 }
             }
         }
@@ -702,7 +687,6 @@
      * Diff class representing a change between two
      * {@link android.service.notification.ZenDeviceEffects}.
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static class DeviceEffectsDiff extends BaseDiff {
         public static final String FIELD_GRAYSCALE = "mGrayscale";
         public static final String FIELD_SUPPRESS_AMBIENT_DISPLAY = "mSuppressAmbientDisplay";
@@ -843,7 +827,6 @@
     /**
      * Diff class representing a change between two {@link android.service.notification.ZenPolicy}.
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static class PolicyDiff extends BaseDiff {
         public static final String FIELD_PRIORITY_CATEGORY_REMINDERS =
                 "mPriorityCategories_Reminders";
diff --git a/core/java/android/service/notification/ZenPolicy.java b/core/java/android/service/notification/ZenPolicy.java
index 4cff67e..6b98c41 100644
--- a/core/java/android/service/notification/ZenPolicy.java
+++ b/core/java/android/service/notification/ZenPolicy.java
@@ -16,13 +16,11 @@
 
 package android.service.notification;
 
-import android.annotation.FlaggedApi;
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.SuppressLint;
 import android.annotation.TestApi;
-import android.app.Flags;
 import android.app.Notification;
 import android.app.NotificationChannel;
 import android.os.Parcel;
@@ -78,91 +76,74 @@
      * the same time.
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int FIELD_MESSAGES = 1 << 0;
     /**
      * Covers modifications to CALL_SENDERS and PRIORITY_CATEGORY_CALLS, which are set at
      * the same time.
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int FIELD_CALLS = 1 << 1;
     /**
      * Covers modifications to CONVERSATION_SENDERS and PRIORITY_CATEGORY_CONVERSATIONS, which are
      * set at the same time.
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int FIELD_CONVERSATIONS = 1 << 2;
     /**
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int FIELD_ALLOW_CHANNELS = 1 << 3;
     /**
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int FIELD_PRIORITY_CATEGORY_REMINDERS = 1 << 4;
     /**
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int FIELD_PRIORITY_CATEGORY_EVENTS = 1 << 5;
     /**
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int FIELD_PRIORITY_CATEGORY_REPEAT_CALLERS = 1 << 6;
     /**
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int FIELD_PRIORITY_CATEGORY_ALARMS = 1 << 7;
     /**
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int FIELD_PRIORITY_CATEGORY_MEDIA = 1 << 8;
     /**
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int FIELD_PRIORITY_CATEGORY_SYSTEM = 1 << 9;
     /**
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int FIELD_VISUAL_EFFECT_FULL_SCREEN_INTENT = 1 << 10;
     /**
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int FIELD_VISUAL_EFFECT_LIGHTS = 1 << 11;
     /**
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int FIELD_VISUAL_EFFECT_PEEK = 1 << 12;
     /**
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int FIELD_VISUAL_EFFECT_STATUS_BAR = 1 << 13;
     /**
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int FIELD_VISUAL_EFFECT_BADGE = 1 << 14;
     /**
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int FIELD_VISUAL_EFFECT_AMBIENT = 1 << 15;
     /**
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int FIELD_VISUAL_EFFECT_NOTIFICATION_LIST = 1 << 16;
 
     private List<Integer> mPriorityCategories;
@@ -170,7 +151,6 @@
     private @PeopleType int mPriorityMessages = PEOPLE_TYPE_UNSET;
     private @PeopleType int mPriorityCalls = PEOPLE_TYPE_UNSET;
     private @ConversationSenders int mConversationSenders = CONVERSATION_SENDERS_UNSET;
-    @FlaggedApi(Flags.FLAG_MODES_API)
     private @ChannelType int mAllowChannels = CHANNEL_POLICY_UNSET;
 
     /** @hide */
@@ -358,7 +338,6 @@
      *
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int CHANNEL_POLICY_UNSET = 0;
 
     /**
@@ -367,7 +346,6 @@
      *
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int CHANNEL_POLICY_PRIORITY = 1;
 
     /**
@@ -376,7 +354,6 @@
      *
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static final int CHANNEL_POLICY_NONE = 2;
 
     /** @hide */
@@ -386,7 +363,6 @@
     }
 
     /** @hide */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public ZenPolicy(List<Integer> priorityCategories, List<Integer> visualEffects,
                      @PeopleType int priorityMessages, @PeopleType int priorityCalls,
                      @ConversationSenders int conversationSenders, @ChannelType int allowChannels) {
@@ -409,7 +385,6 @@
      *
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static ZenPolicy getBasePolicyInterruptionFilterAlarms() {
         return new ZenPolicy.Builder()
                 .disallowAllSounds()
@@ -430,7 +405,6 @@
      *
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static ZenPolicy getBasePolicyInterruptionFilterNone() {
         return new ZenPolicy.Builder()
                 .disallowAllSounds()
@@ -628,7 +602,6 @@
      * channels may bypass; if {@link #STATE_DISALLOW}, then even notifications from channels
      * with {@link NotificationChannel#canBypassDnd()} will be intercepted.
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public @State int getPriorityChannelsAllowed() {
         switch (mAllowChannels) {
             case CHANNEL_POLICY_PRIORITY:
@@ -695,14 +668,10 @@
          * Builds the current ZenPolicy.
          */
         public @NonNull ZenPolicy build() {
-            if (Flags.modesApi()) {
-                return new ZenPolicy(new ArrayList<>(mZenPolicy.mPriorityCategories),
-                        new ArrayList<>(mZenPolicy.mVisualEffects),
-                        mZenPolicy.mPriorityMessages, mZenPolicy.mPriorityCalls,
-                        mZenPolicy.mConversationSenders, mZenPolicy.mAllowChannels);
-            } else {
-                return mZenPolicy.copy();
-            }
+            return new ZenPolicy(new ArrayList<>(mZenPolicy.mPriorityCategories),
+                    new ArrayList<>(mZenPolicy.mVisualEffects),
+                    mZenPolicy.mPriorityMessages, mZenPolicy.mPriorityCalls,
+                    mZenPolicy.mConversationSenders, mZenPolicy.mAllowChannels);
         }
 
         /**
@@ -1054,7 +1023,6 @@
          * Set whether priority channels are permitted to break through DND.
          */
         @SuppressLint("BuilderSetStyle")
-        @FlaggedApi(Flags.FLAG_MODES_API)
         public @NonNull Builder allowPriorityChannels(boolean allow) {
             mZenPolicy.mAllowChannels = allow ? CHANNEL_POLICY_PRIORITY : CHANNEL_POLICY_NONE;
             return this;
@@ -1079,38 +1047,21 @@
         dest.writeInt(mPriorityMessages);
         dest.writeInt(mPriorityCalls);
         dest.writeInt(mConversationSenders);
-        if (Flags.modesApi()) {
-            dest.writeInt(mAllowChannels);
-        }
+        dest.writeInt(mAllowChannels);
     }
 
     public static final @NonNull Creator<ZenPolicy> CREATOR =
             new Creator<ZenPolicy>() {
                 @Override
                 public ZenPolicy createFromParcel(Parcel source) {
-                    ZenPolicy policy;
-                    if (Flags.modesApi()) {
-                        policy = new ZenPolicy(
-                                trimList(source.readArrayList(Integer.class.getClassLoader(),
-                                        Integer.class), NUM_PRIORITY_CATEGORIES),
-                                trimList(source.readArrayList(Integer.class.getClassLoader(),
-                                        Integer.class), NUM_VISUAL_EFFECTS),
-                                source.readInt(), source.readInt(), source.readInt(),
-                                source.readInt()
+                    return new ZenPolicy(
+                            trimList(source.readArrayList(Integer.class.getClassLoader(),
+                                    Integer.class), NUM_PRIORITY_CATEGORIES),
+                            trimList(source.readArrayList(Integer.class.getClassLoader(),
+                                    Integer.class), NUM_VISUAL_EFFECTS),
+                            source.readInt(), source.readInt(), source.readInt(),
+                            source.readInt()
                         );
-                    } else {
-                        policy = new ZenPolicy();
-                        policy.mPriorityCategories =
-                                trimList(source.readArrayList(Integer.class.getClassLoader(),
-                                        Integer.class), NUM_PRIORITY_CATEGORIES);
-                        policy.mVisualEffects =
-                                trimList(source.readArrayList(Integer.class.getClassLoader(),
-                                        Integer.class), NUM_VISUAL_EFFECTS);
-                        policy.mPriorityMessages = source.readInt();
-                        policy.mPriorityCalls = source.readInt();
-                        policy.mConversationSenders = source.readInt();
-                    }
-                    return policy;
                 }
 
                 @Override
@@ -1121,18 +1072,16 @@
 
     @Override
     public String toString() {
-        StringBuilder sb = new StringBuilder(ZenPolicy.class.getSimpleName())
+        return new StringBuilder(ZenPolicy.class.getSimpleName())
                 .append('{')
                 .append("priorityCategories=[").append(priorityCategoriesToString())
                 .append("], visualEffects=[").append(visualEffectsToString())
                 .append("], priorityCallsSenders=").append(peopleTypeToString(mPriorityCalls))
                 .append(", priorityMessagesSenders=").append(peopleTypeToString(mPriorityMessages))
                 .append(", priorityConversationSenders=").append(
-                        conversationTypeToString(mConversationSenders));
-        if (Flags.modesApi()) {
-            sb.append(", allowChannels=").append(channelTypeToString(mAllowChannels));
-        }
-        return sb.append('}').toString();
+                        conversationTypeToString(mConversationSenders))
+                .append(", allowChannels=").append(channelTypeToString(mAllowChannels))
+                .append('}').toString();
     }
 
     /** @hide */
@@ -1325,7 +1274,6 @@
     /**
      * @hide
      */
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public static String channelTypeToString(@ChannelType int channelType) {
         switch (channelType) {
             case CHANNEL_POLICY_UNSET:
@@ -1344,25 +1292,18 @@
         if (o == this) return true;
         final ZenPolicy other = (ZenPolicy) o;
 
-        boolean eq = Objects.equals(other.mPriorityCategories, mPriorityCategories)
+        return Objects.equals(other.mPriorityCategories, mPriorityCategories)
                 && Objects.equals(other.mVisualEffects, mVisualEffects)
                 && other.mPriorityCalls == mPriorityCalls
                 && other.mPriorityMessages == mPriorityMessages
-                && other.mConversationSenders == mConversationSenders;
-        if (Flags.modesApi()) {
-            return eq && other.mAllowChannels == mAllowChannels;
-        }
-        return eq;
+                && other.mConversationSenders == mConversationSenders
+                && other.mAllowChannels == mAllowChannels;
     }
 
     @Override
     public int hashCode() {
-        if (Flags.modesApi()) {
-            return Objects.hash(mPriorityCategories, mVisualEffects, mPriorityCalls,
-                    mPriorityMessages, mConversationSenders, mAllowChannels);
-        }
-        return Objects.hash(mPriorityCategories, mVisualEffects, mPriorityCalls, mPriorityMessages,
-                mConversationSenders);
+        return Objects.hash(mPriorityCategories, mVisualEffects, mPriorityCalls,
+                mPriorityMessages, mConversationSenders, mAllowChannels);
     }
 
     private @State int getZenPolicyPriorityCategoryState(@PriorityCategory int
@@ -1480,13 +1421,10 @@
             }
         }
 
-        // apply allowed channels
-        if (Flags.modesApi()) {
-            // if no channels are allowed, can't newly allow them
-            if (mAllowChannels != CHANNEL_POLICY_NONE
-                    && policyToApply.mAllowChannels != CHANNEL_POLICY_UNSET) {
-                mAllowChannels = policyToApply.mAllowChannels;
-            }
+        // apply allowed channels -> if no channels are allowed, can't newly allow them
+        if (mAllowChannels != CHANNEL_POLICY_NONE
+                && policyToApply.mAllowChannels != CHANNEL_POLICY_UNSET) {
+            mAllowChannels = policyToApply.mAllowChannels;
         }
     }
 
@@ -1499,7 +1437,6 @@
      * @hide
      */
     @TestApi
-    @FlaggedApi(Flags.FLAG_MODES_API)
     public @NonNull ZenPolicy overwrittenWith(@Nullable ZenPolicy newPolicy) {
         ZenPolicy result = this.copy();
 
@@ -1596,10 +1533,7 @@
         proto.write(DNDPolicyProto.ALLOW_CALLS_FROM, getPriorityCallSenders());
         proto.write(DNDPolicyProto.ALLOW_MESSAGES_FROM, getPriorityMessageSenders());
         proto.write(DNDPolicyProto.ALLOW_CONVERSATIONS_FROM, getPriorityConversationSenders());
-
-        if (Flags.modesApi()) {
-            proto.write(DNDPolicyProto.ALLOW_CHANNELS, getPriorityChannelsAllowed());
-        }
+        proto.write(DNDPolicyProto.ALLOW_CHANNELS, getPriorityChannelsAllowed());
 
         proto.flush();
         return bytes.toByteArray();
diff --git a/core/java/android/text/Layout.java b/core/java/android/text/Layout.java
index 323d83b..2fa5613 100644
--- a/core/java/android/text/Layout.java
+++ b/core/java/android/text/Layout.java
@@ -672,7 +672,7 @@
         // LINT.IfChange(hct_darken)
         var lab = new double[3];
         ColorUtils.colorToLAB(color, lab);
-        return lab[0] < 50.0;
+        return lab[0] <= 50.0;
         // LINT.ThenChange(/libs/hwui/hwui/DrawTextFunctor.h:hct_darken)
     }
 
@@ -1021,6 +1021,12 @@
             return;
         }
 
+        if (!mSpannedText || mSpanColors == null) {
+            if (mPaint.getAlpha() == 0) {
+                return;
+            }
+        }
+
         var padding = Math.max(HIGH_CONTRAST_TEXT_BORDER_WIDTH_MIN_PX,
                 mPaint.getTextSize() * HIGH_CONTRAST_TEXT_BORDER_WIDTH_FACTOR);
         var cornerRadius = mPaint.density * HIGH_CONTRAST_TEXT_BACKGROUND_CORNER_RADIUS_DP;
diff --git a/core/java/android/view/FrameMetrics.java b/core/java/android/view/FrameMetrics.java
index 58b2a67..a4fc342 100644
--- a/core/java/android/view/FrameMetrics.java
+++ b/core/java/android/view/FrameMetrics.java
@@ -259,19 +259,20 @@
         int FRAME_DEADLINE = 9;
         int FRAME_START_TIME = 10;
         int FRAME_INTERVAL = 11;
-        int SYNC_QUEUED = 12;
-        int SYNC_START = 13;
-        int ISSUE_DRAW_COMMANDS_START = 14;
-        int SWAP_BUFFERS = 15;
-        int FRAME_COMPLETED = 16;
-        int DEQUEUE_BUFFER_DURATION = 17;
-        int QUEUE_BUFFER_DURATION = 18;
-        int GPU_COMPLETED = 19;
-        int SWAP_BUFFERS_COMPLETED = 20;
-        int DISPLAY_PRESENT_TIME = 21;
-        int COMMAND_SUBMISSION_COMPLETED = 22;
+        int WORKLOAD_TARGET = 12;
+        int SYNC_QUEUED = 13;
+        int SYNC_START = 14;
+        int ISSUE_DRAW_COMMANDS_START = 15;
+        int SWAP_BUFFERS = 16;
+        int FRAME_COMPLETED = 17;
+        int DEQUEUE_BUFFER_DURATION = 18;
+        int QUEUE_BUFFER_DURATION = 19;
+        int GPU_COMPLETED = 20;
+        int SWAP_BUFFERS_COMPLETED = 21;
+        int DISPLAY_PRESENT_TIME = 22;
+        int COMMAND_SUBMISSION_COMPLETED = 23;
 
-        int FRAME_STATS_COUNT = 23; // must always be last and in sync with
+        int FRAME_STATS_COUNT = 24; // must always be last and in sync with
                                     // FrameInfoIndex::NumIndexes in libs/hwui/FrameInfo.h
     }
 
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 0d6f827..de3e45b 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -272,9 +272,9 @@
 import android.window.OnBackInvokedDispatcher;
 import android.window.ScreenCapture;
 import android.window.SurfaceSyncGroup;
-import android.window.WindowContext;
 import android.window.WindowOnBackInvokedDispatcher;
 import android.window.WindowTokenClient;
+import android.window.WindowTokenClientController;
 
 import com.android.internal.R;
 import com.android.internal.annotations.GuardedBy;
@@ -538,6 +538,11 @@
     private static boolean sAlwaysAssignFocus;
 
     /**
+     * whether we pre-initialized the Buffer Allocator
+     */
+    private static boolean sPreInitializedBufferAllocator = false;
+
+    /**
      * This list must only be modified by the main thread.
      */
     final ArrayList<WindowCallbacks> mWindowCallbacks = new ArrayList<>();
@@ -1342,6 +1347,11 @@
                 com.android.server.display.feature.flags.Flags.subscribeGranularDisplayEvents();
 
         mSendPerfHintOnTouch = adpfViewrootimplActionDownBoost();
+
+        if (!sPreInitializedBufferAllocator) {
+            preInitBufferAllocator();
+            sPreInitializedBufferAllocator = true;
+        }
     }
 
     public static void addFirstDrawHandler(Runnable callback) {
@@ -6614,12 +6624,15 @@
         } else {
             if (enableWindowContextResourcesUpdateOnConfigChange()) {
                 // There is no activity callback - update resources for window token, if needed.
-                final WindowTokenClient windowTokenClient = getWindowTokenClient();
-                if (windowTokenClient != null) {
-                    windowTokenClient.onConfigurationChanged(
+                final IBinder windowContextToken = mContext.getWindowContextToken();
+                if (windowContextToken instanceof WindowTokenClient) {
+                    WindowTokenClientController.getInstance().onWindowConfigurationChanged(
+                            windowContextToken,
                             mLastReportedMergedConfiguration.getMergedConfiguration(),
-                            newDisplayId == INVALID_DISPLAY ? mDisplay.getDisplayId()
-                                    : newDisplayId);
+                            newDisplayId == INVALID_DISPLAY
+                                    ? mDisplay.getDisplayId()
+                                    : newDisplayId
+                    );
                 }
             }
             updateConfiguration(newDisplayId);
@@ -6627,11 +6640,6 @@
         mForceNextConfigUpdate = false;
     }
 
-    private WindowTokenClient getWindowTokenClient() {
-        if (!(mContext instanceof WindowContext)) return null;
-        return (WindowTokenClient) mContext.getWindowContextToken();
-    }
-
     /**
      * Update display and views if last applied merged configuration changed.
      * @param newDisplayId Id of new display if moved, {@link Display#INVALID_DISPLAY} otherwise.
@@ -13564,4 +13572,10 @@
             sProtoLogInitialized = true;
         }
     }
+
+    private void preInitBufferAllocator() {
+        if (com.android.graphics.hwui.flags.Flags.earlyPreinitBufferAllocator()) {
+            ThreadedRenderer.preInitBufferAllocator();
+        }
+    }
 }
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index edfa1d5..93eed37 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -625,12 +625,6 @@
     int TRANSIT_FLAG_PHYSICAL_DISPLAY_SWITCH = (1 << 14); // 0x4000
 
     /**
-     * Transition flag: Indicates that aod is showing hidden by entering doze
-     * @hide
-     */
-    int TRANSIT_FLAG_AOD_APPEARING = (1 << 15); // 0x8000
-
-    /**
      * @hide
      */
     @IntDef(flag = true, prefix = { "TRANSIT_FLAG_" }, value = {
@@ -649,7 +643,6 @@
             TRANSIT_FLAG_KEYGUARD_OCCLUDING,
             TRANSIT_FLAG_KEYGUARD_UNOCCLUDING,
             TRANSIT_FLAG_PHYSICAL_DISPLAY_SWITCH,
-            TRANSIT_FLAG_AOD_APPEARING,
     })
     @Retention(RetentionPolicy.SOURCE)
     @interface TransitionFlags {}
@@ -666,8 +659,7 @@
             (TRANSIT_FLAG_KEYGUARD_GOING_AWAY
             | TRANSIT_FLAG_KEYGUARD_APPEARING
             | TRANSIT_FLAG_KEYGUARD_OCCLUDING
-            | TRANSIT_FLAG_KEYGUARD_UNOCCLUDING
-            | TRANSIT_FLAG_AOD_APPEARING);
+            | TRANSIT_FLAG_KEYGUARD_UNOCCLUDING);
 
     /**
      * Remove content mode: Indicates remove content mode is currently not defined.
@@ -1531,15 +1523,6 @@
      */
     @TestApi
     static boolean hasWindowExtensionsEnabled() {
-        if (!Flags.enableWmExtensionsForAllFlag() && ACTIVITY_EMBEDDING_GUARD_WITH_ANDROID_15) {
-            // Since enableWmExtensionsForAllFlag, HAS_WINDOW_EXTENSIONS_ON_DEVICE is now true
-            // on all devices by default as a build file property.
-            // Until finishing flag ramp up, only return true when
-            // ACTIVITY_EMBEDDING_GUARD_WITH_ANDROID_15 is false, which is set per device by
-            // OEMs.
-            return false;
-        }
-
         if (!HAS_WINDOW_EXTENSIONS_ON_DEVICE) {
             return false;
         }
diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfo.java b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
index 8a10979..578b7b6 100644
--- a/core/java/android/view/accessibility/AccessibilityNodeInfo.java
+++ b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
@@ -541,6 +541,22 @@
             "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
 
     /**
+     * Argument for specifying the extended selection.
+     *
+     * <p><strong>Type:</strong> {@link AccessibilityNodeInfo.Selection}<br>
+     * <strong>Actions:</strong>
+     *
+     * <ul>
+     *   <li>{@link AccessibilityAction#ACTION_SET_EXTENDED_SELECTION}
+     * </ul>
+     *
+     * @see AccessibilityAction#ACTION_SET_EXTENDED_SELECTION
+     */
+    @FlaggedApi(Flags.FLAG_A11Y_SELECTION_API)
+    public static final String ACTION_ARGUMENT_SELECTION_PARCELABLE =
+            "android.view.accessibility.action.ARGUMENT_SELECTION_PARCELABLE";
+
+    /**
      * Argument for whether when moving at granularity to extend the selection
      * or to move it otherwise.
      * <p>
@@ -1146,6 +1162,8 @@
 
     private int mConnectionId = UNDEFINED_CONNECTION_ID;
 
+    private Selection mSelection;
+
     private RangeInfo mRangeInfo;
     private CollectionInfo mCollectionInfo;
     private CollectionItemInfo mCollectionItemInfo;
@@ -2660,6 +2678,56 @@
     }
 
     /**
+     * Sets the extended selection, which is a representation of selection that spans multiple nodes
+     * that exist within the subtree of the node defining selection.
+     *
+     * <p><b>Note:</b> The start and end {@link SelectionPosition} of the provided {@link Selection}
+     * should be constructed with {@code this} node or a descendant of it.
+     *
+     * <p><b>Note:</b> {@link AccessibilityNodeInfo#setFocusable} and {@link
+     * AccessibilityNodeInfo#setFocused} should both be called with {@code true} before setting the
+     * selection in order to make {@code this} node a candidate to contain a selection.
+     *
+     * <p><b>Note:</b> Cannot be called from an AccessibilityService. This class is made immutable
+     * before being delivered to an AccessibilityService.
+     *
+     * @param selection The extended selection within the node's subtree, or {@code null} if no
+     *     selection exists.
+     * @see AccessibilityNodeInfo.AccessibilityAction#ACTION_SET_EXTENDED_SELECTION
+     * @throws IllegalStateException If called from an AccessibilityService
+     */
+    @FlaggedApi(Flags.FLAG_A11Y_SELECTION_API)
+    public void setSelection(@Nullable Selection selection) {
+        enforceNotSealed();
+        mSelection = selection;
+    }
+
+    /**
+     * Gets the extended selection, which is a representation of selection that spans multiple nodes
+     * that exist within the subtree of the node defining selection.
+     *
+     * <p><b>Note:</b> The start and end {@link SelectionPosition} of the provided {@link Selection}
+     * should be constructed with {@code this} node or a descendant of it.
+     *
+     * <p><b>Note:</b> In order for a node to be a candidate to contain a selection, {@link
+     * AccessibilityNodeInfo#isFocusable()} ()} and {@link AccessibilityNodeInfo#isFocused()} should
+     * both be return with {@code true}.
+     *
+     * @return The extended selection within the node's subtree, or {@code null} if no selection
+     *     exists.
+     */
+    @FlaggedApi(Flags.FLAG_A11Y_SELECTION_API)
+    public @Nullable Selection getSelection() {
+        if (mSelection != null) {
+            mSelection.getStart().setWindowId(mWindowId);
+            mSelection.getStart().setConnectionId(mConnectionId);
+            mSelection.getEnd().setWindowId(mWindowId);
+            mSelection.getEnd().setConnectionId(mConnectionId);
+        }
+        return mSelection;
+    }
+
+    /**
      * Gets whether this node is visible to the user.
      * <p>
      * Between {@link Build.VERSION_CODES#JELLY_BEAN API 16} and
@@ -4168,6 +4236,15 @@
      *         there is no text selection and no cursor.
      */
     public int getTextSelectionStart() {
+        if (Flags.a11ySelectionApi()) {
+            Selection current = getSelection();
+            if ((current != null)
+                    && current.getStart().usesNode(this)
+                    && current.getEnd().usesNode(this)) {
+                return current.getStart().getOffset();
+            }
+            return UNDEFINED_SELECTION_INDEX;
+        }
         return mTextSelectionStart;
     }
 
@@ -4183,6 +4260,15 @@
      *         there is no text selection and no cursor.
      */
     public int getTextSelectionEnd() {
+        if (Flags.a11ySelectionApi()) {
+            Selection current = getSelection();
+            if ((current != null)
+                    && current.getStart().usesNode(this)
+                    && current.getEnd().usesNode(this)) {
+                return current.getEnd().getOffset();
+            }
+            return UNDEFINED_SELECTION_INDEX;
+        }
         return mTextSelectionEnd;
     }
 
@@ -4201,6 +4287,13 @@
      */
     public void setTextSelection(int start, int end) {
         enforceNotSealed();
+        if (Flags.a11ySelectionApi()) {
+            Selection selection =
+                    new Selection(
+                            new SelectionPosition(this, start), new SelectionPosition(this, end));
+            setSelection(selection);
+            return;
+        }
         mTextSelectionStart = start;
         mTextSelectionEnd = end;
     }
@@ -4875,6 +4968,10 @@
             nonDefaultFields |= bitAt(fieldIndex);
         }
         fieldIndex++;
+        if (!Objects.equals(mSelection, DEFAULT.mSelection)) {
+            nonDefaultFields |= bitAt(fieldIndex);
+        }
+        fieldIndex++;
         if (mChecked != DEFAULT.mChecked) {
             nonDefaultFields |= bitAt(fieldIndex);
         }
@@ -5055,6 +5152,9 @@
             parcel.writeLong(mLeashedParentNodeId);
         }
         if (isBitSet(nonDefaultFields, fieldIndex++)) {
+            mSelection.writeToParcel(parcel, flags);
+        }
+        if (isBitSet(nonDefaultFields, fieldIndex++)) {
             parcel.writeInt(mChecked);
         }
         if (isBitSet(nonDefaultFields, fieldIndex++)) {
@@ -5172,6 +5272,17 @@
         ExtraRenderingInfo ti = other.mExtraRenderingInfo;
         mExtraRenderingInfo = (ti == null) ? null
                 : new ExtraRenderingInfo(ti);
+
+        if (Flags.a11ySelectionApi()) {
+            if (other.getSelection() != null) {
+                SelectionPosition sps = other.getSelection().getStart();
+                SelectionPosition spe = other.getSelection().getEnd();
+                mSelection =
+                        new Selection(
+                                new SelectionPosition(sps.mSourceNodeId, sps.getOffset()),
+                                new SelectionPosition(spe.mSourceNodeId, spe.getOffset()));
+            }
+        }
     }
 
     /**
@@ -5344,6 +5455,9 @@
             mLeashedParentNodeId = parcel.readLong();
         }
         if (isBitSet(nonDefaultFields, fieldIndex++)) {
+            mSelection = Selection.CREATOR.createFromParcel(parcel);
+        }
+        if (isBitSet(nonDefaultFields, fieldIndex++)) {
             mChecked = parcel.readInt();
         }
         if (isBitSet(nonDefaultFields, fieldIndex++)) {
@@ -5495,6 +5609,9 @@
                 if (action == R.id.accessibilityActionScrollInDirection) {
                     return "ACTION_SCROLL_IN_DIRECTION";
                 }
+                if (action == R.id.accessibilityActionSetExtendedSelection) {
+                    return "ACTION_SET_EXTENDED_SELECTION";
+                }
                 return "ACTION_UNKNOWN";
             }
         }
@@ -5696,6 +5813,271 @@
     }
 
     /**
+     * A class which defines either the start or end of a selection that can span across multiple
+     * AccessibilityNodeInfo objects.
+     *
+     * @see AccessibilityNodeInfo.Selection
+     */
+    @FlaggedApi(Flags.FLAG_A11Y_SELECTION_API)
+    public static final class SelectionPosition implements Parcelable {
+
+        private final int mOffset;
+        private final long mSourceNodeId;
+        private int mConnectionId;
+        private int mWindowId;
+
+        /**
+         * Instantiates a new SelectionPosition.
+         *
+         * @param node The {@link AccessibilityNodeInfo} for the node of this selection.
+         * @param offset The offset for a {@link SelectionPosition} within {@code view}'s text
+         *     content, which should be a value between 0 and the length of {@code view}'s text.
+         */
+        public SelectionPosition(@NonNull AccessibilityNodeInfo node, int offset) {
+            this(node.mSourceNodeId, offset);
+        }
+
+        /**
+         * Instantiates a new SelectionPosition.
+         *
+         * @param view The {@link View} containing the virtual descendant associated with the
+         *     selection position.
+         * @param offset The offset for a selection position within {@code view}'s text content,
+         *     which should be a value between 0 and the length of {@code view}'s text.
+         */
+        public SelectionPosition(@NonNull View view, int offset) {
+            this(
+                    makeNodeId(
+                            view.getAccessibilityViewId(), AccessibilityNodeProvider.HOST_VIEW_ID),
+                    offset);
+        }
+
+        /**
+         * Instantiates a new {@link SelectionPosition}.
+         *
+         * @param view The view whose virtual descendant is associated with the selection position.
+         * @param virtualDescendantId The ID of the virtual descendant within {@code view}'s virtual
+         *     subtree that contains the selection position.
+         * @param offset The offset for a selection position within the virtual descendant's text
+         *     content, which should be a value between 0 and the length of the descendant's text.
+         * @see AccessibilityNodeProvider
+         */
+        public SelectionPosition(@NonNull View view, int virtualDescendantId, int offset) {
+            this(makeNodeId(view.getAccessibilityViewId(), virtualDescendantId), offset);
+        }
+
+        private SelectionPosition(long sourceNodeId, int offset) {
+            mOffset = offset;
+            mSourceNodeId = sourceNodeId;
+        }
+
+        private SelectionPosition(Parcel in) {
+            mOffset = in.readInt();
+            mSourceNodeId = in.readLong();
+        }
+
+        private void setWindowId(int windowId) {
+            mWindowId = windowId;
+        }
+
+        private void setConnectionId(int connectionId) {
+            mConnectionId = connectionId;
+        }
+
+        /**
+         * Gets the node for {@code this} {@link SelectionPosition}
+         * <br>
+         * <strong>Note:</strong> This api can only be called from {@link AccessibilityService}.
+         *
+         * @return The node associated with {@code this} {@link SelectionPosition}
+         */
+        public @Nullable AccessibilityNodeInfo getNode() {
+            return getNodeForAccessibilityId(mConnectionId, mWindowId, mSourceNodeId);
+        }
+
+        /**
+         * Gets the offset for {@code this} {@link SelectionPosition}.
+         *
+         * @return A value from 0 to the length of {@link #getNode()}'s content representing the
+         *     offset of the {@link SelectionPosition}
+         */
+        public int getOffset() {
+            return mOffset;
+        }
+
+        private boolean usesNode(@NonNull AccessibilityNodeInfo node) {
+            return this.mSourceNodeId == node.mSourceNodeId
+                    && this.mConnectionId == node.mConnectionId
+                    && this.mWindowId == node.mWindowId;
+        }
+
+        @Override
+        public boolean equals(Object other) {
+            if (other == null) {
+                return false;
+            }
+
+            if (other == this) {
+                return true;
+            }
+
+            if (getClass() != other.getClass()) {
+                return false;
+            }
+
+            SelectionPosition rhs = (SelectionPosition) other;
+            if (getOffset() != rhs.getOffset()) {
+                return false;
+            }
+
+            return mSourceNodeId == rhs.mSourceNodeId;
+        }
+
+        @Override
+        public int hashCode() {
+            final long prime = 877;
+            long result = 1;
+
+            if (mOffset != 0) {
+                result *= mOffset;
+            }
+
+            if (mSourceNodeId != UNDEFINED_NODE_ID) {
+                result *= mSourceNodeId;
+            }
+
+            return Long.hashCode(result * prime);
+        }
+
+        /** {@inheritDoc} */
+        @Override
+        public void writeToParcel(@NonNull Parcel dest, int flags) {
+            dest.writeInt(mOffset);
+            dest.writeLong(mSourceNodeId);
+        }
+
+        /** {@inheritDoc} */
+        @Override
+        public int describeContents() {
+            return 0;
+        }
+
+        /**
+         * @see android.os.Parcelable.Creator
+         */
+        @NonNull
+        public static final Creator<SelectionPosition> CREATOR =
+                new Creator<SelectionPosition>() {
+                    @Override
+                    public SelectionPosition createFromParcel(Parcel in) {
+                        return new SelectionPosition(in);
+                    }
+
+                    @Override
+                    public SelectionPosition[] newArray(int size) {
+                        return new SelectionPosition[size];
+                    }
+                };
+    }
+
+    /**
+     * Represents a selection of content that may extend across more than one {@link
+     * AccessibilityNodeInfo} instance.
+     *
+     * @see AccessibilityNodeInfo.SelectionPosition
+     */
+    @FlaggedApi(Flags.FLAG_A11Y_SELECTION_API)
+    public static final class Selection implements Parcelable {
+
+        private final SelectionPosition mStart;
+        private final SelectionPosition mEnd;
+
+        /**
+         * Instantiates a new Selection.
+         *
+         * @param start The start of the extended selection.
+         * @param end The end of the extended selection.
+         */
+        public Selection(@NonNull SelectionPosition start, @NonNull SelectionPosition end) {
+            this.mStart = start;
+            this.mEnd = end;
+        }
+
+        private Selection(Parcel in) {
+            mStart = SelectionPosition.CREATOR.createFromParcel(in);
+            mEnd = SelectionPosition.CREATOR.createFromParcel(in);
+        }
+
+        /**
+         * @return The start of the extended selection.
+         */
+        public @NonNull SelectionPosition getStart() {
+            return mStart;
+        }
+
+        /**
+         * @return The end of the extended selection.
+         */
+        public @NonNull SelectionPosition getEnd() {
+            return mEnd;
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (obj == null) {
+                return false;
+            }
+
+            if (obj == this) {
+                return true;
+            }
+
+            if (getClass() != obj.getClass()) {
+                return false;
+            }
+
+            Selection rhs = (Selection) obj;
+            return getStart().equals(rhs.getStart()) && getEnd().equals(rhs.getEnd());
+        }
+
+        @Override
+        public int hashCode() {
+            final int prime = 17;
+            return prime * getStart().hashCode() * getEnd().hashCode();
+        }
+
+        /** {@inheritDoc} */
+        @Override
+        public void writeToParcel(@NonNull Parcel dest, int flags) {
+            mStart.writeToParcel(dest, flags);
+            mEnd.writeToParcel(dest, flags);
+        }
+
+        /** {@inheritDoc} */
+        @Override
+        public int describeContents() {
+            return 0;
+        }
+
+        /**
+         * @see android.os.Parcelable.Creator
+         */
+        @NonNull
+        public static final Creator<Selection> CREATOR =
+                new Creator<Selection>() {
+                    @Override
+                    public Selection createFromParcel(Parcel in) {
+                        return new Selection(in);
+                    }
+
+                    @Override
+                    public Selection[] newArray(int size) {
+                        return new Selection[size];
+                    }
+                };
+    }
+
+    /**
      * A class defining an action that can be performed on an {@link AccessibilityNodeInfo}.
      * Each action has a unique id that is mandatory and optional data.
      * <p>
@@ -6419,6 +6801,29 @@
         @NonNull public static final AccessibilityAction ACTION_SHOW_TEXT_SUGGESTIONS =
                 new AccessibilityAction(R.id.accessibilityActionShowTextSuggestions);
 
+        /**
+         * Action to set the extended selection. Performing this action with no arguments clears the
+         * selection.
+         *
+         * <p><strong>Arguments:</strong> {@link
+         * AccessibilityNodeInfo#ACTION_ARGUMENT_SELECTION_PARCELABLE
+         * AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_PARCELABLE}<br>
+         * <strong>Example:</strong> <code><pre><p>
+         *  Bundle arguments = new Bundle();
+         *  Selection selection = new Selection(null, null);
+         *  arguments.setParcelable(
+         *          AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_PARCELABLE, selection);
+         *  info.performAction(
+         *          AccessibilityAction.ACTION_SET_EXTENDED_SELECTION.getId(), arguments);
+         * </pre></code>
+         *
+         * @see AccessibilityNodeInfo#ACTION_ARGUMENT_SELECTION_PARCELABLE
+         */
+        @FlaggedApi(Flags.FLAG_A11Y_SELECTION_API)
+        @NonNull
+        public static final AccessibilityAction ACTION_SET_EXTENDED_SELECTION =
+                new AccessibilityAction(R.id.accessibilityActionSetExtendedSelection);
+
         private final int mActionId;
         private final CharSequence mLabel;
 
diff --git a/core/java/android/view/contentcapture/MainContentCaptureSession.java b/core/java/android/view/contentcapture/MainContentCaptureSession.java
index 2fb78c0..b66020b 100644
--- a/core/java/android/view/contentcapture/MainContentCaptureSession.java
+++ b/core/java/android/view/contentcapture/MainContentCaptureSession.java
@@ -57,6 +57,7 @@
 import android.view.ViewStructure;
 import android.view.autofill.AutofillId;
 import android.view.contentcapture.ViewNode.ViewStructureImpl;
+import android.view.contentcapture.flags.Flags;
 import android.view.contentprotection.ContentProtectionEventProcessor;
 import android.view.inputmethod.BaseInputConnection;
 
@@ -1008,6 +1009,9 @@
                     }
                 }
                 internalNotifyViewTreeEvent(sessionId, /* started= */ false);
+                if (Flags.flushAfterEachFrame()) {
+                    internalNotifySessionFlushEvent(sessionId);
+                }
             }
         } finally {
             Trace.traceEnd(Trace.TRACE_TAG_VIEW);
diff --git a/core/java/android/view/contentcapture/flags/content_capture_flags.aconfig b/core/java/android/view/contentcapture/flags/content_capture_flags.aconfig
index e7bc004..8c98fa4 100644
--- a/core/java/android/view/contentcapture/flags/content_capture_flags.aconfig
+++ b/core/java/android/view/contentcapture/flags/content_capture_flags.aconfig
@@ -15,3 +15,14 @@
     bug: "380381249"
     is_exported: true
 }
+
+flag {
+    name: "flush_after_each_frame"
+    namespace: "pixel_state_server"
+    description: "Feature flag to send a flush event after each frame"
+    bug: "380381249"
+    is_fixed_read_only: true
+    metadata {
+        purpose: PURPOSE_BUGFIX
+    }
+}
diff --git a/core/java/android/window/ConfigurationDispatcher.java b/core/java/android/window/ConfigurationDispatcher.java
new file mode 100644
index 0000000..b8f0da1
--- /dev/null
+++ b/core/java/android/window/ConfigurationDispatcher.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.window;
+
+import android.annotation.NonNull;
+import android.content.ComponentCallbacks;
+import android.content.res.Configuration;
+
+/**
+ * Indicates a {@link android.content.Context} could propagate the
+ * {@link android.content.res.Configuration} from the server side and users may listen to the
+ * updates through {@link android.content.Context#registerComponentCallbacks(ComponentCallbacks)}.
+ *
+ * @hide
+ */
+public interface ConfigurationDispatcher {
+
+    /**
+     * Called when there's configuration update from the server side.
+     */
+    void dispatchConfigurationChanged(@NonNull Configuration configuration);
+
+    /**
+     * Indicates that if this dispatcher should report the change even if it's not
+     * {@link Configuration#diffPublicOnly}.
+     */
+    default boolean shouldReportPrivateChanges() {
+        return false;
+    }
+}
diff --git a/core/java/android/window/DesktopModeFlags.java b/core/java/android/window/DesktopModeFlags.java
index 1ce5df7..d43469f 100644
--- a/core/java/android/window/DesktopModeFlags.java
+++ b/core/java/android/window/DesktopModeFlags.java
@@ -57,6 +57,8 @@
             true),
     ENABLE_DESKTOP_CLOSE_SHORTCUT_BUGFIX(Flags::enableDesktopCloseShortcutBugfix, false),
     ENABLE_DESKTOP_COMPAT_UI_VISIBILITY_STATUS(Flags::enableCompatUiVisibilityStatus, true),
+    ENABLE_DESKTOP_INDICATOR_IN_SEPARATE_THREAD_BUGFIX(
+            Flags::enableDesktopIndicatorInSeparateThreadBugfix, false),
     ENABLE_DESKTOP_RECENTS_TRANSITIONS_CORNERS_BUGFIX(
             Flags::enableDesktopRecentsTransitionsCornersBugfix, false),
     ENABLE_DESKTOP_SKIP_COMPAT_UI_EDUCATION_IN_DESKTOP_MODE_BUGFIX(
diff --git a/core/java/android/window/TaskFragmentCreationParams.java b/core/java/android/window/TaskFragmentCreationParams.java
index 89327fe..bc5ad50 100644
--- a/core/java/android/window/TaskFragmentCreationParams.java
+++ b/core/java/android/window/TaskFragmentCreationParams.java
@@ -24,6 +24,7 @@
 import android.annotation.Nullable;
 import android.annotation.RequiresPermission;
 import android.annotation.TestApi;
+import android.content.pm.ActivityInfo;
 import android.content.pm.ActivityInfo.ScreenOrientation;
 import android.graphics.Rect;
 import android.os.IBinder;
@@ -112,12 +113,21 @@
      */
     private final @ScreenOrientation int mOverrideOrientation;
 
+    /**
+     * {@link android.content.pm.ActivityInfo.Config} mask that specifies which
+     * configuration changes should trigger TaskFragment info change callbacks.
+     *
+     * @see android.content.pm.ActivityInfo.Config
+     */
+    private final @ActivityInfo.Config int mConfigurationChangeMask;
+
     private TaskFragmentCreationParams(
             @NonNull TaskFragmentOrganizerToken organizer, @NonNull IBinder fragmentToken,
             @NonNull IBinder ownerToken, @NonNull Rect initialRelativeBounds,
             @WindowingMode int windowingMode, @Nullable IBinder pairedPrimaryFragmentToken,
             @Nullable IBinder pairedActivityToken, boolean allowTransitionWhenEmpty,
-            @ScreenOrientation int overrideOrientation) {
+            @ScreenOrientation int overrideOrientation,
+            @ActivityInfo.Config int configurationChangeMask) {
         if (pairedPrimaryFragmentToken != null && pairedActivityToken != null) {
             throw new IllegalArgumentException("pairedPrimaryFragmentToken and"
                     + " pairedActivityToken should not be set at the same time.");
@@ -131,6 +141,7 @@
         mPairedActivityToken = pairedActivityToken;
         mAllowTransitionWhenEmpty = allowTransitionWhenEmpty;
         mOverrideOrientation = overrideOrientation;
+        mConfigurationChangeMask = configurationChangeMask;
     }
 
     @NonNull
@@ -186,6 +197,11 @@
         return mOverrideOrientation;
     }
 
+    /** @hide */
+    public @ActivityInfo.Config int getConfigurationChangeMask() {
+        return mConfigurationChangeMask;
+    }
+
     private TaskFragmentCreationParams(Parcel in) {
         mOrganizer = TaskFragmentOrganizerToken.CREATOR.createFromParcel(in);
         mFragmentToken = in.readStrongBinder();
@@ -196,6 +212,7 @@
         mPairedActivityToken = in.readStrongBinder();
         mAllowTransitionWhenEmpty = in.readBoolean();
         mOverrideOrientation = in.readInt();
+        mConfigurationChangeMask = in.readInt();
     }
 
     /** @hide */
@@ -210,6 +227,7 @@
         dest.writeStrongBinder(mPairedActivityToken);
         dest.writeBoolean(mAllowTransitionWhenEmpty);
         dest.writeInt(mOverrideOrientation);
+        dest.writeInt(mConfigurationChangeMask);
     }
 
     @NonNull
@@ -238,6 +256,7 @@
                 + " pairedActivityToken=" + mPairedActivityToken
                 + " allowTransitionWhenEmpty=" + mAllowTransitionWhenEmpty
                 + " overrideOrientation=" + mOverrideOrientation
+                + " configurationChangeMask=" + mConfigurationChangeMask
                 + "}";
     }
 
@@ -275,6 +294,8 @@
 
         private @ScreenOrientation int mOverrideOrientation = SCREEN_ORIENTATION_UNSPECIFIED;
 
+        private @ActivityInfo.Config int mConfigurationChangeMask = 0;
+
         public Builder(@NonNull TaskFragmentOrganizerToken organizer,
                 @NonNull IBinder fragmentToken, @NonNull IBinder ownerToken) {
             mOrganizer = organizer;
@@ -369,12 +390,30 @@
             return this;
         }
 
+        /**
+         * Sets {@link android.content.pm.ActivityInfo.Config} mask that specifies which
+         * configuration changes should trigger TaskFragment info change callbacks.
+         *
+         * Only system organizers are allowed to configure this value. This value is ignored for
+         * non-system organizers.
+         *
+         * @see android.content.pm.ActivityInfo.Config
+         * @hide
+         */
+        @NonNull
+        public Builder setConfigurationChangeMask(
+                @ActivityInfo.Config int configurationChangeMask) {
+            mConfigurationChangeMask = configurationChangeMask;
+            return this;
+        }
+
         /** Constructs the options to create TaskFragment with. */
         @NonNull
         public TaskFragmentCreationParams build() {
             return new TaskFragmentCreationParams(mOrganizer, mFragmentToken, mOwnerToken,
                     mInitialRelativeBounds, mWindowingMode, mPairedPrimaryFragmentToken,
-                    mPairedActivityToken, mAllowTransitionWhenEmpty, mOverrideOrientation);
+                    mPairedActivityToken, mAllowTransitionWhenEmpty, mOverrideOrientation,
+                    mConfigurationChangeMask);
         }
     }
 }
diff --git a/core/java/android/window/TaskFragmentOperation.java b/core/java/android/window/TaskFragmentOperation.java
index 9d0ea54..1fd79cc 100644
--- a/core/java/android/window/TaskFragmentOperation.java
+++ b/core/java/android/window/TaskFragmentOperation.java
@@ -90,26 +90,6 @@
     public static final int OP_TYPE_SET_ISOLATED_NAVIGATION = 11;
 
     /**
-     * Reorders the TaskFragment to be the bottom-most in the Task. Note that this op will bring the
-     * TaskFragment to the bottom of the Task below all the other Activities and TaskFragments.
-     *
-     * This is only allowed for system organizers. See
-     * {@link com.android.server.wm.TaskFragmentOrganizerController#registerOrganizer(
-     * ITaskFragmentOrganizer, boolean)}
-     */
-    public static final int OP_TYPE_REORDER_TO_BOTTOM_OF_TASK = 12;
-
-    /**
-     * Reorders the TaskFragment to be the top-most in the Task. Note that this op will bring the
-     * TaskFragment to the top of the Task above all the other Activities and TaskFragments.
-     *
-     * This is only allowed for system organizers. See
-     * {@link com.android.server.wm.TaskFragmentOrganizerController#registerOrganizer(
-     * ITaskFragmentOrganizer, boolean)}
-     */
-    public static final int OP_TYPE_REORDER_TO_TOP_OF_TASK = 13;
-
-    /**
      * Creates a decor surface in the parent Task of the TaskFragment. The created decor surface
      * will be provided in {@link TaskFragmentTransaction#TYPE_TASK_FRAGMENT_PARENT_INFO_CHANGED}
      * event callback. If a decor surface already exists in the parent Task, the current
@@ -118,27 +98,17 @@
      *
      * The decor surface can be used to draw the divider between TaskFragments or other decorations.
      */
-    public static final int OP_TYPE_CREATE_OR_MOVE_TASK_FRAGMENT_DECOR_SURFACE = 14;
+    public static final int OP_TYPE_CREATE_OR_MOVE_TASK_FRAGMENT_DECOR_SURFACE = 12;
 
     /**
      * Removes the decor surface in the parent Task of the TaskFragment.
      */
-    public static final int OP_TYPE_REMOVE_TASK_FRAGMENT_DECOR_SURFACE = 15;
+    public static final int OP_TYPE_REMOVE_TASK_FRAGMENT_DECOR_SURFACE = 13;
 
     /**
      * Applies dimming on the parent Task which could cross two TaskFragments.
      */
-    public static final int OP_TYPE_SET_DIM_ON_TASK = 16;
-
-    /**
-     * Sets this TaskFragment to move to bottom of the Task if any of the activities below it is
-     * launched in a mode requiring clear top.
-     *
-     * This is only allowed for system organizers. See
-     * {@link com.android.server.wm.TaskFragmentOrganizerController#registerOrganizer(
-     * ITaskFragmentOrganizer, boolean)}
-     */
-    public static final int OP_TYPE_SET_MOVE_TO_BOTTOM_IF_CLEAR_WHEN_LAUNCH = 17;
+    public static final int OP_TYPE_SET_DIM_ON_TASK = 14;
 
     /**
      * Sets whether the decor surface will be boosted. When not boosted, the decor surface is placed
@@ -147,7 +117,7 @@
      * surface is placed above all the non-boosted windows in the Task, the content of these
      * non-boosted windows will be hidden and inputs are disabled.
      */
-    public static final int OP_TYPE_SET_DECOR_SURFACE_BOOSTED = 18;
+    public static final int OP_TYPE_SET_DECOR_SURFACE_BOOSTED = 15;
 
     /**
      * Sets the TaskFragment to be pinned.
@@ -159,7 +129,44 @@
      * <p>
      * See {@link #OP_TYPE_REORDER_TO_FRONT} on how to reorder a pinned TaskFragment to the top.
      */
-    public static final int OP_TYPE_SET_PINNED = 19;
+    public static final int OP_TYPE_SET_PINNED = 16;
+
+    /**
+     * The start index of the privileged operations. Only system organizers are allowed to use
+     * operations with index greater than or equal to this value.
+     */
+    public static final int PRIVILEGED_OP_START = 1000;
+
+    /**
+     * Reorders the TaskFragment to be the bottom-most in the Task. Note that this op will bring the
+     * TaskFragment to the bottom of the Task below all the other Activities and TaskFragments.
+     *
+     * This is only allowed for system organizers. See
+     * {@link com.android.server.wm.TaskFragmentOrganizerController#registerOrganizer(
+     * ITaskFragmentOrganizer, boolean)}
+     */
+    public static final int OP_TYPE_PRIVILEGED_REORDER_TO_BOTTOM_OF_TASK = PRIVILEGED_OP_START + 1;
+
+    /**
+     * Reorders the TaskFragment to be the top-most in the Task. Note that this op will bring the
+     * TaskFragment to the top of the Task above all the other Activities and TaskFragments.
+     *
+     * This is only allowed for system organizers. See
+     * {@link com.android.server.wm.TaskFragmentOrganizerController#registerOrganizer(
+     * ITaskFragmentOrganizer, boolean)}
+     */
+    public static final int OP_TYPE_PRIVILEGED_REORDER_TO_TOP_OF_TASK = PRIVILEGED_OP_START + 2;
+
+    /**
+     * Sets this TaskFragment to move to bottom of the Task if any of the activities below it is
+     * launched in a mode requiring clear top.
+     *
+     * This is only allowed for system organizers. See
+     * {@link com.android.server.wm.TaskFragmentOrganizerController#registerOrganizer(
+     * ITaskFragmentOrganizer, boolean)}
+     */
+    public static final int OP_TYPE_PRIVILEGED_SET_MOVE_TO_BOTTOM_IF_CLEAR_WHEN_LAUNCH =
+            PRIVILEGED_OP_START + 3;
 
     /**
      * Sets whether this TaskFragment can affect system UI flags such as the status bar. Default
@@ -169,7 +176,8 @@
      * {@link com.android.server.wm.TaskFragmentOrganizerController#registerOrganizer(
      * ITaskFragmentOrganizer, boolean)}
      */
-    public static final int OP_TYPE_SET_CAN_AFFECT_SYSTEM_UI_FLAGS = 20;
+    public static final int OP_TYPE_PRIVILEGED_SET_CAN_AFFECT_SYSTEM_UI_FLAGS =
+            PRIVILEGED_OP_START + 4;
 
     @IntDef(prefix = { "OP_TYPE_" }, value = {
             OP_TYPE_UNKNOWN,
@@ -185,15 +193,15 @@
             OP_TYPE_SET_RELATIVE_BOUNDS,
             OP_TYPE_REORDER_TO_FRONT,
             OP_TYPE_SET_ISOLATED_NAVIGATION,
-            OP_TYPE_REORDER_TO_BOTTOM_OF_TASK,
-            OP_TYPE_REORDER_TO_TOP_OF_TASK,
             OP_TYPE_CREATE_OR_MOVE_TASK_FRAGMENT_DECOR_SURFACE,
             OP_TYPE_REMOVE_TASK_FRAGMENT_DECOR_SURFACE,
             OP_TYPE_SET_DIM_ON_TASK,
-            OP_TYPE_SET_MOVE_TO_BOTTOM_IF_CLEAR_WHEN_LAUNCH,
             OP_TYPE_SET_DECOR_SURFACE_BOOSTED,
             OP_TYPE_SET_PINNED,
-            OP_TYPE_SET_CAN_AFFECT_SYSTEM_UI_FLAGS,
+            OP_TYPE_PRIVILEGED_REORDER_TO_BOTTOM_OF_TASK,
+            OP_TYPE_PRIVILEGED_REORDER_TO_TOP_OF_TASK,
+            OP_TYPE_PRIVILEGED_SET_MOVE_TO_BOTTOM_IF_CLEAR_WHEN_LAUNCH,
+            OP_TYPE_PRIVILEGED_SET_CAN_AFFECT_SYSTEM_UI_FLAGS,
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface OperationType {}
diff --git a/core/java/android/window/TransitionInfo.java b/core/java/android/window/TransitionInfo.java
index cf21e50..4f34aa3 100644
--- a/core/java/android/window/TransitionInfo.java
+++ b/core/java/android/window/TransitionInfo.java
@@ -29,7 +29,6 @@
 import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_UNSPECIFIED;
 import static android.view.WindowManager.TRANSIT_CHANGE;
 import static android.view.WindowManager.TRANSIT_CLOSE;
-import static android.view.WindowManager.TRANSIT_FLAG_AOD_APPEARING;
 import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_APPEARING;
 import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY;
 import static android.view.WindowManager.TRANSIT_NONE;
@@ -406,8 +405,7 @@
      */
     public boolean hasChangesOrSideEffects() {
         return !mChanges.isEmpty() || isKeyguardGoingAway()
-                || (mFlags & TRANSIT_FLAG_KEYGUARD_APPEARING) != 0
-                || (mFlags & TRANSIT_FLAG_AOD_APPEARING) != 0;
+                || (mFlags & TRANSIT_FLAG_KEYGUARD_APPEARING) != 0;
     }
 
     /**
diff --git a/core/java/android/window/WindowContext.java b/core/java/android/window/WindowContext.java
index 84a8b8f..778ccaf 100644
--- a/core/java/android/window/WindowContext.java
+++ b/core/java/android/window/WindowContext.java
@@ -17,8 +17,6 @@
 
 import static android.view.WindowManagerImpl.createWindowContextWindowManager;
 
-import static com.android.internal.annotations.VisibleForTesting.Visibility.PACKAGE;
-
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.UiContext;
@@ -46,7 +44,8 @@
  * @hide
  */
 @UiContext
-public class WindowContext extends ContextWrapper implements WindowProvider {
+public class WindowContext extends ContextWrapper implements WindowProvider,
+        ConfigurationDispatcher {
     private final WindowManager mWindowManager;
     @WindowManager.LayoutParams.WindowType
     private final int mType;
@@ -155,7 +154,7 @@
     }
 
     /** Dispatch {@link Configuration} to each {@link ComponentCallbacks}. */
-    @VisibleForTesting(visibility = PACKAGE)
+    @Override
     public void dispatchConfigurationChanged(@NonNull Configuration newConfig) {
         mCallbacksController.dispatchConfigurationChanged(newConfig);
     }
@@ -170,4 +169,10 @@
     public Bundle getWindowContextOptions() {
         return mOptions;
     }
+
+    @Override
+    public boolean shouldReportPrivateChanges() {
+        // Always dispatch config changes to WindowContext.
+        return true;
+    }
 }
diff --git a/core/java/android/window/WindowContextController.java b/core/java/android/window/WindowContextController.java
index 1e2f454..d31e43f 100644
--- a/core/java/android/window/WindowContextController.java
+++ b/core/java/android/window/WindowContextController.java
@@ -86,7 +86,6 @@
      * @param token The token used to attach to a window manager node. It is usually from
      *              {@link Context#getWindowContextToken()}.
      */
-    @VisibleForTesting
     public WindowContextController(@NonNull WindowTokenClient token) {
         mToken = token;
     }
diff --git a/core/java/android/window/WindowProviderService.java b/core/java/android/window/WindowProviderService.java
index c81c9ec..8468867 100644
--- a/core/java/android/window/WindowProviderService.java
+++ b/core/java/android/window/WindowProviderService.java
@@ -49,9 +49,11 @@
  *
  * @hide
  */
+@SuppressWarnings("HiddenSuperclass")
 @TestApi
 @UiContext
-public abstract class WindowProviderService extends Service implements WindowProvider {
+public abstract class WindowProviderService extends Service implements WindowProvider,
+        ConfigurationDispatcher {
 
     private static final String TAG = WindowProviderService.class.getSimpleName();
 
@@ -240,4 +242,14 @@
         mController.detachIfNeeded();
         mCallbacksController.clearCallbacks();
     }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @hide
+     */
+    @Override
+    public void dispatchConfigurationChanged(@NonNull Configuration configuration) {
+        onConfigurationChanged(configuration);
+    }
 }
diff --git a/core/java/android/window/WindowTokenClient.java b/core/java/android/window/WindowTokenClient.java
index f7bee61..9b296c8 100644
--- a/core/java/android/window/WindowTokenClient.java
+++ b/core/java/android/window/WindowTokenClient.java
@@ -107,6 +107,7 @@
      * @param newDisplayId the updated {@link android.view.Display} ID
      */
     @MainThread
+    @VisibleForTesting(visibility = PACKAGE)
     public void onConfigurationChanged(Configuration newConfig, int newDisplayId) {
         onConfigurationChanged(newConfig, newDisplayId, true /* shouldReportConfigChange */);
     }
@@ -120,8 +121,6 @@
                 newDisplayId, true /* shouldReportConfigChange */).recycleOnUse());
     }
 
-    // TODO(b/192048581): rewrite this method based on WindowContext and WindowProviderService
-    //  are inherited from WindowProvider.
     /**
      * Called when {@link Configuration} updates from the server side receive.
      *
@@ -168,7 +167,7 @@
         CompatibilityInfo.applyOverrideIfNeeded(newConfig);
         final boolean displayChanged;
         final boolean shouldUpdateResources;
-        final int diff;
+        final int publicDiff;
         final Configuration currentConfig;
 
         synchronized (mConfiguration) {
@@ -176,7 +175,7 @@
             shouldUpdateResources = shouldUpdateResources(this, mConfiguration,
                     newConfig, newConfig /* overrideConfig */, displayChanged,
                     null /* configChanged */);
-            diff = mConfiguration.diffPublicOnly(newConfig);
+            publicDiff = mConfiguration.diffPublicOnly(newConfig);
             currentConfig = mShouldDumpConfigForIme ? new Configuration(mConfiguration) : null;
             if (shouldUpdateResources) {
                 mConfiguration.setTo(newConfig);
@@ -199,17 +198,15 @@
             // TODO(ag/9789103): update resource manager logic to track non-activity tokens
             mResourcesManager.updateResourcesForActivity(this, newConfig, newDisplayId);
 
-            if (shouldReportConfigChange && context instanceof WindowContext) {
-                final WindowContext windowContext = (WindowContext) context;
-                windowContext.dispatchConfigurationChanged(newConfig);
+            if (shouldReportConfigChange && context instanceof ConfigurationDispatcher dispatcher) {
+                // Updating resources implies some fields of configuration are updated despite they
+                // are public or not.
+                if (dispatcher.shouldReportPrivateChanges() || publicDiff != 0) {
+                    dispatcher.dispatchConfigurationChanged(newConfig);
+                }
             }
 
-            if (shouldReportConfigChange && diff != 0
-                    && context instanceof WindowProviderService) {
-                final WindowProviderService windowProviderService = (WindowProviderService) context;
-                windowProviderService.onConfigurationChanged(newConfig);
-            }
-            freeTextLayoutCachesIfNeeded(diff);
+            freeTextLayoutCachesIfNeeded(publicDiff);
             if (mShouldDumpConfigForIme) {
                 if (!shouldReportConfigChange) {
                     Log.d(TAG, "Only apply configuration update to Resources because "
@@ -218,7 +215,7 @@
                             + ", config=" + context.getResources().getConfiguration()
                             + ", display ID=" + context.getDisplayId() + "\n"
                             + Debug.getCallers(5));
-                } else if (diff == 0) {
+                } else if (publicDiff == 0) {
                     Log.d(TAG, "Configuration not dispatch to IME because configuration has no "
                             + " public difference with updated config. "
                             + " Current config=" + context.getResources().getConfiguration()
diff --git a/core/java/android/window/WindowTokenClientController.java b/core/java/android/window/WindowTokenClientController.java
index fcd7dfb..72278d9 100644
--- a/core/java/android/window/WindowTokenClientController.java
+++ b/core/java/android/window/WindowTokenClientController.java
@@ -25,7 +25,9 @@
 import android.app.servertransaction.WindowContextInfoChangeItem;
 import android.app.servertransaction.WindowContextWindowRemovalItem;
 import android.content.Context;
+import android.content.res.Configuration;
 import android.os.Bundle;
+import android.os.Handler;
 import android.os.IBinder;
 import android.os.RemoteException;
 import android.util.ArraySet;
@@ -50,6 +52,7 @@
     private final Object mLock = new Object();
     private final IApplicationThread mAppThread = ActivityThread.currentActivityThread()
             .getApplicationThread();
+    private final Handler mHandler = ActivityThread.currentActivityThread().getHandler();
 
     /** Attached {@link WindowTokenClient}. */
     @GuardedBy("mLock")
@@ -257,6 +260,20 @@
         }
     }
 
+    /** Propagates the configuration change to the client token. */
+    public void onWindowConfigurationChanged(@NonNull IBinder clientToken,
+            @NonNull Configuration config, int displayId) {
+        final WindowTokenClient windowTokenClient = getWindowTokenClientIfAttached(clientToken);
+        if (windowTokenClient != null) {
+            // Let's make sure it's called on the main thread!
+            if (mHandler.getLooper().isCurrentThread()) {
+                windowTokenClient.onConfigurationChanged(config, displayId);
+            } else {
+                windowTokenClient.postOnConfigurationChanged(config, displayId);
+            }
+        }
+    }
+
     @Nullable
     private WindowTokenClient getWindowTokenClientIfAttached(@NonNull IBinder clientToken) {
         if (!(clientToken instanceof WindowTokenClient windowTokenClient)) {
diff --git a/core/java/android/window/flags/lse_desktop_experience.aconfig b/core/java/android/window/flags/lse_desktop_experience.aconfig
index b805ac5..e358540 100644
--- a/core/java/android/window/flags/lse_desktop_experience.aconfig
+++ b/core/java/android/window/flags/lse_desktop_experience.aconfig
@@ -165,6 +165,16 @@
 }
 
 flag {
+    name: "enable_camera_compat_track_task_and_app_bugfix"
+    namespace: "lse_desktop_experience"
+    description: "Whether to use taskId and app process to track camera apps, and notify the policies only on first camera open and final close"
+    bug: "380840084"
+    metadata {
+      purpose: PURPOSE_BUGFIX
+    }
+}
+
+flag {
     name: "enable_task_stack_observer_in_shell"
     namespace: "lse_desktop_experience"
     description: "Introduces a new observer in shell to track the task stack."
@@ -623,6 +633,13 @@
 }
 
 flag {
+    name: "enable_multi_display_split"
+    namespace: "lse_desktop_experience"
+    description: "Enables split screen on multiple displays at the same time"
+    bug: "395943397"
+}
+
+flag {
   name: "exclude_caption_from_app_bounds"
   namespace: "lse_desktop_experience"
   description: "Whether caption insets are excluded from app bounds in freeform"
@@ -706,3 +723,13 @@
         purpose: PURPOSE_BUGFIX
     }
 }
+
+flag {
+    name: "enable_desktop_indicator_in_separate_thread_bugfix"
+    namespace: "lse_desktop_experience"
+    description: "Enables running visual indicator view operations in ShellDesktopThread."
+    bug: "366413536"
+    metadata {
+        purpose: PURPOSE_BUGFIX
+    }
+}
diff --git a/core/java/android/window/flags/windowing_sdk.aconfig b/core/java/android/window/flags/windowing_sdk.aconfig
index ac6625b..54d0eef 100644
--- a/core/java/android/window/flags/windowing_sdk.aconfig
+++ b/core/java/android/window/flags/windowing_sdk.aconfig
@@ -55,14 +55,6 @@
 
 flag {
     namespace: "windowing_sdk"
-    name: "enable_wm_extensions_for_all_flag"
-    description: "Whether to enable WM Extensions for all devices"
-    bug: "306666082"
-    is_fixed_read_only: true
-}
-
-flag {
-    namespace: "windowing_sdk"
     name: "activity_embedding_animation_customization_flag"
     description: "Whether the animation customization feature for AE is enabled"
     bug: "293658614"
diff --git a/core/java/com/android/internal/jank/Cuj.java b/core/java/com/android/internal/jank/Cuj.java
index 9085bbe..41e2ca9 100644
--- a/core/java/com/android/internal/jank/Cuj.java
+++ b/core/java/com/android/internal/jank/Cuj.java
@@ -816,7 +816,7 @@
             case CUJ_LAUNCHER_WORK_UTILITY_VIEW_SHRINK:
                 return "LAUNCHER_WORK_UTILITY_VIEW_SHRINK";
             case CUJ_DEFAULT_TASK_TO_TASK_ANIMATION:
-                return "CUJ_DEFAULT_TASK_TO_TASK_ANIMATION";
+                return "DEFAULT_TASK_TO_TASK_ANIMATION";
         }
         return "UNKNOWN";
     }
diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java
index e60879e..38dc198 100644
--- a/core/java/com/android/internal/os/ZygoteInit.java
+++ b/core/java/com/android/internal/os/ZygoteInit.java
@@ -429,6 +429,27 @@
                     null /*dependentPackages*/, null /*dependencies*/, false /*isNative*/));
         }
 
+        if (Flags.enableMediaAndLocationPreload()) {
+            // As these libraries are technically optional and not necessarily inherited from
+            // base_system.mk, only cache them if they exist.
+            final String mediaJarPath = "/system/framework/com.android.media.remotedisplay.jar";
+            if (new File(mediaJarPath).exists()) {
+                libs.add(new SharedLibraryInfo(
+                        mediaJarPath, null /*packageName*/,
+                        null /*codePaths*/, null /*name*/, 0 /*version*/,
+                        SharedLibraryInfo.TYPE_BUILTIN, null /*declaringPackage*/,
+                        null /*dependentPackages*/, null /*dependencies*/, false /*isNative*/));
+            }
+            final String locationJarPath = "/system/framework/com.android.location.provider.jar";
+            if (new File(locationJarPath).exists()) {
+                libs.add(new SharedLibraryInfo(
+                        locationJarPath, null /*packageName*/,
+                        null /*codePaths*/, null /*name*/, 0 /*version*/,
+                        SharedLibraryInfo.TYPE_BUILTIN, null /*declaringPackage*/,
+                        null /*dependentPackages*/, null /*dependencies*/, false /*isNative*/));
+            }
+        }
+
         // WindowManager Extensions is an optional shared library that is required for WindowManager
         // Jetpack to fully function. Since it is a widely used library, preload it to improve apps
         // startup performance.
diff --git a/core/java/com/android/internal/os/flags.aconfig b/core/java/com/android/internal/os/flags.aconfig
index 25a9fbc..32cde50 100644
--- a/core/java/com/android/internal/os/flags.aconfig
+++ b/core/java/com/android/internal/os/flags.aconfig
@@ -53,6 +53,13 @@
 }
 
 flag {
+    name: "enable_media_and_location_preload"
+    namespace: "system_performance"
+    description: "Enables zygote preload of non-BCP media and location libraries."
+    bug: "241474956"
+}
+
+flag {
     name: "use_transaction_codes_for_unknown_methods"
     namespace: "stability"
     description: "Use transaction codes when the method names is unknown"
diff --git a/core/java/com/android/internal/pm/pkg/component/AconfigFlags.java b/core/java/com/android/internal/pm/pkg/component/AconfigFlags.java
index 445dac7..b57acf3 100644
--- a/core/java/com/android/internal/pm/pkg/component/AconfigFlags.java
+++ b/core/java/com/android/internal/pm/pkg/component/AconfigFlags.java
@@ -16,6 +16,7 @@
 
 package com.android.internal.pm.pkg.component;
 
+import static android.provider.flags.Flags.newStoragePublicApi;
 import static com.android.internal.pm.pkg.parsing.ParsingUtils.ANDROID_RES_NAMESPACE;
 
 import android.aconfig.DeviceProtos;
@@ -27,6 +28,7 @@
 import android.content.res.Flags;
 import android.os.Environment;
 import android.os.Process;
+import android.os.flagging.AconfigPackage;
 import android.util.ArrayMap;
 import android.util.Slog;
 import android.util.Xml;
@@ -43,6 +45,7 @@
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * A class that manages a cache of all device feature flags and their default + override values.
@@ -58,7 +61,8 @@
     private static final String OVERRIDE_PREFIX = "device_config_overrides/";
     private static final String STAGED_PREFIX = "staged/";
 
-    private final ArrayMap<String, Boolean> mFlagValues = new ArrayMap<>();
+    private final Map<String, Boolean> mFlagValues = new ArrayMap<>();
+    private final Map<String, AconfigPackage> mAconfigPackages = new ConcurrentHashMap<>();
 
     public AconfigFlags() {
         if (!Flags.manifestFlagging()) {
@@ -67,21 +71,31 @@
             }
             return;
         }
-        final var defaultFlagProtoFiles =
-                (Process.myUid() == Process.SYSTEM_UID) ? DeviceProtos.parsedFlagsProtoPaths()
-                        : Arrays.asList(DeviceProtos.PATHS);
-        for (String fileName : defaultFlagProtoFiles) {
-            try (var inputStream = new FileInputStream(fileName)) {
-                loadAconfigDefaultValues(inputStream.readAllBytes());
-            } catch (IOException e) {
-                Slog.e(LOG_TAG, "Failed to read Aconfig values from " + fileName, e);
+
+        if (useNewStorage()) {
+            Slog.i(LOG_TAG, "Using new flag storage");
+        } else {
+            Slog.i(LOG_TAG, "Using OLD proto flag storage");
+            final var defaultFlagProtoFiles =
+                    (Process.myUid() == Process.SYSTEM_UID) ? DeviceProtos.parsedFlagsProtoPaths()
+                            : Arrays.asList(DeviceProtos.PATHS);
+            for (String fileName : defaultFlagProtoFiles) {
+                try (var inputStream = new FileInputStream(fileName)) {
+                    loadAconfigDefaultValues(inputStream.readAllBytes());
+                } catch (IOException e) {
+                    Slog.w(LOG_TAG, "Failed to read Aconfig values from " + fileName, e);
+                }
+            }
+            if (Process.myUid() == Process.SYSTEM_UID) {
+                // Server overrides are only accessible to the system, no need to even try loading
+                // them in user processes.
+                loadServerOverrides();
             }
         }
-        if (Process.myUid() == Process.SYSTEM_UID) {
-            // Server overrides are only accessible to the system, no need to even try loading them
-            // in user processes.
-            loadServerOverrides();
-        }
+    }
+
+    private static boolean useNewStorage() {
+        return newStoragePublicApi() && Flags.useNewAconfigStorage();
     }
 
     private void loadServerOverrides() {
@@ -200,7 +214,55 @@
      */
     @Nullable
     public Boolean getFlagValue(@NonNull String flagPackageAndName) {
-        Boolean value = mFlagValues.get(flagPackageAndName);
+        if (useNewStorage()) {
+            return getFlagValueFromNewStorage(flagPackageAndName);
+        } else {
+            Boolean value = mFlagValues.get(flagPackageAndName);
+            if (DEBUG) {
+                Slog.v(LOG_TAG, "Aconfig flag value for " + flagPackageAndName + " = " + value);
+            }
+            return value;
+        }
+    }
+
+    private Boolean getFlagValueFromNewStorage(String flagPackageAndName) {
+        // We still need to check mFlagValues in case addFlagValuesForTesting() was called for
+        // testing purposes.
+        if (!mFlagValues.isEmpty() && mFlagValues.containsKey(flagPackageAndName)) {
+            Boolean value = mFlagValues.get(flagPackageAndName);
+            if (DEBUG) {
+                Slog.v(
+                        LOG_TAG,
+                        "Aconfig flag value (FOR TESTING) for "
+                                + flagPackageAndName
+                                + " = "
+                                + value);
+            }
+            return value;
+        }
+
+        int index = flagPackageAndName.lastIndexOf('.');
+        if (index < 0) {
+            Slog.e(LOG_TAG, "Unable to parse package name from " + flagPackageAndName);
+            return null;
+        }
+        String flagPackage = flagPackageAndName.substring(0, index);
+        String flagName = flagPackageAndName.substring(index + 1);
+        Boolean value = null;
+        AconfigPackage aconfigPackage = mAconfigPackages.computeIfAbsent(flagPackage, p -> {
+            try {
+                return AconfigPackage.load(p);
+            } catch (Exception e) {
+                Slog.e(LOG_TAG, "Failed to load aconfig package " + p, e);
+                return null;
+            }
+        });
+        if (aconfigPackage != null) {
+            // Default value is false for when the flag is not found.
+            // Note: Unlike with the old storage, with AconfigPackage, we don't have a way to
+            // know if the flag is not found or if it's found but the value is false.
+            value = aconfigPackage.getBooleanFlagValue(flagName, false);
+        }
         if (DEBUG) {
             Slog.v(LOG_TAG, "Aconfig flag value for " + flagPackageAndName + " = " + value);
         }
diff --git a/core/java/com/android/internal/protolog/IProtoLogConfigurationService.aidl b/core/java/com/android/internal/protolog/IProtoLogConfigurationService.aidl
index 9b60f49..a6f0b30 100644
--- a/core/java/com/android/internal/protolog/IProtoLogConfigurationService.aidl
+++ b/core/java/com/android/internal/protolog/IProtoLogConfigurationService.aidl
@@ -40,12 +40,12 @@
  *
  * {@hide}
  */
-oneway interface IProtoLogConfigurationService {
-    interface IRegisterClientArgs {
-        String[] getGroups();
-        boolean[] getGroupsDefaultLogcatStatus();
-        String getViewerConfigFile();
+interface IProtoLogConfigurationService {
+    parcelable RegisterClientArgs {
+        String[] groups;
+        boolean[] groupsDefaultLogcatStatus;
+        String viewerConfigFile;
     }
 
-    void registerClient(IProtoLogClient client, IRegisterClientArgs args);
+    oneway void registerClient(IProtoLogClient client, in RegisterClientArgs args);
 }
\ No newline at end of file
diff --git a/core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java b/core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java
index d8cf258..93be3b0 100644
--- a/core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java
+++ b/core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java
@@ -62,7 +62,7 @@
 import android.util.proto.ProtoOutputStream;
 
 import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.protolog.ProtoLogConfigurationServiceImpl.RegisterClientArgs;
+import com.android.internal.protolog.IProtoLogConfigurationService.RegisterClientArgs;
 import com.android.internal.protolog.common.ILogger;
 import com.android.internal.protolog.common.IProtoLog;
 import com.android.internal.protolog.common.IProtoLogGroup;
@@ -164,11 +164,15 @@
             try {
                 var args = createConfigurationServiceRegisterClientArgs();
 
-                final var groupArgs = mLogGroups.values().stream()
-                        .map(group -> new RegisterClientArgs
-                                .GroupConfig(group.name(), group.isLogToLogcat()))
-                        .toArray(RegisterClientArgs.GroupConfig[]::new);
-                args.setGroups(groupArgs);
+                args.groups = new String[mLogGroups.size()];
+                args.groupsDefaultLogcatStatus = new boolean[mLogGroups.size()];
+
+                var groups = mLogGroups.values().stream().toList();
+                for (var i = 0; i < groups.size(); i++) {
+                    var group = groups.get(i);
+                    args.groups[i] = group.name();
+                    args.groupsDefaultLogcatStatus[i] = group.isLogToLogcat();
+                }
 
                 mConfigurationService.registerClient(this, args);
             } catch (RemoteException e) {
diff --git a/core/java/com/android/internal/protolog/ProcessedPerfettoProtoLogImpl.java b/core/java/com/android/internal/protolog/ProcessedPerfettoProtoLogImpl.java
index 1f9df3c..d9c54d6 100644
--- a/core/java/com/android/internal/protolog/ProcessedPerfettoProtoLogImpl.java
+++ b/core/java/com/android/internal/protolog/ProcessedPerfettoProtoLogImpl.java
@@ -22,7 +22,7 @@
 import android.util.Log;
 
 import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.protolog.ProtoLogConfigurationServiceImpl.RegisterClientArgs;
+import com.android.internal.protolog.IProtoLogConfigurationService.RegisterClientArgs;
 import com.android.internal.protolog.common.ILogger;
 import com.android.internal.protolog.common.IProtoLogGroup;
 
@@ -104,8 +104,9 @@
     @NonNull
     @Override
     protected RegisterClientArgs createConfigurationServiceRegisterClientArgs() {
-        return new RegisterClientArgs()
-                .setViewerConfigFile(mViewerConfigFilePath);
+        var args = new RegisterClientArgs();
+        args.viewerConfigFile = mViewerConfigFilePath;
+        return args;
     }
 
     /**
diff --git a/core/java/com/android/internal/protolog/ProtoLogConfigurationServiceImpl.java b/core/java/com/android/internal/protolog/ProtoLogConfigurationServiceImpl.java
index 23f7c2a..f83359d 100644
--- a/core/java/com/android/internal/protolog/ProtoLogConfigurationServiceImpl.java
+++ b/core/java/com/android/internal/protolog/ProtoLogConfigurationServiceImpl.java
@@ -134,74 +134,6 @@
         mDataSource = datasource;
     }
 
-    public static class RegisterClientArgs extends IRegisterClientArgs.Stub {
-        /**
-         * The viewer config file to be registered for this client ProtoLog process.
-         */
-        @Nullable
-        private String mViewerConfigFile = null;
-        /**
-         * The list of all groups that this client protolog process supports and might trace.
-         */
-        @NonNull
-        private String[] mGroups = new String[0];
-        /**
-         * The default logcat status of the ProtoLog client. True is logging to logcat, false
-         * otherwise. The indices should match the indices in {@link mGroups}.
-         */
-        @NonNull
-        private boolean[] mLogcatStatus = new boolean[0];
-
-        public record GroupConfig(@NonNull String group, boolean logToLogcat) {}
-
-        /**
-         * Specify groups to register with this client that will be used for protologging in this
-         * process.
-         * @param groups to register with this client.
-         * @return self
-         */
-        public RegisterClientArgs setGroups(GroupConfig... groups) {
-            mGroups = new String[groups.length];
-            mLogcatStatus = new boolean[groups.length];
-
-            for (int i = 0; i < groups.length; i++) {
-                mGroups[i] = groups[i].group;
-                mLogcatStatus[i] = groups[i].logToLogcat;
-            }
-
-            return this;
-        }
-
-        /**
-         * Set the viewer config file that the logs in this process are using.
-         * @param viewerConfigFile The file path of the viewer config.
-         * @return self
-         */
-        public RegisterClientArgs setViewerConfigFile(@NonNull String viewerConfigFile) {
-            mViewerConfigFile = viewerConfigFile;
-
-            return this;
-        }
-
-        @Override
-        @NonNull
-        public String[] getGroups() {
-            return mGroups;
-        }
-
-        @Override
-        @NonNull
-        public boolean[] getGroupsDefaultLogcatStatus() {
-            return mLogcatStatus;
-        }
-
-        @Nullable
-        @Override
-        public String getViewerConfigFile() {
-            return mViewerConfigFile;
-        }
-    }
-
     @FunctionalInterface
     public interface ViewerConfigFileTracer {
         /**
@@ -216,16 +148,16 @@
     }
 
     @Override
-    public void registerClient(@NonNull IProtoLogClient client, @NonNull IRegisterClientArgs args)
+    public void registerClient(@NonNull IProtoLogClient client, @NonNull RegisterClientArgs args)
             throws RemoteException {
         client.asBinder().linkToDeath(() -> onClientBinderDeath(client), /* flags */ 0);
 
-        final String viewerConfigFile = args.getViewerConfigFile();
+        final String viewerConfigFile = args.viewerConfigFile;
         if (viewerConfigFile != null) {
             registerViewerConfigFile(client, viewerConfigFile);
         }
 
-        registerGroups(client, args.getGroups(), args.getGroupsDefaultLogcatStatus());
+        registerGroups(client, args.groups, args.groupsDefaultLogcatStatus);
     }
 
     @Override
diff --git a/core/java/com/android/internal/protolog/UnprocessedPerfettoProtoLogImpl.java b/core/java/com/android/internal/protolog/UnprocessedPerfettoProtoLogImpl.java
index ebb07a04..39b01fb 100644
--- a/core/java/com/android/internal/protolog/UnprocessedPerfettoProtoLogImpl.java
+++ b/core/java/com/android/internal/protolog/UnprocessedPerfettoProtoLogImpl.java
@@ -19,7 +19,7 @@
 import android.annotation.NonNull;
 import android.os.ServiceManager;
 
-import com.android.internal.protolog.ProtoLogConfigurationServiceImpl.RegisterClientArgs;
+import com.android.internal.protolog.IProtoLogConfigurationService.RegisterClientArgs;
 import com.android.internal.protolog.common.IProtoLogGroup;
 
 public class UnprocessedPerfettoProtoLogImpl extends PerfettoProtoLogImpl {
diff --git a/core/java/com/android/internal/security/TEST_MAPPING b/core/java/com/android/internal/security/TEST_MAPPING
index 5bd9d2e..be50beb 100644
--- a/core/java/com/android/internal/security/TEST_MAPPING
+++ b/core/java/com/android/internal/security/TEST_MAPPING
@@ -6,10 +6,6 @@
     {
       "name": "UpdatableSystemFontTest",
       "file_patterns": ["VerityUtils\\.java"]
-    },
-    {
-      "name": "CtsApkVerityInstallHostTestCases",
-      "file_patterns": ["VerityUtils\\.java"]
     }
   ],
   "postsubmit": [
diff --git a/core/java/com/android/internal/security/VerityUtils.java b/core/java/com/android/internal/security/VerityUtils.java
index 3750076..ac186d0 100644
--- a/core/java/com/android/internal/security/VerityUtils.java
+++ b/core/java/com/android/internal/security/VerityUtils.java
@@ -56,8 +56,7 @@
     private static final int HASH_SIZE_BYTES = 32;
 
     public static boolean isFsVeritySupported() {
-        return Build.VERSION.DEVICE_INITIAL_SDK_INT >= Build.VERSION_CODES.R
-                || SystemProperties.getInt("ro.apk_verity.mode", 0) == 2;
+        return Build.VERSION.DEVICE_INITIAL_SDK_INT >= Build.VERSION_CODES.R;
     }
 
     /** Enables fs-verity for the file without signature. */
diff --git a/core/java/com/android/internal/widget/ConversationLayout.java b/core/java/com/android/internal/widget/ConversationLayout.java
index 9a5849a..641ecc9 100644
--- a/core/java/com/android/internal/widget/ConversationLayout.java
+++ b/core/java/com/android/internal/widget/ConversationLayout.java
@@ -399,7 +399,9 @@
     @RemotableViewMethod(asyncImpl = "setIsCollapsedAsync")
     public void setIsCollapsed(boolean isCollapsed) {
         mIsCollapsed = isCollapsed;
-        mMessagingLinearLayout.setMaxDisplayedLines(isCollapsed ? 1 : Integer.MAX_VALUE);
+        mMessagingLinearLayout.setMaxDisplayedLines(isCollapsed
+                ? TextUtils.isEmpty(mSummarizedContent) ? 1 : 2
+                : Integer.MAX_VALUE);
         updateExpandButton();
         updateContentEndPaddings();
     }
@@ -448,7 +450,7 @@
 
         List<MessagingMessage> newMessagingMessages;
         mSummarizedContent = extras.getCharSequence(Notification.EXTRA_SUMMARIZED_CONTENT);
-        if (mSummarizedContent != null && mIsCollapsed) {
+        if (!TextUtils.isEmpty(mSummarizedContent) && mIsCollapsed) {
             Notification.MessagingStyle.Message summary =
                     new Notification.MessagingStyle.Message(mSummarizedContent,  0, "");
             newMessagingMessages = createMessages(List.of(summary), false, usePrecomputedText);
@@ -1162,7 +1164,7 @@
                 nameOverride = mNameReplacement;
             }
             newGroup.setShowingAvatar(!mIsOneToOne && !mIsCollapsed);
-            newGroup.setSingleLine(mIsCollapsed);
+            newGroup.setSingleLine(mIsCollapsed && TextUtils.isEmpty(mSummarizedContent));
             newGroup.setSender(sender, nameOverride);
             newGroup.setSending(groupIndex == (groups.size() - 1) && showSpinner);
             mGroups.add(newGroup);
@@ -1462,7 +1464,6 @@
                 maxHeight = Math.max(maxHeight,
                         child.getMeasuredHeight() + lp.topMargin + lp.bottomMargin);
             }
-
             maxHeight = Math.max(maxHeight, getSuggestedMinimumHeight());
             if (maxHeight != getMeasuredHeight()) {
                 setMeasuredDimension(getMeasuredWidth(), maxHeight);
diff --git a/core/java/com/android/internal/widget/MessagingLayout.java b/core/java/com/android/internal/widget/MessagingLayout.java
index 90ab660..e9d920c 100644
--- a/core/java/com/android/internal/widget/MessagingLayout.java
+++ b/core/java/com/android/internal/widget/MessagingLayout.java
@@ -198,7 +198,8 @@
                 /* isHistoric= */true, usePrecomputedText);
         List<MessagingMessage> newMessagingMessages;
         mSummarizedContent = extras.getCharSequence(Notification.EXTRA_SUMMARIZED_CONTENT);
-        if (mSummarizedContent != null && mIsCollapsed) {
+        if (!TextUtils.isEmpty(mSummarizedContent) && mIsCollapsed) {
+            mMessagingLinearLayout.setMaxDisplayedLines(2);
             Notification.MessagingStyle.Message summary =
                     new Notification.MessagingStyle.Message(mSummarizedContent,  0, "");
             newMessagingMessages = createMessages(List.of(summary), false, usePrecomputedText);
@@ -488,7 +489,7 @@
             if (sender != mUser && mNameReplacement != null) {
                 nameOverride = mNameReplacement;
             }
-            newGroup.setSingleLine(mIsCollapsed);
+            newGroup.setSingleLine(mIsCollapsed && TextUtils.isEmpty(mSummarizedContent));
             newGroup.setShowingAvatar(!mIsCollapsed);
             newGroup.setSender(sender, nameOverride);
             newGroup.setSending(groupIndex == (groups.size() - 1) && showSpinner);
diff --git a/core/java/com/android/internal/widget/NotificationProgressBar.java b/core/java/com/android/internal/widget/NotificationProgressBar.java
index 5e82772..c0fe0d1 100644
--- a/core/java/com/android/internal/widget/NotificationProgressBar.java
+++ b/core/java/com/android/internal/widget/NotificationProgressBar.java
@@ -64,6 +64,7 @@
         NotificationProgressDrawable.BoundsChangeListener {
     private static final String TAG = "NotificationProgressBar";
     private static final boolean DEBUG = false;
+    private static final float FADED_OPACITY = 0.5f;
 
     private NotificationProgressDrawable mNotificationProgressDrawable;
     private final Rect mProgressDrawableBounds = new Rect();
@@ -83,7 +84,7 @@
 
     /** @see R.styleable#NotificationProgressBar_trackerHeight */
     private final int mTrackerHeight;
-    private int mTrackerWidth;
+    private int mTrackerDrawWidth = 0;
     private int mTrackerPos;
     private final Matrix mMatrix = new Matrix();
     private Matrix mTrackerDrawMatrix = null;
@@ -157,7 +158,7 @@
         } else {
             // TODO: b/372908709 - maybe don't rerun the entire calculation every time the
             //  progress model is updated? For example, if the segments and parts aren't changed,
-            //  there is no need to call `processAndConvertToViewParts` again.
+            //  there is no need to call `processModelAndConvertToViewParts` again.
 
             final int progress = mProgressModel.getProgress();
             final int progressMax = mProgressModel.getProgressMax();
@@ -286,8 +287,11 @@
     private void configureTrackerBounds() {
         // Reset the tracker draw matrix to null
         mTrackerDrawMatrix = null;
+        mTrackerDrawWidth = 0;
 
-        if (mTracker == null || mTrackerHeight <= 0) {
+        if (mTracker == null) return;
+        if (mTrackerHeight <= 0) {
+            mTrackerDrawWidth = mTracker.getIntrinsicWidth();
             return;
         }
 
@@ -306,14 +310,14 @@
         if (dWidth > maxDWidth) {
             scale = (float) mTrackerHeight / (float) dHeight;
             dx = (maxDWidth * scale - dWidth * scale) * 0.5f;
-            mTrackerWidth = (int) (maxDWidth * scale);
+            mTrackerDrawWidth = (int) (maxDWidth * scale);
         } else if (dHeight > maxDHeight) {
             scale = (float) mTrackerHeight * 0.5f / (float) dWidth;
             dy = (maxDHeight * scale - dHeight * scale) * 0.5f;
-            mTrackerWidth = mTrackerHeight / 2;
+            mTrackerDrawWidth = mTrackerHeight / 2;
         } else {
             scale = (float) mTrackerHeight / (float) dHeight;
-            mTrackerWidth = (int) (dWidth * scale);
+            mTrackerDrawWidth = (int) (dWidth * scale);
         }
 
         mTrackerDrawMatrix.setScale(scale, scale);
@@ -449,7 +453,8 @@
                 segSegGap,
                 segPointGap,
                 pointRadius,
-                mHasTrackerIcon
+                mHasTrackerIcon,
+                mTrackerDrawWidth
         );
 
         final float segmentMinWidth = mNotificationProgressDrawable.getSegmentMinWidth();
@@ -465,7 +470,6 @@
                     segmentMinWidth,
                     pointRadius,
                     progressFraction,
-                    width,
                     isStyledByProgress,
                     progressGap
             );
@@ -493,8 +497,8 @@
                         pointRadius,
                         mHasTrackerIcon,
                         segmentMinWidth,
-                        isStyledByProgress
-                );
+                        isStyledByProgress,
+                        mTrackerDrawWidth);
             } catch (NotEnoughWidthToFitAllPartsException ex) {
                 Log.w(TAG, "Failed to stretch and rescale segments with single segment fallback",
                         ex);
@@ -522,8 +526,8 @@
                         pointRadius,
                         mHasTrackerIcon,
                         segmentMinWidth,
-                        isStyledByProgress
-                );
+                        isStyledByProgress,
+                        mTrackerDrawWidth);
             } catch (NotEnoughWidthToFitAllPartsException ex) {
                 Log.w(TAG,
                         "Failed to stretch and rescale segments with single segments and no points",
@@ -537,16 +541,20 @@
                     mParts,
                     mProgressDrawableParts,
                     progressFraction,
-                    width,
                     isStyledByProgress,
                     progressGap);
         }
 
+        // Extend the first and last segments to fill the entire width.
+        p.first.getFirst().setStart(0);
+        p.first.getLast().setEnd(width);
+
         if (DEBUG) {
             Log.d(TAG, "Updating NotificationProgressDrawable parts");
         }
         mNotificationProgressDrawable.setParts(p.first);
-        mAdjustedProgressFraction = p.second / width;
+        mAdjustedProgressFraction =
+                (p.second - mTrackerDrawWidth / 2F) / (width - mTrackerDrawWidth);
     }
 
     private void updateTrackerAndBarPos(int w, int h) {
@@ -607,7 +615,7 @@
         int available = w - mPaddingLeft - mPaddingRight;
         final int trackerWidth = tracker.getIntrinsicWidth();
         final int trackerHeight = tracker.getIntrinsicHeight();
-        available -= ((mTrackerHeight <= 0) ? trackerWidth : mTrackerWidth);
+        available -= mTrackerDrawWidth;
 
         final int trackerPos = (int) (progressFraction * available + 0.5f);
 
@@ -672,7 +680,7 @@
         canvas.translate(mPaddingLeft + mTrackerPos, mPaddingTop);
 
         if (mTrackerHeight > 0) {
-            canvas.clipRect(0, 0, mTrackerWidth, mTrackerHeight);
+            canvas.clipRect(0, 0, mTrackerDrawWidth, mTrackerHeight);
         }
 
         if (mTrackerDrawMatrix != null) {
@@ -751,6 +759,7 @@
             throw new IllegalArgumentException("Invalid progress : " + progress);
         }
 
+
         for (ProgressStyle.Point point : points) {
             final int pos = point.getPosition();
             if (pos < 0 || pos > progressMax) {
@@ -758,6 +767,19 @@
             }
         }
 
+        // There should be no points at start or end. If there are, drop them with a warning.
+        points.removeIf(point -> {
+            final int pos = point.getPosition();
+            if (pos == 0) {
+                Log.w(TAG, "Dropping point at start");
+                return true;
+            } else if (pos == progressMax) {
+                Log.w(TAG, "Dropping point at end");
+                return true;
+            }
+            return false;
+        });
+
         final Map<Integer, ProgressStyle.Segment> startToSegmentMap = generateStartToSegmentMap(
                 segments);
         final Map<Integer, ProgressStyle.Point> positionToPointMap = generatePositionToPointMap(
@@ -830,12 +852,12 @@
     }
 
     /**
-     * Get a color with an opacity that's 50% of the input color.
+     * Get a color that's the input color with opacity updated to FADED_OPACITY.
      */
     @ColorInt
     static int getFadedColor(@ColorInt int color) {
         return Color.argb(
-                (int) (Color.alpha(color) * 0.5f + 0.5f),
+                (int) (Color.alpha(color) * FADED_OPACITY + 0.5f),
                 Color.red(color),
                 Color.green(color),
                 Color.blue(color));
@@ -891,12 +913,14 @@
             float segSegGap,
             float segPointGap,
             float pointRadius,
-            boolean hasTrackerIcon
-    ) {
+            boolean hasTrackerIcon,
+            int trackerDrawWidth) {
         List<DrawablePart> drawableParts = new ArrayList<>();
 
-        // generally, we will start drawing at (x, y) and end at (x+w, y)
-        float x = (float) 0;
+        float available = totalWidth - trackerDrawWidth;
+        // Generally, we will start the first segment at (x+trackerDrawWidth/2, y) and end the last
+        // segment at (x+w-trackerDrawWidth/2, y)
+        float x = trackerDrawWidth / 2F;
 
         final int nParts = parts.size();
         for (int iPart = 0; iPart < nParts; iPart++) {
@@ -904,15 +928,14 @@
             final Part prevPart = iPart == 0 ? null : parts.get(iPart - 1);
             final Part nextPart = iPart + 1 == nParts ? null : parts.get(iPart + 1);
             if (part instanceof Segment segment) {
-                final float segWidth = segment.mFraction * totalWidth;
+                final float segWidth = segment.mFraction * available;
                 // Advance the start position to account for a point immediately prior.
-                final float startOffset = getSegStartOffset(prevPart, pointRadius, segPointGap,
-                        iPart == 1);
+                final float startOffset = getSegStartOffset(prevPart, pointRadius, segPointGap);
                 final float start = x + startOffset;
                 // Retract the end position to account for the padding and a point immediately
                 // after.
                 final float endOffset = getSegEndOffset(segment, nextPart, pointRadius, segPointGap,
-                        segSegGap, iPart == nParts - 2, hasTrackerIcon);
+                        segSegGap, hasTrackerIcon);
                 final float end = x + segWidth - endOffset;
 
                 drawableParts.add(new DrawableSegment(start, end, segment.mColor, segment.mFaded));
@@ -927,16 +950,6 @@
                 final float pointWidth = 2 * pointRadius;
                 float start = x - pointRadius;
                 float end = x + pointRadius;
-                // Only shift the points right at the start/end.
-                // For the points close to the start/end, the segment minimum width requirement
-                // would take care of shifting them to be within the bounds.
-                if (iPart == 0) {
-                    start = 0;
-                    end = pointWidth;
-                } else if (iPart == nParts - 1) {
-                    start = totalWidth - pointWidth;
-                    end = totalWidth;
-                }
 
                 drawableParts.add(new DrawablePoint(start, end, point.mColor));
             }
@@ -945,16 +958,13 @@
         return drawableParts;
     }
 
-    private static float getSegStartOffset(Part prevPart, float pointRadius, float segPointGap,
-            boolean isSecondPart) {
+    private static float getSegStartOffset(Part prevPart, float pointRadius, float segPointGap) {
         if (!(prevPart instanceof Point)) return 0F;
-        final float pointOffset = isSecondPart ? pointRadius : 0;
-        return pointOffset + pointRadius + segPointGap;
+        return pointRadius + segPointGap;
     }
 
     private static float getSegEndOffset(Segment seg, Part nextPart, float pointRadius,
-            float segPointGap, float segSegGap, boolean isSecondToLastPart,
-            boolean hasTrackerIcon) {
+            float segPointGap, float segSegGap, boolean hasTrackerIcon) {
         if (nextPart == null) return 0F;
         if (nextPart instanceof Segment nextSeg) {
             if (!seg.mFaded && nextSeg.mFaded) {
@@ -964,8 +974,7 @@
             return segSegGap;
         }
 
-        final float pointOffset = isSecondToLastPart ? pointRadius : 0;
-        return segPointGap + pointRadius + pointOffset;
+        return segPointGap + pointRadius;
     }
 
     /**
@@ -980,7 +989,6 @@
             float segmentMinWidth,
             float pointRadius,
             float progressFraction,
-            float totalWidth,
             boolean isStyledByProgress,
             float progressGap
     ) throws NotEnoughWidthToFitAllPartsException {
@@ -1003,7 +1011,6 @@
                     parts,
                     drawableParts,
                     progressFraction,
-                    totalWidth,
                     isStyledByProgress,
                     progressGap);
         }
@@ -1056,7 +1063,6 @@
                 parts,
                 drawableParts,
                 progressFraction,
-                totalWidth,
                 isStyledByProgress,
                 progressGap);
     }
@@ -1071,11 +1077,12 @@
             List<Part> parts,
             List<DrawablePart> drawableParts,
             float progressFraction,
-            float totalWidth,
             boolean isStyledByProgress,
             float progressGap
     ) {
-        if (progressFraction == 1) return new Pair<>(drawableParts, totalWidth);
+        if (progressFraction == 1) {
+            return new Pair<>(drawableParts, drawableParts.getLast().getEnd());
+        }
 
         int iPartFirstSegmentToStyle = -1;
         int iPartSegmentToSplit = -1;
@@ -1162,14 +1169,15 @@
             float pointRadius,
             boolean hasTrackerIcon,
             float segmentMinWidth,
-            boolean isStyledByProgress
+            boolean isStyledByProgress,
+            int trackerDrawWidth
     ) throws NotEnoughWidthToFitAllPartsException {
         List<Part> parts = processModelAndConvertToViewParts(segments, points, progress,
                 progressMax);
         List<DrawablePart> drawableParts = processPartsAndConvertToDrawableParts(parts, totalWidth,
-                segSegGap, segPointGap, pointRadius, hasTrackerIcon);
+                segSegGap, segPointGap, pointRadius, hasTrackerIcon, trackerDrawWidth);
         return maybeStretchAndRescaleSegments(parts, drawableParts, segmentMinWidth, pointRadius,
-                getProgressFraction(progressMax, progress), totalWidth, isStyledByProgress,
+                getProgressFraction(progressMax, progress), isStyledByProgress,
                 hasTrackerIcon ? 0F : segSegGap);
     }
 
@@ -1193,7 +1201,7 @@
          * <p>
          * <pre>
          *     When mFaded is set to true, a combination of the following is done to the segment:
-         *       1. The drawing color is mColor with opacity updated to 50%.
+         *       1. The drawing color is mColor with opacity updated to FADED_OPACITY.
          *       2. The gap between faded and non-faded segments is:
          *          - the segment-segment gap, when there is no tracker icon
          *          - 0, when there is tracker icon
diff --git a/core/java/com/android/internal/widget/remotecompose/OWNERS b/core/java/com/android/internal/widget/remotecompose/OWNERS
index 54facab..e163474 100644
--- a/core/java/com/android/internal/widget/remotecompose/OWNERS
+++ b/core/java/com/android/internal/widget/remotecompose/OWNERS
@@ -5,4 +5,3 @@
 sunnygoyal@google.com
 oscarad@google.com
 pinyaoting@google.com
-zakcohen@google.com
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 dea1caf..b8503da 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/CoreDocument.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/CoreDocument.java
@@ -35,6 +35,7 @@
 import com.android.internal.widget.remotecompose.core.operations.layout.RootLayoutComponent;
 import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.ComponentModifiers;
 import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.ModifierOperation;
+import com.android.internal.widget.remotecompose.core.operations.utilities.IntMap;
 import com.android.internal.widget.remotecompose.core.operations.utilities.StringSerializer;
 import com.android.internal.widget.remotecompose.core.serialize.MapSerializer;
 import com.android.internal.widget.remotecompose.core.serialize.Serializable;
@@ -64,7 +65,7 @@
 
     // We also keep a more fine-grained BUILD number, exposed as
     // ID_API_LEVEL = DOCUMENT_API_LEVEL + BUILD
-    static final float BUILD = 0.0f;
+    static final float BUILD = 0.2f;
 
     @NonNull ArrayList<Operation> mOperations = new ArrayList<>();
 
@@ -99,6 +100,8 @@
 
     private int mLastId = 1; // last component id when inflating the file
 
+    private IntMap<Object> mDocProperties;
+
     /** Returns a version number that is monotonically increasing. */
     public static int getDocumentApiLevel() {
         return DOCUMENT_API_LEVEL;
@@ -407,10 +410,31 @@
 
     @Override
     public void serialize(MapSerializer serializer) {
-        serializer.add("type", "CoreDocument");
-        serializer.add("width", mWidth);
-        serializer.add("height", mHeight);
-        serializer.add("operations", mOperations);
+        serializer
+                .add("type", "CoreDocument")
+                .add("width", mWidth)
+                .add("height", mHeight)
+                .add("operations", mOperations);
+    }
+
+    /**
+     * Set the properties of the document
+     *
+     * @param properties the properties to set
+     */
+    public void setProperties(IntMap<Object> properties) {
+        mDocProperties = properties;
+    }
+
+    /**
+     * @param key the key
+     * @return the value associated with the key
+     */
+    public Object getProperty(short key) {
+        if (mDocProperties == null) {
+            return null;
+        }
+        return mDocProperties.get(key);
     }
 
     // ============== Haptic support ==================
@@ -718,6 +742,7 @@
             if (op instanceof Component) {
                 mComponentMap.put(((Component) op).getComponentId(), (Component) op);
                 registerVariables(context, ((Component) op).getList());
+                ((Component) op).registerVariables(context);
             }
             if (op instanceof ComponentValue) {
                 ComponentValue v = (ComponentValue) op;
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 9bb8d9f..09ec402 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/Operations.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/Operations.java
@@ -35,6 +35,7 @@
 import com.android.internal.widget.remotecompose.core.operations.DrawBitmapInt;
 import com.android.internal.widget.remotecompose.core.operations.DrawBitmapScaled;
 import com.android.internal.widget.remotecompose.core.operations.DrawCircle;
+import com.android.internal.widget.remotecompose.core.operations.DrawContent;
 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;
@@ -81,6 +82,7 @@
 import com.android.internal.widget.remotecompose.core.operations.TimeAttribute;
 import com.android.internal.widget.remotecompose.core.operations.TouchExpression;
 import com.android.internal.widget.remotecompose.core.operations.layout.CanvasContent;
+import com.android.internal.widget.remotecompose.core.operations.layout.CanvasOperations;
 import com.android.internal.widget.remotecompose.core.operations.layout.ClickModifierOperation;
 import com.android.internal.widget.remotecompose.core.operations.layout.ComponentStart;
 import com.android.internal.widget.remotecompose.core.operations.layout.ContainerEnd;
@@ -105,6 +107,7 @@
 import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.BorderModifierOperation;
 import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.ClipRectModifierOperation;
 import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.ComponentVisibilityOperation;
+import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.DrawContentOperation;
 import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.GraphicsLayerModifierOperation;
 import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.HeightInModifierOperation;
 import com.android.internal.widget.remotecompose.core.operations.layout.modifiers.HeightModifierOperation;
@@ -172,6 +175,7 @@
     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 DRAW_CONTENT = 139;
     public static final int MATRIX_SCALE = 126;
     public static final int MATRIX_TRANSLATE = 127;
     public static final int MATRIX_SKEW = 128;
@@ -215,6 +219,8 @@
     public static final int ATTRIBUTE_TEXT = 170;
     public static final int ATTRIBUTE_IMAGE = 171;
     public static final int ATTRIBUTE_TIME = 172;
+    public static final int CANVAS_OPERATIONS = 173;
+    public static final int MODIFIER_DRAW_CONTENT = 174;
 
     ///////////////////////////////////////// ======================
 
@@ -366,6 +372,7 @@
         map.put(MODIFIER_SCROLL, ScrollModifierOperation::read);
         map.put(MODIFIER_MARQUEE, MarqueeModifierOperation::read);
         map.put(MODIFIER_RIPPLE, RippleModifierOperation::read);
+        map.put(MODIFIER_DRAW_CONTENT, DrawContentOperation::read);
 
         map.put(CONTAINER_END, ContainerEnd::read);
 
@@ -393,6 +400,7 @@
         map.put(LAYOUT_TEXT, TextLayout::read);
 
         map.put(LAYOUT_STATE, StateLayout::read);
+        map.put(DRAW_CONTENT, DrawContent::read);
 
         map.put(COMPONENT_VALUE, ComponentValue::read);
         map.put(DRAW_ARC, DrawArc::read);
@@ -409,6 +417,7 @@
         map.put(PARTICLE_LOOP, ParticlesLoop::read);
         map.put(FUNCTION_CALL, FloatFunctionCall::read);
         map.put(FUNCTION_DEFINE, FloatFunctionDefine::read);
+        map.put(CANVAS_OPERATIONS, CanvasOperations::read);
 
         map.put(ACCESSIBILITY_SEMANTICS, CoreSemantics::read);
         map.put(ATTRIBUTE_IMAGE, ImageAttribute::read);
diff --git a/core/java/com/android/internal/widget/remotecompose/core/PaintContext.java b/core/java/com/android/internal/widget/remotecompose/core/PaintContext.java
index a5b669d..1b0b9d7 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/PaintContext.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/PaintContext.java
@@ -207,6 +207,13 @@
     public abstract void restorePaint();
 
     /**
+     * Replace the current paint with the PaintBundle
+     *
+     * @param paint
+     */
+    public abstract void replacePaint(PaintBundle paint);
+
+    /**
      * draw a round rect
      *
      * @param left left coordinate of the rectangle
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 c6ef1d3..e75bd30 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/RemoteComposeBuffer.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/RemoteComposeBuffer.java
@@ -38,6 +38,7 @@
 import com.android.internal.widget.remotecompose.core.operations.DrawBitmapInt;
 import com.android.internal.widget.remotecompose.core.operations.DrawBitmapScaled;
 import com.android.internal.widget.remotecompose.core.operations.DrawCircle;
+import com.android.internal.widget.remotecompose.core.operations.DrawContent;
 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;
@@ -84,6 +85,7 @@
 import com.android.internal.widget.remotecompose.core.operations.TouchExpression;
 import com.android.internal.widget.remotecompose.core.operations.Utils;
 import com.android.internal.widget.remotecompose.core.operations.layout.CanvasContent;
+import com.android.internal.widget.remotecompose.core.operations.layout.CanvasOperations;
 import com.android.internal.widget.remotecompose.core.operations.layout.ComponentStart;
 import com.android.internal.widget.remotecompose.core.operations.layout.ContainerEnd;
 import com.android.internal.widget.remotecompose.core.operations.layout.ImpulseOperation;
@@ -191,6 +193,11 @@
     // Supported operations on the buffer
     ///////////////////////////////////////////////////////////////////////////////////////////////
 
+    /** Insert a header */
+    public void addHeader(short[] tags, Object[] values) {
+        Header.apply(mBuffer, tags, values);
+    }
+
     /**
      * Insert a header
      *
@@ -219,6 +226,28 @@
      * @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)
+     */
+    public void addHeader(
+            int width,
+            int height,
+            @Nullable String contentDescription,
+            float density,
+            long capabilities) {
+        Header.apply(mBuffer, width, height, density, capabilities);
+        int contentDescriptionId = 0;
+        if (contentDescription != null) {
+            contentDescriptionId = addText(contentDescription);
+            RootContentDescription.apply(mBuffer, contentDescriptionId);
+        }
+    }
+
+    /**
+     * Insert a header
+     *
+     * @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, @Nullable String contentDescription) {
         header(width, height, contentDescription, 1f, 0);
@@ -1860,7 +1889,7 @@
     }
 
     /** Add a component end tag */
-    public void addComponentEnd() {
+    public void addContainerEnd() {
         ContainerEnd.apply(mBuffer);
     }
 
@@ -2204,6 +2233,11 @@
         LayoutComponentContent.apply(mBuffer, mLastComponentId);
     }
 
+    /** Add a canvas operations start tag */
+    public void addCanvasOperationsStart() {
+        CanvasOperations.apply(mBuffer);
+    }
+
     /**
      * Add a component width value
      *
@@ -2400,4 +2434,9 @@
         TimeAttribute.apply(mBuffer, id, timeId, attribute, args);
         return Utils.asNan(id);
     }
+
+    /** In the context of a component draw modifier, draw the content of the component */
+    public void drawComponentContent() {
+        DrawContent.apply(mBuffer);
+    }
 }
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 36e4ec1..622f0c8 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/RemoteContext.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/RemoteContext.java
@@ -26,6 +26,7 @@
 import com.android.internal.widget.remotecompose.core.operations.utilities.ArrayAccess;
 import com.android.internal.widget.remotecompose.core.operations.utilities.CollectionsAccess;
 import com.android.internal.widget.remotecompose.core.operations.utilities.DataMap;
+import com.android.internal.widget.remotecompose.core.operations.utilities.IntMap;
 
 import java.time.LocalDateTime;
 import java.time.OffsetDateTime;
@@ -392,6 +393,7 @@
      * @param width original width of the document when created
      * @param height original height of the document when created
      * @param capabilities bitmask of capabilities used in the document (TBD)
+     * @param properties properties of the document (TBD)
      */
     public void header(
             int majorVersion,
@@ -399,13 +401,15 @@
             int patchVersion,
             int width,
             int height,
-            long capabilities) {
+            long capabilities,
+            IntMap<Object> properties) {
         mRemoteComposeState.setWindowWidth(width);
         mRemoteComposeState.setWindowHeight(height);
         mDocument.setVersion(majorVersion, minorVersion, patchVersion);
         mDocument.setWidth(width);
         mDocument.setHeight(height);
         mDocument.setRequiredCapabilities(capabilities);
+        mDocument.setProperties(properties);
     }
 
     /**
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/ColorExpression.java b/core/java/com/android/internal/widget/remotecompose/core/operations/ColorExpression.java
index a593241..d5af791 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/ColorExpression.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/ColorExpression.java
@@ -27,6 +27,8 @@
 import com.android.internal.widget.remotecompose.core.WireBuffer;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentedOperation;
+import com.android.internal.widget.remotecompose.core.serialize.MapSerializer;
+import com.android.internal.widget.remotecompose.core.serialize.Serializable;
 
 import java.util.List;
 
@@ -34,7 +36,7 @@
  * Operation to Colors Color modes mMode = 0 two colors and a tween mMode = 1 color1 is a colorID.
  * mMode = 2 color2 is a colorID. mMode = 3 color1 & color2 are ids mMode = 4 H S V mode
  */
-public class ColorExpression extends Operation implements VariableSupport {
+public class ColorExpression extends Operation implements VariableSupport, Serializable {
     private static final int OP_CODE = Operations.COLOR_EXPRESSIONS;
     private static final String CLASS_NAME = "ColorExpression";
     public int mId;
@@ -502,4 +504,36 @@
     public String deepToString(@NonNull String indent) {
         return indent + toString();
     }
+
+    @Override
+    public void serialize(MapSerializer serializer) {
+        serializer.add("type", CLASS_NAME).add("id", mId);
+        switch (mMode) {
+            case COLOR_COLOR_INTERPOLATE:
+            case ID_COLOR_INTERPOLATE:
+            case COLOR_ID_INTERPOLATE:
+            case ID_ID_INTERPOLATE:
+                serializer.add("mode", "TWEEN");
+                serializer.add("startColor", mColor1, mOutColor1);
+                serializer.add("endColor", mColor2, mOutColor2);
+                serializer.add("startColor", mTween, mOutTween);
+                break;
+            case HSV_MODE:
+                serializer.add("mode", "HSV");
+                serializer.add("hue", mHue, mOutHue);
+                serializer.add("sat", mSat, mOutSat);
+                serializer.add("val", mValue, mOutValue);
+                break;
+            case ARGB_MODE:
+            case IDARGB_MODE:
+                serializer.add("mode", "ARGB");
+                serializer.add("a", mArgbAlpha, mOutArgbAlpha);
+                serializer.add("r", mArgbRed, mOutArgbRed);
+                serializer.add("g", mArgbGreen, mOutArgbGreen);
+                serializer.add("b", mArgbBlue, mOutArgbBlue);
+                break;
+            default:
+                serializer.add("mode", "NONE");
+        }
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DataListFloat.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DataListFloat.java
index 7a72b10..fb3abdb 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/DataListFloat.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DataListFloat.java
@@ -28,11 +28,13 @@
 import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentedOperation;
 import com.android.internal.widget.remotecompose.core.operations.utilities.ArrayAccess;
+import com.android.internal.widget.remotecompose.core.serialize.MapSerializer;
+import com.android.internal.widget.remotecompose.core.serialize.Serializable;
 
 import java.util.Arrays;
 import java.util.List;
 
-public class DataListFloat extends Operation implements VariableSupport, ArrayAccess {
+public class DataListFloat extends Operation implements VariableSupport, ArrayAccess, Serializable {
     private static final int OP_CODE = Operations.FLOAT_LIST;
     private static final String CLASS_NAME = "IdListData";
     private final int mId;
@@ -145,4 +147,9 @@
     public int getLength() {
         return mValues.length;
     }
+
+    @Override
+    public void serialize(MapSerializer serializer) {
+        serializer.add("type", CLASS_NAME).add("id", mId).add("values", List.of(mValues));
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DataListIds.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DataListIds.java
index 7e29620..58fd74f 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/DataListIds.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DataListIds.java
@@ -29,11 +29,13 @@
 import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentedOperation;
 import com.android.internal.widget.remotecompose.core.operations.utilities.ArrayAccess;
+import com.android.internal.widget.remotecompose.core.serialize.MapSerializer;
+import com.android.internal.widget.remotecompose.core.serialize.Serializable;
 
 import java.util.Arrays;
 import java.util.List;
 
-public class DataListIds extends Operation implements VariableSupport, ArrayAccess {
+public class DataListIds extends Operation implements VariableSupport, ArrayAccess, Serializable {
     private static final int OP_CODE = Operations.ID_LIST;
     private static final String CLASS_NAME = "IdListData";
     private final int mId;
@@ -147,4 +149,9 @@
     public int getIntValue(int index) {
         return 0;
     }
+
+    @Override
+    public void serialize(MapSerializer serializer) {
+        serializer.add("type", CLASS_NAME).add("id", mId).add("ids", List.of(mIds));
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBase2.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBase2.java
index 6df4b91..5dbaf29 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBase2.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBase2.java
@@ -121,6 +121,6 @@
     }
 
     protected MapSerializer serialize(MapSerializer serializer, String v1Name, String v2Name) {
-        return serializer.add(v1Name, mV1, mValue1).add(v2Name, mV2, mValue2);
+        return serializer.add(v1Name, mValue1, mV1).add(v2Name, mValue2, mV2);
     }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBase3.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBase3.java
index 16ead45..238f10e 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBase3.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBase3.java
@@ -126,8 +126,8 @@
     protected MapSerializer serialize(
             MapSerializer serializer, String v1Name, String v2Name, String v3Name) {
         return serializer
-                .add(v1Name, mV1, mValue1)
-                .add(v2Name, mV2, mValue2)
-                .add(v3Name, mV3, mValue3);
+                .add(v1Name, mValue1, mV1)
+                .add(v2Name, mValue2, mV2)
+                .add(v3Name, mValue3, mV3);
     }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBase4.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBase4.java
index 0733b83..ca34e01 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBase4.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBase4.java
@@ -158,9 +158,9 @@
     protected MapSerializer serialize(
             MapSerializer serializer, String x1Name, String y1Name, String x2Name, String y2Name) {
         return serializer
-                .add(x1Name, mX1, mX1Value)
-                .add(y1Name, mY1, mY1Value)
-                .add(x2Name, mX2, mX2Value)
-                .add(y2Name, mY2, mY2Value);
+                .add(x1Name, mX1Value, mX1)
+                .add(y1Name, mY1Value, mY1)
+                .add(x2Name, mX2Value, mX2)
+                .add(y2Name, mY2Value, mY2);
     }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBase6.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBase6.java
index 75b87c0..ca0584d 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBase6.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBase6.java
@@ -173,11 +173,11 @@
             String v5Name,
             String v6Name) {
         return serializer
-                .add(v1Name, mV1, mValue1)
-                .add(v2Name, mV2, mValue2)
-                .add(v3Name, mV3, mValue3)
-                .add(v4Name, mV4, mValue4)
-                .add(v5Name, mV5, mValue5)
-                .add(v6Name, mV6, mValue6);
+                .add(v1Name, mValue1, mV1)
+                .add(v2Name, mValue2, mV2)
+                .add(v3Name, mValue3, mV3)
+                .add(v4Name, mValue4, mV4)
+                .add(v5Name, mValue5, mV5)
+                .add(v6Name, mValue6, mV6);
     }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawContent.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawContent.java
new file mode 100644
index 0000000..e2e22ac
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawContent.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 android.annotation.NonNull;
+import android.annotation.Nullable;
+
+import com.android.internal.widget.remotecompose.core.Operation;
+import com.android.internal.widget.remotecompose.core.Operations;
+import com.android.internal.widget.remotecompose.core.PaintContext;
+import com.android.internal.widget.remotecompose.core.PaintOperation;
+import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+import com.android.internal.widget.remotecompose.core.operations.layout.LayoutComponent;
+import com.android.internal.widget.remotecompose.core.serialize.MapSerializer;
+import com.android.internal.widget.remotecompose.core.serialize.Serializable;
+
+import java.util.List;
+
+/** The DrawContent command */
+public class DrawContent extends PaintOperation implements Serializable {
+    private static final int OP_CODE = Operations.DRAW_CONTENT;
+    private static final String CLASS_NAME = "DrawContent";
+    private @Nullable LayoutComponent mComponent;
+
+    @Override
+    public void write(@NonNull WireBuffer buffer) {
+        apply(buffer);
+    }
+
+    /**
+     * Set the component to be painted
+     *
+     * @param component
+     */
+    public void setComponent(LayoutComponent component) {
+        mComponent = component;
+    }
+
+    @NonNull
+    @Override
+    public String toString() {
+        return "DrawContent;";
+    }
+
+    /**
+     * Read this operation and add it to the list of operations
+     *
+     * @param buffer the buffer to read
+     * @param operations the list of operations that will be added to
+     */
+    public static void read(@NonNull WireBuffer buffer, @NonNull List<Operation> operations) {
+        DrawContent op = new DrawContent();
+        operations.add(op);
+    }
+
+    /**
+     * The name of the class
+     *
+     * @return the name
+     */
+    @NonNull
+    public static String name() {
+        return CLASS_NAME;
+    }
+
+    /**
+     * The OP_CODE for this command
+     *
+     * @return the opcode
+     */
+    public static int id() {
+        return OP_CODE;
+    }
+
+    /**
+     * add a draw content operation to the buffer
+     *
+     * @param buffer the buffer to add to
+     */
+    public static void apply(@NonNull WireBuffer buffer) {
+        buffer.start(Operations.DRAW_CONTENT);
+    }
+
+    /**
+     * Populate the documentation with a description of this operation
+     *
+     * @param doc to append the description to.
+     */
+    public static void documentation(@NonNull DocumentationBuilder doc) {
+        doc.operation("Layout Operations", OP_CODE, CLASS_NAME)
+                .description("Draw the component content");
+    }
+
+    @Override
+    public void paint(@NonNull PaintContext context) {
+        if (mComponent != null) {
+            mComponent.drawContent(context);
+        }
+    }
+
+    @Override
+    public void serialize(MapSerializer serializer) {
+        serializer.add("type", CLASS_NAME);
+    }
+}
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTextAnchored.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTextAnchored.java
index 5d0c437..92469d1 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTextAnchored.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTextAnchored.java
@@ -26,11 +26,13 @@
 import com.android.internal.widget.remotecompose.core.WireBuffer;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentedOperation;
+import com.android.internal.widget.remotecompose.core.serialize.MapSerializer;
+import com.android.internal.widget.remotecompose.core.serialize.Serializable;
 
 import java.util.List;
 
 /** Draw Text in Anchored to a point */
-public class DrawTextAnchored extends PaintOperation implements VariableSupport {
+public class DrawTextAnchored extends PaintOperation implements VariableSupport, Serializable {
     private static final int OP_CODE = Operations.DRAW_TEXT_ANCHOR;
     private static final String CLASS_NAME = "DrawTextAnchored";
     int mTextID;
@@ -238,4 +240,16 @@
         float y = Float.isNaN(mOutPanY) ? mOutY : mOutY + getVerticalOffset();
         context.drawTextRun(mTextID, 0, -1, 0, 1, x, y, (mFlags & ANCHOR_TEXT_RTL) == 1);
     }
+
+    @Override
+    public void serialize(MapSerializer serializer) {
+        serializer
+                .add("type", CLASS_NAME)
+                .add("textId", mTextID)
+                .add("x", mX, mOutX)
+                .add("y", mY, mOutY)
+                .add("panX", mPanX, mOutPanX)
+                .add("panY", mPanY, mOutPanY)
+                .add("flags", mFlags);
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTextOnPath.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTextOnPath.java
index 3ab4a87..1f7910e 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTextOnPath.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTextOnPath.java
@@ -26,11 +26,13 @@
 import com.android.internal.widget.remotecompose.core.WireBuffer;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentedOperation;
+import com.android.internal.widget.remotecompose.core.serialize.MapSerializer;
+import com.android.internal.widget.remotecompose.core.serialize.Serializable;
 
 import java.util.List;
 
 /** Draw text along a path. */
-public class DrawTextOnPath extends PaintOperation implements VariableSupport {
+public class DrawTextOnPath extends PaintOperation implements VariableSupport, Serializable {
     private static final int OP_CODE = Operations.DRAW_TEXT_ON_PATH;
     private static final String CLASS_NAME = "DrawTextOnPath";
     int mPathId;
@@ -153,4 +155,14 @@
     public void paint(@NonNull PaintContext context) {
         context.drawTextOnPath(mTextId, mPathId, mOutHOffset, mOutVOffset);
     }
+
+    @Override
+    public void serialize(MapSerializer serializer) {
+        serializer
+                .add("type", CLASS_NAME)
+                .add("pathId", mPathId)
+                .add("textId", mTextId)
+                .add("vOffset", mVOffset, mOutVOffset)
+                .add("hOffset", mHOffset, mOutHOffset);
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/FloatConstant.java b/core/java/com/android/internal/widget/remotecompose/core/operations/FloatConstant.java
index e04e691..7f3c3ed 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/FloatConstant.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/FloatConstant.java
@@ -25,30 +25,32 @@
 import com.android.internal.widget.remotecompose.core.WireBuffer;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentedOperation;
+import com.android.internal.widget.remotecompose.core.serialize.MapSerializer;
+import com.android.internal.widget.remotecompose.core.serialize.Serializable;
 
 import java.util.List;
 
-/** Operation to deal with Text data */
-public class FloatConstant extends Operation {
+/** Used to represent a float */
+public class FloatConstant extends Operation implements Serializable {
     private static final int OP_CODE = Operations.DATA_FLOAT;
     private static final String CLASS_NAME = "FloatConstant";
-    public int mTextId;
+    public int mId;
     public float mValue;
 
-    public FloatConstant(int textId, float value) {
-        this.mTextId = textId;
+    public FloatConstant(int id, float value) {
+        this.mId = id;
         this.mValue = value;
     }
 
     @Override
     public void write(@NonNull WireBuffer buffer) {
-        apply(buffer, mTextId, mValue);
+        apply(buffer, mId, mValue);
     }
 
     @NonNull
     @Override
     public String toString() {
-        return "FloatConstant[" + mTextId + "] = " + mValue;
+        return "FloatConstant[" + mId + "] = " + mValue;
     }
 
     /**
@@ -90,10 +92,10 @@
      * @param operations the list of operations that will be added to
      */
     public static void read(@NonNull WireBuffer buffer, @NonNull List<Operation> operations) {
-        int textId = buffer.readInt();
+        int id = buffer.readInt();
 
         float value = buffer.readFloat();
-        operations.add(new FloatConstant(textId, value));
+        operations.add(new FloatConstant(id, value));
     }
 
     /**
@@ -110,7 +112,7 @@
 
     @Override
     public void apply(@NonNull RemoteContext context) {
-        context.loadFloat(mTextId, mValue);
+        context.loadFloat(mId, mValue);
     }
 
     @NonNull
@@ -118,4 +120,9 @@
     public String deepToString(@NonNull String indent) {
         return indent + toString();
     }
+
+    @Override
+    public void serialize(MapSerializer serializer) {
+        serializer.add("type", CLASS_NAME).add("id", mId).add("value", mValue);
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/FloatExpression.java b/core/java/com/android/internal/widget/remotecompose/core/operations/FloatExpression.java
index e09745a..c1fa898 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/FloatExpression.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/FloatExpression.java
@@ -34,6 +34,9 @@
 import com.android.internal.widget.remotecompose.core.operations.utilities.NanMap;
 import com.android.internal.widget.remotecompose.core.operations.utilities.easing.FloatAnimation;
 import com.android.internal.widget.remotecompose.core.operations.utilities.easing.SpringStopEngine;
+import com.android.internal.widget.remotecompose.core.serialize.MapSerializer;
+import com.android.internal.widget.remotecompose.core.serialize.Serializable;
+import com.android.internal.widget.remotecompose.core.serialize.SerializeTags;
 
 import java.util.List;
 
@@ -42,7 +45,7 @@
  * like injecting the width of the component int draw rect As well as supporting generalized
  * animation floats. The floats represent a RPN style calculator
  */
-public class FloatExpression extends Operation implements VariableSupport {
+public class FloatExpression extends Operation implements VariableSupport, Serializable {
     private static final int OP_CODE = Operations.ANIMATED_FLOAT;
     private static final String CLASS_NAME = "FloatExpression";
     public int mId;
@@ -336,4 +339,14 @@
     public String deepToString(@NonNull String indent) {
         return indent + toString();
     }
+
+    @Override
+    public void serialize(MapSerializer serializer) {
+        serializer
+                .addTags(SerializeTags.EXPRESSION)
+                .add("type", CLASS_NAME)
+                .add("id", mId)
+                .addFloatExpressionSrc("srcValues", mSrcValue)
+                .add("animation", mFloatAnimation);
+    }
 }
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 98c2745..3d6316b 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
@@ -30,7 +30,11 @@
 import com.android.internal.widget.remotecompose.core.RemoteContext;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+import com.android.internal.widget.remotecompose.core.operations.utilities.IntMap;
 
+import java.io.DataInputStream;
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.List;
 
 /**
@@ -42,16 +46,75 @@
 public class Header extends Operation implements RemoteComposeOperation {
     private static final int OP_CODE = Operations.HEADER;
     private static final String CLASS_NAME = "Header";
+    private static final int MAGIC_NUMBER = 0x048C0000; // to uniquly identify the protocol
 
     int mMajorVersion;
     int mMinorVersion;
     int mPatchVersion;
 
-    int mWidth;
-    int mHeight;
+    int mWidth = 256;
+    int mHeight = 256;
 
-    float mDensity;
-    long mCapabilities;
+    float mDensity = 3;
+    long mCapabilities = 0;
+    private IntMap<Object> mProperties;
+
+    /**
+     * Get a property on the header
+     *
+     * @param property the property to get
+     * @return the value of the property
+     */
+    public Object get(short property) {
+        return mProperties.get(property);
+    }
+
+    /** the width of the document */
+    public static final short DOC_WIDTH = 5;
+
+    /** The height of the document */
+    public static final short DOC_HEIGHT = 6;
+
+    /** The density at generation */
+    public static final short DOC_DENSITY_AT_GENERATION = 7;
+
+    /** The desired FPS for the document */
+    public static final short DOC_DESIRED_FPS = 8;
+
+    /** The description of the contents of the document */
+    public static final short DOC_CONTENT_DESCRIPTION = 9;
+
+    /** The source of the document */
+    public static final short DOC_SOURCE = 11;
+
+    /** The object is an integer */
+    private static final short DATA_TYPE_INT = 0;
+
+    /** The object is an float */
+    private static final short DATA_TYPE_FLOAT = 1;
+
+    /** The object is an LONG */
+    private static final short DATA_TYPE_LONG = 2;
+
+    /** The object is an UTF-8 encoded string */
+    private static final short DATA_TYPE_STRING = 3;
+
+    private static final short[] KEYS = {
+        DOC_WIDTH,
+        DOC_HEIGHT,
+        DOC_DENSITY_AT_GENERATION,
+        DOC_DESIRED_FPS,
+        DOC_CONTENT_DESCRIPTION,
+        DOC_SOURCE
+    };
+    private static final String[] KEY_NAMES = {
+        "DOC_WIDTH",
+        "DOC_HEIGHT",
+        "DOC_DENSITY_AT_GENERATION",
+        "DOC_DESIRED_FPS",
+        "DOC_CONTENT_DESCRIPTION",
+        "DOC_SOURCE"
+    };
 
     /**
      * It encodes the version of the document (following semantic versioning) as well as the
@@ -82,6 +145,60 @@
         this.mCapabilities = capabilities;
     }
 
+    /**
+     * @param majorVersion the major version of the RemoteCompose document API
+     * @param minorVersion the minor version of the RemoteCompose document API
+     * @param patchVersion the patch version of the RemoteCompose document API
+     * @param properties the properties of the document
+     */
+    public Header(int majorVersion, int minorVersion, int patchVersion, IntMap<Object> properties) {
+        this.mMajorVersion = majorVersion;
+        this.mMinorVersion = minorVersion;
+        this.mPatchVersion = patchVersion;
+        if (properties != null) {
+            this.mProperties = properties;
+            this.mWidth = getInt(DOC_WIDTH, 256);
+            this.mHeight = getInt(DOC_HEIGHT, 256);
+            this.mDensity = getFloat(DOC_DENSITY_AT_GENERATION, 0);
+        }
+    }
+
+    private int getInt(int key, int defaultValue) {
+        Integer value = (Integer) mProperties.get(key);
+        if (value != null) {
+            return value;
+        } else {
+            return defaultValue;
+        }
+    }
+
+    private long getLong(int key, long defaultValue) {
+        Long value = (Long) mProperties.get(key);
+        if (value != null) {
+            return value;
+        } else {
+            return defaultValue;
+        }
+    }
+
+    private float getFloat(int key, float defaultValue) {
+        Float value = (Float) mProperties.get(key);
+        if (value != null) {
+            return value;
+        } else {
+            return defaultValue;
+        }
+    }
+
+    private String getString(int key, String defaultValue) {
+        String value = (String) mProperties.get(key);
+        if (value != null) {
+            return value;
+        } else {
+            return defaultValue;
+        }
+    }
+
     @Override
     public void write(@NonNull WireBuffer buffer) {
         apply(buffer, mWidth, mHeight, mDensity, mCapabilities);
@@ -90,6 +207,16 @@
     @NonNull
     @Override
     public String toString() {
+        String prop = "";
+        if (mProperties != null) {
+            for (int i = 0; i < KEYS.length; i++) {
+                Object p = mProperties.get(KEYS[i]);
+                if (p != null) {
+                    prop += "\n  " + KEY_NAMES[i] + " " + p.toString();
+                }
+            }
+            return "HEADER v" + mMajorVersion + "." + mMinorVersion + "." + mPatchVersion + prop;
+        }
         return "HEADER v"
                 + mMajorVersion
                 + "."
@@ -102,12 +229,20 @@
                 + mHeight
                 + " ["
                 + mCapabilities
-                + "]";
+                + "]"
+                + prop;
     }
 
     @Override
     public void apply(@NonNull RemoteContext context) {
-        context.header(mMajorVersion, mMinorVersion, mPatchVersion, mWidth, mHeight, mCapabilities);
+        context.header(
+                mMajorVersion,
+                mMinorVersion,
+                mPatchVersion,
+                mWidth,
+                mHeight,
+                mCapabilities,
+                mProperties);
     }
 
     @NonNull
@@ -157,6 +292,112 @@
     }
 
     /**
+     * Apply the header to the wire buffer
+     *
+     * @param buffer
+     */
+    public static void apply(@NonNull WireBuffer buffer, short[] type, Object[] value) {
+        buffer.start(OP_CODE);
+        buffer.writeInt(MAJOR_VERSION | MAGIC_NUMBER); // major version number of the protocol
+        buffer.writeInt(MINOR_VERSION); // minor version number of the protocol
+        buffer.writeInt(PATCH_VERSION); // patch version number of the protocol
+        buffer.writeInt(type.length);
+        writeMap(buffer, type, value);
+    }
+
+    /**
+     * @param is the stream to read from
+     * @return the header
+     * @throws IOException if there is an error reading the header
+     */
+    public static Header readDirect(InputStream is) throws IOException {
+        DataInputStream stream = new DataInputStream(is);
+        try {
+
+            int type = stream.readByte();
+
+            if (type != OP_CODE) {
+                throw new IOException("Invalid header " + type + " != " + OP_CODE);
+            }
+            int majorVersion = stream.readInt();
+            int minorVersion = stream.readInt();
+            int patchVersion = stream.readInt();
+
+            if (majorVersion < 0x10000) {
+                int width = stream.readInt();
+                int height = stream.readInt();
+                // float density = is.read();
+                float density = 1f;
+                long capabilities = stream.readLong();
+                return new Header(
+                        majorVersion,
+                        minorVersion,
+                        patchVersion,
+                        width,
+                        height,
+                        density,
+                        capabilities);
+            }
+
+            if ((majorVersion & 0xFFFF0000) != MAGIC_NUMBER) {
+                throw new IOException(
+                        "Invalid header MAGIC_NUMBER "
+                                + (majorVersion & 0xFFFF0000)
+                                + " != "
+                                + MAGIC_NUMBER);
+            }
+            majorVersion &= 0xFFFF;
+            int len = stream.readInt();
+            short[] types = new short[len];
+            Object[] values = new Object[len];
+            readMap(stream, types, values);
+            IntMap<Object> map = new IntMap<>();
+            for (int i = 0; i < len; i++) {
+                map.put(types[i], values[i]);
+            }
+            return new Header(majorVersion, minorVersion, patchVersion, map);
+
+        } finally {
+            stream.close();
+        }
+    }
+
+    /**
+     * Read this operation and add it to the list of operations
+     *
+     * @param stream the buffer to read
+     * @param types the list of types that will be populated
+     * @param values the list of values that will be populated
+     */
+    private static void readMap(DataInputStream stream, short[] types, Object[] values)
+            throws IOException {
+        for (int i = 0; i < types.length; i++) {
+            short tag = (short) stream.readShort();
+            int itemLen = stream.readShort();
+            int dataType = tag >> 10;
+            types[i] = (short) (tag & 0x3F);
+            Object value;
+            switch (dataType) {
+                case DATA_TYPE_INT:
+                    values[i] = stream.readInt();
+                    break;
+                case DATA_TYPE_FLOAT:
+                    values[i] = stream.readFloat();
+                    break;
+                case DATA_TYPE_LONG:
+                    values[i] = stream.readLong();
+                    break;
+                case DATA_TYPE_STRING:
+                    int slen = stream.readInt();
+                    byte[] data = new byte[slen];
+                    stream.readFully(data);
+                    values[i] = new String(data);
+                    break;
+            }
+        }
+    }
+
+    /**
      * Read this operation and add it to the list of operations
      *
      * @param buffer the buffer to read
@@ -166,21 +407,103 @@
         int majorVersion = buffer.readInt();
         int minorVersion = buffer.readInt();
         int patchVersion = buffer.readInt();
-        int width = buffer.readInt();
-        int height = buffer.readInt();
-        // float density = buffer.readFloat();
-        float density = 1f;
-        long capabilities = buffer.readLong();
-        Header header =
-                new Header(
-                        majorVersion,
-                        minorVersion,
-                        patchVersion,
-                        width,
-                        height,
-                        density,
-                        capabilities);
-        operations.add(header);
+        if (majorVersion < 0x10000) {
+            int width = buffer.readInt();
+            int height = buffer.readInt();
+            // float density = buffer.readFloat();
+            float density = 1f;
+            long capabilities = buffer.readLong();
+            Header header =
+                    new Header(
+                            majorVersion,
+                            minorVersion,
+                            patchVersion,
+                            width,
+                            height,
+                            density,
+                            capabilities);
+            operations.add(header);
+        } else {
+            majorVersion &= 0xFFFF;
+            int length = buffer.readInt();
+            short[] types = new short[length];
+            Object[] values = new Object[length];
+            readMap(buffer, types, values);
+            IntMap<Object> map = new IntMap<>();
+            for (int i = 0; i < length; i++) {
+                map.put(types[i], values[i]);
+            }
+            Header header = new Header(majorVersion, minorVersion, patchVersion, map);
+            operations.add(header);
+        }
+    }
+
+    /**
+     * Read this operation and add it to the list of operations
+     *
+     * @param buffer the buffer to read
+     * @param types the list of types that will be populated
+     * @param values the list of values that will be populated
+     */
+    private static void readMap(@NonNull WireBuffer buffer, short[] types, Object[] values) {
+        for (int i = 0; i < types.length; i++) {
+            short tag = (short) buffer.readShort();
+            int itemLen = buffer.readShort();
+            int dataType = tag >> 10;
+            types[i] = (short) (tag & 0x3F);
+            Object value;
+            switch (dataType) {
+                case DATA_TYPE_INT:
+                    values[i] = buffer.readInt();
+                    break;
+                case DATA_TYPE_FLOAT:
+                    values[i] = buffer.readFloat();
+                    break;
+                case DATA_TYPE_LONG:
+                    values[i] = buffer.readLong();
+                    break;
+                case DATA_TYPE_STRING:
+                    values[i] = buffer.readUTF8();
+                    break;
+            }
+        }
+    }
+
+    /**
+     * Write the map of values to the buffer
+     *
+     * @param buffer the buffer to read
+     * @param types the list of types that will be written
+     * @param values the list of values that will be written
+     */
+    private static void writeMap(@NonNull WireBuffer buffer, short[] types, Object[] values) {
+        for (int i = 0; i < types.length; i++) {
+            short tag = types[i];
+            if (values[i] instanceof String) {
+                tag = (short) (tag | (DATA_TYPE_STRING << 10));
+                buffer.writeShort(tag);
+                String str = (String) values[i];
+                byte[] data = str.getBytes();
+                buffer.writeShort((data.length + 4));
+                buffer.writeBuffer(data);
+            } else if (values[i] instanceof Integer) {
+                tag = (short) (tag | (DATA_TYPE_INT << 10));
+                buffer.writeShort(tag);
+                buffer.writeShort(4);
+                buffer.writeInt((Integer) values[i]);
+            } else if (values[i] instanceof Float) {
+                tag = (short) (tag | (DATA_TYPE_FLOAT << 10));
+                buffer.writeShort(tag);
+                buffer.writeShort(4);
+
+                buffer.writeFloat((float) values[i]);
+            } else if (values[i] instanceof Long) {
+                tag = (short) (tag | (DATA_TYPE_LONG << 10));
+                buffer.writeShort(tag);
+                buffer.writeShort(8);
+                buffer.writeLong((Long) values[i]);
+            }
+        }
     }
 
     /**
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/IntegerExpression.java b/core/java/com/android/internal/widget/remotecompose/core/operations/IntegerExpression.java
index f04f30d..2a5260c 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/IntegerExpression.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/IntegerExpression.java
@@ -29,6 +29,9 @@
 import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentedOperation;
 import com.android.internal.widget.remotecompose.core.operations.utilities.IntegerExpressionEvaluator;
+import com.android.internal.widget.remotecompose.core.serialize.MapSerializer;
+import com.android.internal.widget.remotecompose.core.serialize.Serializable;
+import com.android.internal.widget.remotecompose.core.serialize.SerializeTags;
 
 import java.util.Arrays;
 import java.util.List;
@@ -38,7 +41,7 @@
  * like injecting the width of the component int draw rect As well as supporting generalized
  * animation floats. The floats represent a RPN style calculator
  */
-public class IntegerExpression extends Operation implements VariableSupport {
+public class IntegerExpression extends Operation implements VariableSupport, Serializable {
     private static final int OP_CODE = Operations.INTEGER_EXPRESSION;
     private static final String CLASS_NAME = "IntegerExpression";
     public int mId;
@@ -225,4 +228,14 @@
     public static boolean isId(int mask, int i, int value) {
         return ((1 << i) & mask) != 0 && value < IntegerExpressionEvaluator.OFFSET;
     }
+
+    @Override
+    public void serialize(MapSerializer serializer) {
+        serializer
+                .addTags(SerializeTags.EXPRESSION)
+                .add("type", CLASS_NAME)
+                .add("id", mId)
+                .add("mask", mId)
+                .addIntExpressionSrc("srcValues", mSrcValue, mMask);
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/NamedVariable.java b/core/java/com/android/internal/widget/remotecompose/core/operations/NamedVariable.java
index dde632e..96628fd 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/NamedVariable.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/NamedVariable.java
@@ -26,11 +26,13 @@
 import com.android.internal.widget.remotecompose.core.WireBuffer;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentedOperation;
+import com.android.internal.widget.remotecompose.core.serialize.MapSerializer;
+import com.android.internal.widget.remotecompose.core.serialize.Serializable;
 
 import java.util.List;
 
 /** Operation to deal with Text data */
-public class NamedVariable extends Operation {
+public class NamedVariable extends Operation implements Serializable {
     private static final int OP_CODE = Operations.NAMED_VARIABLE;
     private static final String CLASS_NAME = "NamedVariable";
     public final int mVarId;
@@ -135,4 +137,28 @@
     public String deepToString(@NonNull String indent) {
         return indent + toString();
     }
+
+    @Override
+    public void serialize(MapSerializer serializer) {
+        serializer
+                .add("type", CLASS_NAME)
+                .add("varId", mVarId)
+                .add("varName", mVarName)
+                .add("varType", typeToString());
+    }
+
+    private String typeToString() {
+        switch (mVarType) {
+            case COLOR_TYPE:
+                return "COLOR_TYPE";
+            case FLOAT_TYPE:
+                return "FLOAT_TYPE";
+            case STRING_TYPE:
+                return "STRING_TYPE";
+            case IMAGE_TYPE:
+                return "IMAGE_TYPE";
+            default:
+                return "INVALID_TYPE";
+        }
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/PaintData.java b/core/java/com/android/internal/widget/remotecompose/core/operations/PaintData.java
index f756b76..8389aa7 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/PaintData.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/PaintData.java
@@ -29,11 +29,13 @@
 import com.android.internal.widget.remotecompose.core.WireBuffer;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 import com.android.internal.widget.remotecompose.core.operations.paint.PaintBundle;
+import com.android.internal.widget.remotecompose.core.serialize.MapSerializer;
+import com.android.internal.widget.remotecompose.core.serialize.Serializable;
 
 import java.util.List;
 
 /** Paint data operation */
-public class PaintData extends PaintOperation implements VariableSupport {
+public class PaintData extends PaintOperation implements VariableSupport, Serializable {
     private static final int OP_CODE = Operations.PAINT_VALUES;
     private static final String CLASS_NAME = "PaintData";
     @NonNull public PaintBundle mPaintData = new PaintBundle();
@@ -126,4 +128,9 @@
     public void paint(@NonNull PaintContext context) {
         context.applyPaint(mPaintData);
     }
+
+    @Override
+    public void serialize(MapSerializer serializer) {
+        serializer.add("type", CLASS_NAME).add("paintBundle", mPaintData);
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/PathAppend.java b/core/java/com/android/internal/widget/remotecompose/core/operations/PathAppend.java
index e7cce03..8f353ce 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/PathAppend.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/PathAppend.java
@@ -30,11 +30,13 @@
 import com.android.internal.widget.remotecompose.core.WireBuffer;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentedOperation;
+import com.android.internal.widget.remotecompose.core.serialize.MapSerializer;
+import com.android.internal.widget.remotecompose.core.serialize.Serializable;
 
 import java.util.Arrays;
 import java.util.List;
 
-public class PathAppend extends PaintOperation implements VariableSupport {
+public class PathAppend extends PaintOperation implements VariableSupport, Serializable {
     private static final int OP_CODE = Operations.PATH_ADD;
     private static final String CLASS_NAME = "PathAppend";
     int mInstanceId;
@@ -253,4 +255,12 @@
         }
         return str.toString();
     }
+
+    @Override
+    public void serialize(MapSerializer serializer) {
+        serializer
+                .add("type", CLASS_NAME)
+                .add("id", mInstanceId)
+                .add("path", pathString(mFloatPath));
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/PathCreate.java b/core/java/com/android/internal/widget/remotecompose/core/operations/PathCreate.java
index 1f76639..7aa3390 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/PathCreate.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/PathCreate.java
@@ -29,11 +29,13 @@
 import com.android.internal.widget.remotecompose.core.WireBuffer;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentedOperation;
+import com.android.internal.widget.remotecompose.core.serialize.MapSerializer;
+import com.android.internal.widget.remotecompose.core.serialize.Serializable;
 
 import java.util.Arrays;
 import java.util.List;
 
-public class PathCreate extends PaintOperation implements VariableSupport {
+public class PathCreate extends PaintOperation implements VariableSupport, Serializable {
     private static final int OP_CODE = Operations.PATH_CREATE;
     private static final String CLASS_NAME = "PathCreate";
     int mInstanceId;
@@ -237,4 +239,12 @@
     public void apply(@NonNull RemoteContext context) {
         context.loadPathData(mInstanceId, mOutputPath);
     }
+
+    @Override
+    public void serialize(MapSerializer serializer) {
+        serializer
+                .add("type", CLASS_NAME)
+                .add("id", mInstanceId)
+                .add("path", pathString(mFloatPath));
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/PathTween.java b/core/java/com/android/internal/widget/remotecompose/core/operations/PathTween.java
index 65adfea..c5add57 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/PathTween.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/PathTween.java
@@ -29,11 +29,13 @@
 import com.android.internal.widget.remotecompose.core.WireBuffer;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentedOperation;
+import com.android.internal.widget.remotecompose.core.serialize.MapSerializer;
+import com.android.internal.widget.remotecompose.core.serialize.Serializable;
 
 import java.util.List;
 
 /** Operation to deal with Path data */
-public class PathTween extends PaintOperation implements VariableSupport {
+public class PathTween extends PaintOperation implements VariableSupport, Serializable {
     private static final int OP_CODE = Operations.PATH_TWEEN;
     private static final String CLASS_NAME = "PathTween";
     public int mOutId;
@@ -155,4 +157,14 @@
     public void paint(PaintContext context) {
         context.tweenPath(mOutId, mPathId1, mPathId2, mTweenOut);
     }
+
+    @Override
+    public void serialize(MapSerializer serializer) {
+        serializer
+                .add("type", CLASS_NAME)
+                .add("outId", mOutId)
+                .add("pathId1", mPathId1)
+                .add("pathId2", mPathId2)
+                .add("tween", mTween, mTweenOut);
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/RootContentDescription.java b/core/java/com/android/internal/widget/remotecompose/core/operations/RootContentDescription.java
index c1ddf63..a6a8a81 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/RootContentDescription.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/RootContentDescription.java
@@ -25,12 +25,14 @@
 import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentedOperation;
 import com.android.internal.widget.remotecompose.core.semantics.AccessibleComponent;
+import com.android.internal.widget.remotecompose.core.serialize.MapSerializer;
+import com.android.internal.widget.remotecompose.core.serialize.Serializable;
 
 import java.util.List;
 
 /** Describe a content description for the document */
 public class RootContentDescription extends Operation
-        implements RemoteComposeOperation, AccessibleComponent {
+        implements RemoteComposeOperation, AccessibleComponent, Serializable {
     private static final int OP_CODE = Operations.ROOT_CONTENT_DESCRIPTION;
     private static final String CLASS_NAME = "RootContentDescription";
     int mContentDescription;
@@ -128,4 +130,9 @@
                 .description("Content description of root")
                 .field(DocumentedOperation.INT, "id", "id of Int");
     }
+
+    @Override
+    public void serialize(MapSerializer serializer) {
+        serializer.add("type", CLASS_NAME).add("contentDescriptionId", mContentDescription);
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/ShaderData.java b/core/java/com/android/internal/widget/remotecompose/core/operations/ShaderData.java
index 46a3290..5f6162b 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/ShaderData.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/ShaderData.java
@@ -32,6 +32,8 @@
 import com.android.internal.widget.remotecompose.core.WireBuffer;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentedOperation;
+import com.android.internal.widget.remotecompose.core.serialize.MapSerializer;
+import com.android.internal.widget.remotecompose.core.serialize.Serializable;
 
 import java.util.Arrays;
 import java.util.HashMap;
@@ -41,7 +43,7 @@
  * Operation to deal with bitmap data On getting an Image during a draw call the bitmap is
  * compressed and saved in playback the image is decompressed
  */
-public class ShaderData extends Operation implements VariableSupport {
+public class ShaderData extends Operation implements VariableSupport, Serializable {
     private static final int OP_CODE = Operations.DATA_SHADER;
     private static final String CLASS_NAME = "ShaderData";
     int mShaderTextId; // the actual text of a shader
@@ -384,4 +386,15 @@
     public void enable(boolean shaderValid) {
         mShaderValid = shaderValid;
     }
+
+    @Override
+    public void serialize(MapSerializer serializer) {
+        serializer
+                .add("type", CLASS_NAME)
+                .add("shaderTextId", mShaderTextId)
+                .add("shaderID", mShaderID)
+                .add("uniformRawFloatMap", mUniformRawFloatMap)
+                .add("uniformFloatMap", mUniformFloatMap)
+                .add("uniformBitmapMap", mUniformBitmapMap);
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/TextAttribute.java b/core/java/com/android/internal/widget/remotecompose/core/operations/TextAttribute.java
index 45cced3..3e72995d 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/TextAttribute.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/TextAttribute.java
@@ -27,11 +27,13 @@
 import com.android.internal.widget.remotecompose.core.PaintOperation;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+import com.android.internal.widget.remotecompose.core.serialize.MapSerializer;
+import com.android.internal.widget.remotecompose.core.serialize.Serializable;
 
 import java.util.List;
 
 /** Operation to Measure Text data */
-public class TextAttribute extends PaintOperation {
+public class TextAttribute extends PaintOperation implements Serializable {
     private static final int OP_CODE = Operations.ATTRIBUTE_TEXT;
     private static final String CLASS_NAME = "TextMeasure";
     public int mId;
@@ -167,4 +169,34 @@
                 break;
         }
     }
+
+    @Override
+    public void serialize(MapSerializer serializer) {
+        serializer
+                .add("type", CLASS_NAME)
+                .add("id", mId)
+                .add("textId", mTextId)
+                .add("measureType", typeToString());
+    }
+
+    private String typeToString() {
+        switch (mType) {
+            case MEASURE_WIDTH:
+                return "MEASURE_WIDTH";
+            case MEASURE_HEIGHT:
+                return "MEASURE_HEIGHT";
+            case MEASURE_LEFT:
+                return "MEASURE_LEFT";
+            case MEASURE_RIGHT:
+                return "MEASURE_RIGHT";
+            case MEASURE_TOP:
+                return "MEASURE_TOP";
+            case MEASURE_BOTTOM:
+                return "MEASURE_BOTTOM";
+            case TEXT_LENGTH:
+                return "TEXT_LENGTH";
+            default:
+                return "INVALID_TYPE";
+        }
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/TextData.java b/core/java/com/android/internal/widget/remotecompose/core/operations/TextData.java
index 5788d8f..419e6d0 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/TextData.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/TextData.java
@@ -27,11 +27,13 @@
 import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentedOperation;
 import com.android.internal.widget.remotecompose.core.operations.utilities.StringSerializer;
+import com.android.internal.widget.remotecompose.core.serialize.MapSerializer;
+import com.android.internal.widget.remotecompose.core.serialize.Serializable;
 
 import java.util.List;
 
 /** Operation to deal with Text data */
-public class TextData extends Operation implements SerializableToString {
+public class TextData extends Operation implements SerializableToString, Serializable {
     private static final int OP_CODE = Operations.DATA_TEXT;
     private static final String CLASS_NAME = "TextData";
     public final int mTextId;
@@ -131,4 +133,9 @@
     private String getSerializedName() {
         return "DATA_TEXT";
     }
+
+    @Override
+    public void serialize(MapSerializer serializer) {
+        serializer.add("type", CLASS_NAME).add("textId", mTextId).add("text", mText);
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/TextFromFloat.java b/core/java/com/android/internal/widget/remotecompose/core/operations/TextFromFloat.java
index cc0ff02..6b2f49b 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/TextFromFloat.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/TextFromFloat.java
@@ -28,6 +28,8 @@
 import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentedOperation;
 import com.android.internal.widget.remotecompose.core.operations.utilities.StringUtils;
+import com.android.internal.widget.remotecompose.core.serialize.MapSerializer;
+import com.android.internal.widget.remotecompose.core.serialize.Serializable;
 
 import java.util.List;
 
@@ -36,7 +38,7 @@
  * [command][textID][before,after][flags] before and after define number of digits before and after
  * the decimal point
  */
-public class TextFromFloat extends Operation implements VariableSupport {
+public class TextFromFloat extends Operation implements VariableSupport, Serializable {
     private static final int OP_CODE = Operations.TEXT_FROM_FLOAT;
     private static final String CLASS_NAME = "TextFromFloat";
     public int mTextId;
@@ -209,4 +211,15 @@
     public String deepToString(@NonNull String indent) {
         return indent + toString();
     }
+
+    @Override
+    public void serialize(MapSerializer serializer) {
+        serializer
+                .add("type", CLASS_NAME)
+                .add("textId", mTextId)
+                .add("value", mValue, mOutValue)
+                .add("digitsBefore", mDigitsBefore)
+                .add("digitsAfter", mDigitsAfter)
+                .add("flags", mFlags);
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/TextLookup.java b/core/java/com/android/internal/widget/remotecompose/core/operations/TextLookup.java
index dceb8b6..e8865c2 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/TextLookup.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/TextLookup.java
@@ -26,6 +26,8 @@
 import com.android.internal.widget.remotecompose.core.VariableSupport;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+import com.android.internal.widget.remotecompose.core.serialize.MapSerializer;
+import com.android.internal.widget.remotecompose.core.serialize.Serializable;
 
 import java.util.List;
 
@@ -34,7 +36,7 @@
  * [command][textID][before,after][flags] before and after define number of digits before and after
  * the decimal point
  */
-public class TextLookup extends Operation implements VariableSupport {
+public class TextLookup extends Operation implements VariableSupport, Serializable {
     private static final int OP_CODE = Operations.TEXT_LOOKUP;
     private static final String CLASS_NAME = "TextFromFloat";
     public int mTextId;
@@ -150,4 +152,13 @@
     public String deepToString(@NonNull String indent) {
         return indent + toString();
     }
+
+    @Override
+    public void serialize(MapSerializer serializer) {
+        serializer
+                .add("type", CLASS_NAME)
+                .add("textId", mTextId)
+                .add("dataSetId", mDataSetId)
+                .add("indexId", mIndex, mOutIndex);
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/TextLookupInt.java b/core/java/com/android/internal/widget/remotecompose/core/operations/TextLookupInt.java
index 823b706..de20255 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/TextLookupInt.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/TextLookupInt.java
@@ -26,11 +26,13 @@
 import com.android.internal.widget.remotecompose.core.WireBuffer;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentedOperation;
+import com.android.internal.widget.remotecompose.core.serialize.MapSerializer;
+import com.android.internal.widget.remotecompose.core.serialize.Serializable;
 
 import java.util.List;
 
 /** Operation convert int index of a list to text */
-public class TextLookupInt extends Operation implements VariableSupport {
+public class TextLookupInt extends Operation implements VariableSupport, Serializable {
     private static final int OP_CODE = Operations.TEXT_LOOKUP_INT;
     private static final String CLASS_NAME = "TextFromINT";
     public int mTextId;
@@ -143,4 +145,13 @@
     public String deepToString(@NonNull String indent) {
         return indent + toString();
     }
+
+    @Override
+    public void serialize(MapSerializer serializer) {
+        serializer
+                .add("type", CLASS_NAME)
+                .add("textId", mTextId)
+                .add("dataSetId", mDataSetId)
+                .add("indexId", mIndex, mOutIndex);
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/TextMerge.java b/core/java/com/android/internal/widget/remotecompose/core/operations/TextMerge.java
index d695615..262916d 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/TextMerge.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/TextMerge.java
@@ -25,11 +25,13 @@
 import com.android.internal.widget.remotecompose.core.WireBuffer;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentedOperation;
+import com.android.internal.widget.remotecompose.core.serialize.MapSerializer;
+import com.android.internal.widget.remotecompose.core.serialize.Serializable;
 
 import java.util.List;
 
 /** Operation to deal with Text data */
-public class TextMerge extends Operation {
+public class TextMerge extends Operation implements Serializable {
     private static final int OP_CODE = Operations.TEXT_MERGE;
     private static final String CLASS_NAME = "TextMerge";
     public int mTextId;
@@ -126,4 +128,13 @@
     public String deepToString(@NonNull String indent) {
         return indent + toString();
     }
+
+    @Override
+    public void serialize(MapSerializer serializer) {
+        serializer
+                .add("type", CLASS_NAME)
+                .add("id", mTextId)
+                .add("leftId", mSrcId1)
+                .add("rightId", mSrcId2);
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/TouchExpression.java b/core/java/com/android/internal/widget/remotecompose/core/operations/TouchExpression.java
index 9976281..2591a4c 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/TouchExpression.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/TouchExpression.java
@@ -35,6 +35,8 @@
 import com.android.internal.widget.remotecompose.core.operations.utilities.AnimatedFloatExpression;
 import com.android.internal.widget.remotecompose.core.operations.utilities.NanMap;
 import com.android.internal.widget.remotecompose.core.operations.utilities.touch.VelocityEasing;
+import com.android.internal.widget.remotecompose.core.serialize.MapSerializer;
+import com.android.internal.widget.remotecompose.core.serialize.Serializable;
 
 import java.util.Arrays;
 import java.util.List;
@@ -44,7 +46,8 @@
  * touch behaviours. Including animating to Notched, positions. and tweaking the dynamics of the
  * animation.
  */
-public class TouchExpression extends Operation implements VariableSupport, TouchListener {
+public class TouchExpression extends Operation
+        implements VariableSupport, TouchListener, Serializable {
     private static final int OP_CODE = Operations.TOUCH_EXPRESSION;
     private static final String CLASS_NAME = "TouchExpression";
     private float mDefValue;
@@ -709,4 +712,16 @@
     public String deepToString(@NonNull String indent) {
         return indent + toString();
     }
+
+    @Override
+    public void serialize(MapSerializer serializer) {
+        serializer
+                .add("type", CLASS_NAME)
+                .add("id", mId)
+                .add("mDefValue", mDefValue, mOutDefValue)
+                .add("min", mMin, mOutMin)
+                .add("max", mMax, mOutMax)
+                .add("mode", mMode)
+                .addFloatExpressionSrc("srcExp", mSrcExp);
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/CanvasOperations.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/CanvasOperations.java
new file mode 100644
index 0000000..3e7f1d3
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/CanvasOperations.java
@@ -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.internal.widget.remotecompose.core.operations.layout;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+
+import com.android.internal.widget.remotecompose.core.Operation;
+import com.android.internal.widget.remotecompose.core.Operations;
+import com.android.internal.widget.remotecompose.core.PaintContext;
+import com.android.internal.widget.remotecompose.core.PaintOperation;
+import com.android.internal.widget.remotecompose.core.RemoteContext;
+import com.android.internal.widget.remotecompose.core.VariableSupport;
+import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+import com.android.internal.widget.remotecompose.core.operations.ComponentValue;
+import com.android.internal.widget.remotecompose.core.operations.DrawContent;
+import com.android.internal.widget.remotecompose.core.serialize.MapSerializer;
+import com.android.internal.widget.remotecompose.core.serialize.Serializable;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/** Represents a list of canvas operations. */
+public class CanvasOperations extends PaintOperation
+        implements VariableSupport, Container, Serializable {
+    private static final int OP_CODE = Operations.CANVAS_OPERATIONS;
+    private static final String CLASS_NAME = "CanvasOperations";
+
+    @NonNull public ArrayList<Operation> mList = new ArrayList<>();
+    @Nullable LayoutComponent mComponent;
+
+    /** The constructor */
+    public CanvasOperations() {}
+
+    @Override
+    public void registerListening(RemoteContext context) {
+        for (Operation operation : mList) {
+            if (operation instanceof VariableSupport) {
+                VariableSupport variableSupport = (VariableSupport) operation;
+                variableSupport.registerListening(context);
+            }
+            if (operation instanceof ComponentValue) {
+                ComponentValue v = (ComponentValue) operation;
+                mComponent.addComponentValue(v);
+            }
+        }
+    }
+
+    @Override
+    public void updateVariables(RemoteContext context) {
+        for (Operation operation : mList) {
+            if (operation instanceof VariableSupport) {
+                VariableSupport variableSupport = (VariableSupport) operation;
+                variableSupport.updateVariables(context);
+            }
+        }
+    }
+
+    /**
+     * The returns a list to be filled
+     *
+     * @return list to be filled
+     */
+    @NonNull
+    public ArrayList<Operation> getList() {
+        return mList;
+    }
+
+    @Override
+    public void write(@NonNull WireBuffer buffer) {
+        apply(buffer);
+    }
+
+    @NonNull
+    @Override
+    public String toString() {
+        StringBuilder builder = new StringBuilder(CLASS_NAME + "\n");
+        for (Operation operation : mList) {
+            builder.append("  ");
+            builder.append(operation);
+            builder.append("\n");
+        }
+        return builder.toString();
+    }
+
+    @NonNull
+    @Override
+    public String deepToString(@NonNull String indent) {
+        return (indent != null ? indent : "") + toString();
+    }
+
+    @Override
+    public void paint(@NonNull PaintContext context) {
+        RemoteContext remoteContext = context.getContext();
+        for (Operation op : mList) {
+            if (op instanceof VariableSupport && op.isDirty()) {
+                ((VariableSupport) op).updateVariables(context.getContext());
+            }
+            remoteContext.incrementOpCount();
+            op.apply(context.getContext());
+        }
+    }
+
+    /**
+     * The name of the class
+     *
+     * @return the name
+     */
+    @NonNull
+    public static String name() {
+        return "Loop";
+    }
+
+    /**
+     * Apply this operation to the buffer
+     *
+     * @param buffer
+     */
+    public static void apply(@NonNull WireBuffer buffer) {
+        buffer.start(OP_CODE);
+    }
+
+    /**
+     * Read this operation and add it to the list of operations
+     *
+     * @param buffer the buffer to read
+     * @param operations the list of operations that will be added to
+     */
+    public static void read(@NonNull WireBuffer buffer, @NonNull List<Operation> operations) {
+        operations.add(new CanvasOperations());
+    }
+
+    /**
+     * Populate the documentation with a description of this operation
+     *
+     * @param doc to append the description to.
+     */
+    public static void documentation(@NonNull DocumentationBuilder doc) {
+        doc.operation("Operations", OP_CODE, name())
+                .description("Impulse Process that runs a list of operations");
+    }
+
+    @Override
+    public void serialize(MapSerializer serializer) {
+        serializer.add("type", CLASS_NAME).add("list", mList);
+    }
+
+    /**
+     * Set layout component
+     *
+     * @param layoutComponent
+     */
+    public void setComponent(LayoutComponent layoutComponent) {
+        mComponent = layoutComponent;
+        for (Operation op : mList) {
+            if (op instanceof DrawContent) {
+                ((DrawContent) op).setComponent(layoutComponent);
+            }
+        }
+    }
+}
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/Component.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/Component.java
index e332e4b..c736436 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/Component.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/Component.java
@@ -329,6 +329,15 @@
         mAnimationSpec = animationSpec;
     }
 
+    /**
+     * If the component contains variables beside mList, make sure to register them here
+     *
+     * @param context
+     */
+    public void registerVariables(RemoteContext context) {
+        // Nothing here
+    }
+
     public enum Visibility {
         GONE,
         VISIBLE,
@@ -976,6 +985,17 @@
         }
     }
 
+    /** Extract CanvasOperations if present */
+    public @Nullable CanvasOperations getCanvasOperations(LayoutComponent layoutComponent) {
+        for (Operation op : mList) {
+            if (op instanceof CanvasOperations) {
+                ((CanvasOperations) op).setComponent(layoutComponent);
+                return (CanvasOperations) op;
+            }
+        }
+        return null;
+    }
+
     /**
      * Extract child TextData elements
      *
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/ImpulseProcess.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/ImpulseProcess.java
index f896f3d..8c9dd76 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/ImpulseProcess.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/ImpulseProcess.java
@@ -25,12 +25,15 @@
 import com.android.internal.widget.remotecompose.core.VariableSupport;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+import com.android.internal.widget.remotecompose.core.serialize.MapSerializer;
+import com.android.internal.widget.remotecompose.core.serialize.Serializable;
 
 import java.util.ArrayList;
 import java.util.List;
 
 /** Represents the repeating part of an Impulse. */
-public class ImpulseProcess extends PaintOperation implements VariableSupport, Container {
+public class ImpulseProcess extends PaintOperation
+        implements VariableSupport, Container, Serializable {
     private static final int OP_CODE = Operations.IMPULSE_PROCESS;
     private static final String CLASS_NAME = "ImpulseProcess";
 
@@ -151,4 +154,9 @@
     public int estimateIterations() {
         return 1;
     }
+
+    @Override
+    public void serialize(MapSerializer serializer) {
+        serializer.add("type", CLASS_NAME).add("list", mList);
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/LayoutComponent.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/LayoutComponent.java
index 10cbd4c..7e2a4cc 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/LayoutComponent.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/LayoutComponent.java
@@ -75,6 +75,7 @@
     protected ArrayList<Component> mChildrenComponents = new ArrayList<>(); // members are not null
 
     protected boolean mChildrenHaveZIndex = false;
+    private CanvasOperations mDrawContentOperations;
 
     public LayoutComponent(
             @Nullable Component parent,
@@ -138,6 +139,7 @@
                 mChildrenComponents.clear();
                 LayoutComponentContent content = (LayoutComponentContent) op;
                 content.getComponents(mChildrenComponents);
+                mDrawContentOperations = content.getCanvasOperations(this);
                 if (USE_IMAGE_TEMP_FIX) {
                     if (mChildrenComponents.isEmpty() && !mContent.mList.isEmpty()) {
                         CanvasContent canvasContent =
@@ -315,6 +317,31 @@
     }
 
     @Override
+    public void paint(@NonNull PaintContext context) {
+        if (mDrawContentOperations != null) {
+            context.save();
+            context.translate(mX, mY);
+            mDrawContentOperations.paint(context);
+            context.restore();
+            return;
+        }
+        super.paint(context);
+    }
+
+    /**
+     * Paint the component content. Used by the DrawContent operation. (back out mX/mY -- TODO:
+     * refactor paintingComponent instead, to not include mX/mY etc.)
+     *
+     * @param context painting context
+     */
+    public void drawContent(@NonNull PaintContext context) {
+        context.save();
+        context.translate(-mX, -mY);
+        paintingComponent(context);
+        context.restore();
+    }
+
+    @Override
     public void paintingComponent(@NonNull PaintContext context) {
         Component prev = context.getContext().mLastComponent;
         RemoteContext remoteContext = context.getContext();
@@ -514,4 +541,11 @@
 
         return null;
     }
+
+    @Override
+    public void registerVariables(RemoteContext context) {
+        if (mDrawContentOperations != null) {
+            mDrawContentOperations.registerListening(context);
+        }
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/LoopOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/LoopOperation.java
index 0f4cf56..2b63cf2 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/LoopOperation.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/LoopOperation.java
@@ -27,12 +27,16 @@
 import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentedOperation;
 import com.android.internal.widget.remotecompose.core.operations.Utils;
+import com.android.internal.widget.remotecompose.core.serialize.MapSerializer;
+import com.android.internal.widget.remotecompose.core.serialize.Serializable;
 
 import java.util.ArrayList;
 import java.util.List;
 
 /** Represents a loop of operations */
-public class LoopOperation extends PaintOperation implements Container, VariableSupport {
+public class LoopOperation extends PaintOperation
+        implements Container, VariableSupport, Serializable {
+    private static final String CLASS_NAME = "LoopOperation";
 
     private static final int OP_CODE = Operations.LOOP_START;
 
@@ -198,4 +202,16 @@
         }
         return 10; // this is a generic estmate if the values are variables;
     }
+
+    @Override
+    public void serialize(MapSerializer serializer) {
+        serializer
+                .add("type", CLASS_NAME)
+                .add("indexVariableId", mIndexVariableId)
+                .add("until", mUntil, mUntilOut)
+                .add("from", mFrom, mFromOut)
+                .add("step", mStep, mStepOut)
+                .add("mUntilOut", mUntilOut)
+                .add("list", mList);
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/TextLayout.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/TextLayout.java
index 1cfb50724..d5db74b 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/TextLayout.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/managers/TextLayout.java
@@ -209,7 +209,7 @@
         mPaint.setColor(mColor);
         mPaint.setTextSize(mFontSize);
         mPaint.setTextStyle(mType, (int) mFontWeight, mFontStyle == 1);
-        context.applyPaint(mPaint);
+        context.replacePaint(mPaint);
         if (mCachedString == null) {
             return;
         }
@@ -330,7 +330,7 @@
         mPaint.setTextSize(mFontSize);
         mPaint.setTextStyle(mType, (int) mFontWeight, mFontStyle == 1);
         mPaint.setColor(mColor);
-        context.applyPaint(mPaint);
+        context.replacePaint(mPaint);
         float[] bounds = new float[4];
         if (mCachedString == null) {
             return;
@@ -343,7 +343,7 @@
             flags |= PaintContext.TEXT_COMPLEX;
         }
         context.getTextBounds(mTextId, 0, mCachedString.length(), flags, bounds);
-        if (bounds[2] - bounds[1] > maxWidth) {
+        if (bounds[2] - bounds[1] > maxWidth && mMaxLines > 1) {
             mComputedTextLayout =
                     context.layoutComplexText(
                             mTextId,
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/BackgroundModifierOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/BackgroundModifierOperation.java
index dc1b875..fd5f8c9 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/BackgroundModifierOperation.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/BackgroundModifierOperation.java
@@ -196,7 +196,7 @@
         mPaint.reset();
         mPaint.setStyle(PaintBundle.STYLE_FILL);
         mPaint.setColor(mR, mG, mB, mA);
-        context.applyPaint(mPaint);
+        context.replacePaint(mPaint);
         if (mShapeType == ShapeType.RECTANGLE) {
             context.drawRect(0f, 0f, mWidth, mHeight);
         } else if (mShapeType == ShapeType.CIRCLE) {
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/BorderModifierOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/BorderModifierOperation.java
index 3acbd88..e5f3183 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/BorderModifierOperation.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/BorderModifierOperation.java
@@ -252,7 +252,7 @@
         paint.setColor(mR, mG, mB, mA);
         paint.setStrokeWidth(mBorderWidth);
         paint.setStyle(PaintBundle.STYLE_STROKE);
-        context.applyPaint(paint);
+        context.replacePaint(paint);
         if (mShapeType == ShapeType.RECTANGLE) {
             context.drawRect(0f, 0f, mWidth, mHeight);
         } else {
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/DrawContentOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/DrawContentOperation.java
new file mode 100644
index 0000000..d7abdba
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/DrawContentOperation.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.internal.widget.remotecompose.core.operations.layout.modifiers;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+
+import com.android.internal.widget.remotecompose.core.Operation;
+import com.android.internal.widget.remotecompose.core.Operations;
+import com.android.internal.widget.remotecompose.core.RemoteContext;
+import com.android.internal.widget.remotecompose.core.VariableSupport;
+import com.android.internal.widget.remotecompose.core.WireBuffer;
+import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
+import com.android.internal.widget.remotecompose.core.operations.layout.Component;
+import com.android.internal.widget.remotecompose.core.operations.layout.DecoratorComponent;
+import com.android.internal.widget.remotecompose.core.operations.layout.LayoutComponent;
+import com.android.internal.widget.remotecompose.core.operations.utilities.StringSerializer;
+import com.android.internal.widget.remotecompose.core.serialize.MapSerializer;
+import com.android.internal.widget.remotecompose.core.serialize.SerializeTags;
+
+import java.util.List;
+
+/** Represent a drawing of a component */
+public class DrawContentOperation extends Operation
+        implements ModifierOperation, VariableSupport, DecoratorComponent {
+    private static final int OP_CODE = Operations.MODIFIER_DRAW_CONTENT;
+
+    private LayoutComponent mParent;
+
+    public DrawContentOperation() {}
+
+    @NonNull
+    @Override
+    public String toString() {
+        return "DrawContentOperation()";
+    }
+
+    /**
+     * Returns the serialized name for this operation
+     *
+     * @return the serialized name
+     */
+    @NonNull
+    public String serializedName() {
+        return "DRAW_CONTENT";
+    }
+
+    @Override
+    public void serializeToString(int indent, @NonNull StringSerializer serializer) {
+        serializer.append(indent, serializedName());
+    }
+
+    @Override
+    public void apply(@NonNull RemoteContext context) {}
+
+    @NonNull
+    @Override
+    public String deepToString(@NonNull String indent) {
+        return (indent != null ? indent : "") + toString();
+    }
+
+    @Override
+    public void write(@NonNull WireBuffer buffer) {}
+
+    /**
+     * Write the operation to the buffer
+     *
+     * @param buffer a WireBuffer
+     */
+    public static void apply(@NonNull WireBuffer buffer) {
+        buffer.start(OP_CODE);
+    }
+
+    /**
+     * Read this operation and add it to the list of operations
+     *
+     * @param buffer the buffer to read
+     * @param operations the list of operations that will be added to
+     */
+    public static void read(@NonNull WireBuffer buffer, @NonNull List<Operation> operations) {
+        operations.add(new DrawContentOperation());
+    }
+
+    /**
+     * Populate the documentation with a description of this operation
+     *
+     * @param doc to append the description to.
+     */
+    public static void documentation(@NonNull DocumentationBuilder doc) {
+        doc.operation("Layout Operations", OP_CODE, "ComponentVisibility")
+                .description("This operation represents a draw of a component");
+    }
+
+    @Override
+    public void registerListening(@NonNull RemoteContext context) {}
+
+    @Override
+    public void updateVariables(@NonNull RemoteContext context) {}
+
+    public void setParent(@Nullable LayoutComponent parent) {
+        mParent = parent;
+    }
+
+    @Override
+    public void layout(
+            @NonNull RemoteContext context, Component component, float width, float height) {}
+
+    @Override
+    public void serialize(MapSerializer serializer) {
+        serializer.addTags(SerializeTags.MODIFIER).add("type", "DrawContentOperation");
+    }
+}
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/RippleModifierOperation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/RippleModifierOperation.java
index d3004aa..69ace84 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/RippleModifierOperation.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/layout/modifiers/RippleModifierOperation.java
@@ -126,7 +126,7 @@
 
         float radius = Math.max(mWidth, mHeight) * tweenRadius;
         mPaint.setColor(paintedColor);
-        context.applyPaint(mPaint);
+        context.replacePaint(mPaint);
         context.clipRect(0f, 0f, mWidth, mHeight);
         context.drawCircle(mAnimateRippleX, mAnimateRippleY, radius);
         context.restorePaint();
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/paint/PaintBundle.java b/core/java/com/android/internal/widget/remotecompose/core/operations/paint/PaintBundle.java
index 4c7f503e..0f17b11 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/paint/PaintBundle.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/paint/PaintBundle.java
@@ -15,6 +15,8 @@
  */
 package com.android.internal.widget.remotecompose.core.operations.paint;
 
+import static com.android.internal.widget.remotecompose.core.serialize.MapSerializer.orderedOf;
+
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 
@@ -23,11 +25,16 @@
 import com.android.internal.widget.remotecompose.core.VariableSupport;
 import com.android.internal.widget.remotecompose.core.WireBuffer;
 import com.android.internal.widget.remotecompose.core.operations.Utils;
+import com.android.internal.widget.remotecompose.core.serialize.MapSerializer;
+import com.android.internal.widget.remotecompose.core.serialize.Serializable;
 
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
 
 /** Paint Bundle represents a delta of changes to a paint object */
-public class PaintBundle {
+public class PaintBundle implements Serializable {
     @NonNull int[] mArray = new int[200];
     @Nullable int[] mOutArray = null;
     int mPos = 0;
@@ -337,7 +344,6 @@
                         }
                     }
                 }
-
                 len = array[ret++]; // stops
                 for (int j = 0; j < len; j++) {
                     registerFloat(array[ret++], context, support);
@@ -1239,4 +1245,201 @@
 
         return ret;
     }
+
+    @Override
+    public void serialize(MapSerializer serializer) {
+        serializer.add("type", "PaintBundle");
+        List<Map<String, Object>> list = new ArrayList<>();
+        int i = 0;
+        while (i < mPos) {
+            int cmd = mArray[i++];
+            int type = cmd & 0xFFFF;
+            switch (type) {
+                case TEXT_SIZE:
+                    list.add(orderedOf("type", "TextSize", "size", getVariable(mArray[i++])));
+                    break;
+                case TYPEFACE:
+                    int style = (cmd >> 16);
+                    float weight = (float) (style & 0x3ff);
+                    boolean italic = (style >> 10) > 0;
+                    int fontFamily = mArray[i++];
+                    list.add(orderedOf("type", "FontFamily", "fontFamily", fontFamily));
+                    list.add(orderedOf("type", "FontWeight", "weight", weight));
+                    list.add(orderedOf("type", "TypeFace", "italic", italic));
+                    break;
+                case COLOR:
+                    list.add(orderedOf("type", "Color", "color", colorInt(mArray[i++])));
+                    break;
+                case COLOR_ID:
+                    list.add(orderedOf("type", "ColorId", "id", mArray[i++]));
+                    break;
+                case STROKE_WIDTH:
+                    list.add(orderedOf("type", "StrokeWidth", "width", getVariable(mArray[i++])));
+                    break;
+                case STROKE_MITER:
+                    list.add(orderedOf("type", "StrokeMiter", "miter", getVariable(mArray[i++])));
+                    break;
+                case STROKE_CAP:
+                    list.add(orderedOf("type", "StrokeCap", "cap", cmd >> 16));
+                    break;
+                case STYLE:
+                    list.add(orderedOf("type", "Style", "style", cmd >> 16));
+                    break;
+                case COLOR_FILTER:
+                    list.add(
+                            orderedOf(
+                                    "type",
+                                    "ColorFilter",
+                                    "color",
+                                    colorInt(mArray[i++]),
+                                    "mode",
+                                    blendModeString(cmd >> 16)));
+                    break;
+                case COLOR_FILTER_ID:
+                    list.add(
+                            orderedOf(
+                                    "type",
+                                    "ColorFilterID",
+                                    "id",
+                                    mArray[i++],
+                                    "mode",
+                                    blendModeString(cmd >> 16)));
+                    break;
+                case CLEAR_COLOR_FILTER:
+                    list.add(orderedOf("type", "ClearColorFilter"));
+                    break;
+                case SHADER:
+                    list.add(orderedOf("type", "Shader", "id", mArray[i++]));
+                    break;
+                case ALPHA:
+                    list.add(orderedOf("type", "Alpha", "alpha", getVariable(mArray[i++])));
+                    break;
+                case IMAGE_FILTER_QUALITY:
+                    list.add(orderedOf("type", "ImageFilterQuality", "quality", cmd >> 16));
+                    break;
+                case BLEND_MODE:
+                    list.add(orderedOf("type", "BlendMode", "mode", blendModeString(cmd >> 16)));
+                    break;
+                case FILTER_BITMAP:
+                    list.add(orderedOf("type", "FilterBitmap", "enabled", !(cmd >> 16 == 0)));
+                    break;
+                case STROKE_JOIN:
+                    list.add(orderedOf("type", "StrokeJoin", "strokeJoin", cmd >> 16));
+                    break;
+                case ANTI_ALIAS:
+                    list.add(orderedOf("type", "AntiAlias", "enabled", !(cmd >> 16 == 0)));
+                    break;
+                case GRADIENT:
+                    i = serializeGradient(cmd, mArray, i, list);
+            }
+        }
+        serializer.add("operations", list);
+    }
+
+    private static Map<String, Object> getVariable(int value) {
+        float fValue = Float.intBitsToFloat(value);
+        if (Float.isNaN(fValue)) {
+            return orderedOf("type", "Variable", "id", Utils.idFromNan(fValue));
+        }
+        return orderedOf("type", "Value", "value", fValue);
+    }
+
+    private static int serializeGradient(
+            int cmd, int[] array, int i, List<Map<String, Object>> list) {
+        int ret = i;
+        int gradientType = (cmd >> 16);
+
+        int len = 0xFF & array[ret++]; // maximum 256 colors
+
+        String[] colors = null;
+        if (len > 0) {
+            colors = new String[len];
+            for (int j = 0; j < colors.length; j++) {
+                colors[j] = colorInt(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;
+        }
+
+        int tileMode;
+        int centerX;
+        int centerY;
+
+        switch (gradientType) {
+            case LINEAR_GRADIENT:
+                int startX = array[ret++];
+                int startY = array[ret++];
+                int endX = array[ret++];
+                int endY = array[ret++];
+                tileMode = array[ret++];
+                list.add(
+                        orderedOf(
+                                "type",
+                                "LinearGradient",
+                                "colors",
+                                colors,
+                                "stops",
+                                stops == null ? List.of() : stops,
+                                "startX",
+                                getVariable(startX),
+                                "startY",
+                                getVariable(startY),
+                                "endX",
+                                getVariable(endX),
+                                "endY",
+                                getVariable(endY),
+                                "tileMode",
+                                tileMode));
+                break;
+            case RADIAL_GRADIENT:
+                centerX = array[ret++];
+                centerY = array[ret++];
+                int radius = array[ret++];
+                tileMode = array[ret++];
+                list.add(
+                        orderedOf(
+                                "type",
+                                "LinearGradient",
+                                "colors",
+                                colors,
+                                "stops",
+                                stops == null ? List.of() : stops,
+                                "centerX",
+                                getVariable(centerX),
+                                "centerY",
+                                getVariable(centerY),
+                                "radius",
+                                getVariable(radius),
+                                "tileMode",
+                                tileMode));
+                break;
+            case SWEEP_GRADIENT:
+                centerX = array[ret++];
+                centerY = array[ret++];
+                list.add(
+                        orderedOf(
+                                "type",
+                                "LinearGradient",
+                                "colors",
+                                colors,
+                                "stops",
+                                stops == null ? List.of() : stops,
+                                "centerX",
+                                getVariable(centerX),
+                                "centerY",
+                                getVariable(centerY)));
+        }
+
+        return ret;
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/utilities/easing/FloatAnimation.java b/core/java/com/android/internal/widget/remotecompose/core/operations/utilities/easing/FloatAnimation.java
index 65472c2..cad7605 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/operations/utilities/easing/FloatAnimation.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/utilities/easing/FloatAnimation.java
@@ -18,8 +18,11 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 
+import com.android.internal.widget.remotecompose.core.serialize.MapSerializer;
+import com.android.internal.widget.remotecompose.core.serialize.Serializable;
+
 /** Support Animation of the FloatExpression */
-public class FloatAnimation extends Easing {
+public class FloatAnimation extends Easing implements Serializable {
     float[] mSpec;
     // mSpec[0] = duration
     // int(mSpec[1]) = num_of_param << 16 | type
@@ -391,4 +394,14 @@
     public float getInitialValue() {
         return mInitialValue;
     }
+
+    @Override
+    public void serialize(MapSerializer serializer) {
+        serializer
+                .add("type", "FloatAnimation")
+                .add("initialValue", mInitialValue)
+                .add("targetValue", mInitialValue)
+                .add("duration", mInitialValue)
+                .add("easing", Easing.getString(mEasingCurve.getType()));
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/serialize/MapSerializer.java b/core/java/com/android/internal/widget/remotecompose/core/serialize/MapSerializer.java
index bcdac22f..f9ecf0f 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/serialize/MapSerializer.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/serialize/MapSerializer.java
@@ -17,6 +17,7 @@
 
 import android.annotation.Nullable;
 
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -24,6 +25,24 @@
 public interface MapSerializer {
 
     /**
+     * Add a float expression
+     *
+     * @param key
+     * @param value
+     * @return
+     */
+    MapSerializer addFloatExpressionSrc(String key, float[] value);
+
+    /**
+     * Add an int expression
+     *
+     * @param key The key
+     * @param value The int src
+     * @param mask For determining ID from int
+     */
+    MapSerializer addIntExpressionSrc(String key, int[] value, int mask);
+
+    /**
      * Add metadata to this map for filtering by the data format generator.
      *
      * @param value A set of tags to add
@@ -146,4 +165,19 @@
      * @param value The Enum
      */
     <T extends Enum<T>> MapSerializer add(String key, @Nullable Enum<T> value);
+
+    /**
+     * Similar to Map.of, but create a LinkedHashMap preserving insertion order for predictable
+     * serialization.
+     *
+     * @param keysAndValues a even number of items, repeating String key and Object value.
+     * @return A LinkedHashMap.
+     */
+    static LinkedHashMap<String, Object> orderedOf(Object... keysAndValues) {
+        final LinkedHashMap<String, Object> map = new LinkedHashMap<>();
+        for (int i = 0; i < keysAndValues.length; i += 2) {
+            map.put((String) keysAndValues[i], keysAndValues[i + 1]);
+        }
+        return map;
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/serialize/SerializeTags.java b/core/java/com/android/internal/widget/remotecompose/core/serialize/SerializeTags.java
index 99cac0f..c29dd98 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/serialize/SerializeTags.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/serialize/SerializeTags.java
@@ -22,4 +22,5 @@
     A11Y,
     ACTION,
     DRAW_OPERATION,
+    EXPRESSION,
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/types/BooleanConstant.java b/core/java/com/android/internal/widget/remotecompose/core/types/BooleanConstant.java
index 2c874b1..cb759a6 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/types/BooleanConstant.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/types/BooleanConstant.java
@@ -25,11 +25,15 @@
 import com.android.internal.widget.remotecompose.core.WireBuffer;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentedOperation;
+import com.android.internal.widget.remotecompose.core.serialize.MapSerializer;
+import com.android.internal.widget.remotecompose.core.serialize.Serializable;
 
 import java.util.List;
 
 /** Used to represent a boolean */
-public class BooleanConstant extends Operation {
+public class BooleanConstant extends Operation implements Serializable {
+    private static final String CLASS_NAME = "BooleanConstant";
+
     private static final int OP_CODE = Operations.DATA_BOOLEAN;
     private boolean mValue = false;
     private int mId;
@@ -124,4 +128,9 @@
                 .field(DocumentedOperation.INT, "id", "id of Int")
                 .field(BYTE, "value", "8-bit 0 or 1");
     }
+
+    @Override
+    public void serialize(MapSerializer serializer) {
+        serializer.add("type", CLASS_NAME).add("id", mId).add("value", mValue);
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/types/IntegerConstant.java b/core/java/com/android/internal/widget/remotecompose/core/types/IntegerConstant.java
index 5462d3e..c734f81 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/types/IntegerConstant.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/types/IntegerConstant.java
@@ -25,13 +25,17 @@
 import com.android.internal.widget.remotecompose.core.WireBuffer;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentedOperation;
+import com.android.internal.widget.remotecompose.core.serialize.MapSerializer;
+import com.android.internal.widget.remotecompose.core.serialize.Serializable;
 
 import java.util.List;
 
 /** Represents a single integer typically used for states or named for input into the system */
-public class IntegerConstant extends Operation {
-    private int mValue = 0;
-    private int mId;
+public class IntegerConstant extends Operation implements Serializable {
+    private static final String CLASS_NAME = "IntegerConstant";
+
+    private final int mValue;
+    private final int mId;
 
     IntegerConstant(int id, int value) {
         mId = id;
@@ -116,4 +120,9 @@
                 .field(DocumentedOperation.INT, "id", "id of Int")
                 .field(INT, "value", "32-bit int value");
     }
+
+    @Override
+    public void serialize(MapSerializer serializer) {
+        serializer.add("type", CLASS_NAME).add("id", mId).add("value", mValue);
+    }
 }
diff --git a/core/java/com/android/internal/widget/remotecompose/core/types/LongConstant.java b/core/java/com/android/internal/widget/remotecompose/core/types/LongConstant.java
index 1a3cdb1..50509f3 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/types/LongConstant.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/types/LongConstant.java
@@ -25,14 +25,18 @@
 import com.android.internal.widget.remotecompose.core.WireBuffer;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentationBuilder;
 import com.android.internal.widget.remotecompose.core.documentation.DocumentedOperation;
+import com.android.internal.widget.remotecompose.core.serialize.MapSerializer;
+import com.android.internal.widget.remotecompose.core.serialize.Serializable;
 
 import java.util.List;
 
 /** Used to represent a long */
-public class LongConstant extends Operation {
+public class LongConstant extends Operation implements Serializable {
+    private static final String CLASS_NAME = "LongConstant";
+
     private static final int OP_CODE = Operations.DATA_LONG;
-    private long mValue;
-    private int mId;
+    private final long mValue;
+    private final int mId;
 
     public LongConstant(int id, long value) {
         mId = id;
@@ -107,4 +111,9 @@
                 .field(DocumentedOperation.INT, "id", "id of Int")
                 .field(LONG, "value", "The long Value");
     }
+
+    @Override
+    public void serialize(MapSerializer serializer) {
+        serializer.add("type", CLASS_NAME).add("id", mId).add("value", mValue);
+    }
 }
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 77f4b6a..1d1e579 100644
--- a/core/java/com/android/internal/widget/remotecompose/player/RemoteComposePlayer.java
+++ b/core/java/com/android/internal/widget/remotecompose/player/RemoteComposePlayer.java
@@ -29,7 +29,6 @@
 import android.util.AttributeSet;
 import android.util.Log;
 import android.util.TypedValue;
-import android.view.HapticFeedbackConstants;
 import android.view.ViewGroup;
 import android.widget.FrameLayout;
 import android.widget.HorizontalScrollView;
@@ -596,29 +595,34 @@
         }
     }
 
-    private static int[] sHapticTable = {
-        HapticFeedbackConstants.NO_HAPTICS,
-        HapticFeedbackConstants.LONG_PRESS,
-        HapticFeedbackConstants.VIRTUAL_KEY,
-        HapticFeedbackConstants.KEYBOARD_TAP,
-        HapticFeedbackConstants.CLOCK_TICK,
-        HapticFeedbackConstants.CONTEXT_CLICK,
-        HapticFeedbackConstants.KEYBOARD_PRESS,
-        HapticFeedbackConstants.KEYBOARD_RELEASE,
-        HapticFeedbackConstants.VIRTUAL_KEY_RELEASE,
-        HapticFeedbackConstants.TEXT_HANDLE_MOVE,
-        HapticFeedbackConstants.GESTURE_START,
-        HapticFeedbackConstants.GESTURE_END,
-        HapticFeedbackConstants.CONFIRM,
-        HapticFeedbackConstants.REJECT,
-        HapticFeedbackConstants.TOGGLE_ON,
-        HapticFeedbackConstants.TOGGLE_OFF,
-        HapticFeedbackConstants.GESTURE_THRESHOLD_ACTIVATE,
-        HapticFeedbackConstants.GESTURE_THRESHOLD_DEACTIVATE,
-        HapticFeedbackConstants.DRAG_START,
-        HapticFeedbackConstants.SEGMENT_TICK,
-        HapticFeedbackConstants.SEGMENT_FREQUENT_TICK,
-    };
+    private static final int[] sHapticTable;
+
+    static {
+        sHapticTable =
+                new int[] {
+                    android.view.HapticFeedbackConstants.NO_HAPTICS,
+                    android.view.HapticFeedbackConstants.LONG_PRESS,
+                    android.view.HapticFeedbackConstants.VIRTUAL_KEY,
+                    android.view.HapticFeedbackConstants.KEYBOARD_TAP,
+                    android.view.HapticFeedbackConstants.CLOCK_TICK,
+                    android.view.HapticFeedbackConstants.CONTEXT_CLICK,
+                    android.view.HapticFeedbackConstants.KEYBOARD_PRESS,
+                    android.view.HapticFeedbackConstants.KEYBOARD_RELEASE,
+                    android.view.HapticFeedbackConstants.VIRTUAL_KEY_RELEASE,
+                    android.view.HapticFeedbackConstants.TEXT_HANDLE_MOVE,
+                    android.view.HapticFeedbackConstants.GESTURE_START,
+                    android.view.HapticFeedbackConstants.GESTURE_END,
+                    android.view.HapticFeedbackConstants.CONFIRM,
+                    android.view.HapticFeedbackConstants.REJECT,
+                    android.view.HapticFeedbackConstants.TOGGLE_ON,
+                    android.view.HapticFeedbackConstants.TOGGLE_OFF,
+                    android.view.HapticFeedbackConstants.GESTURE_THRESHOLD_ACTIVATE,
+                    android.view.HapticFeedbackConstants.GESTURE_THRESHOLD_DEACTIVATE,
+                    android.view.HapticFeedbackConstants.DRAG_START,
+                    android.view.HapticFeedbackConstants.SEGMENT_TICK,
+                    android.view.HapticFeedbackConstants.SEGMENT_FREQUENT_TICK,
+                };
+    }
 
     private void provideHapticFeedback(int type) {
         performHapticFeedback(sHapticTable[type % sHapticTable.length]);
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 6b1a30a..ac4a294 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
@@ -246,6 +246,12 @@
     }
 
     @Override
+    public void replacePaint(PaintBundle paintBundle) {
+        mPaint.reset();
+        applyPaint(paintBundle);
+    }
+
+    @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);
diff --git a/core/java/com/android/internal/widget/remotecompose/player/platform/RemoteComposeCanvas.java b/core/java/com/android/internal/widget/remotecompose/player/platform/RemoteComposeCanvas.java
index f76794f..4d2dd05 100644
--- a/core/java/com/android/internal/widget/remotecompose/player/platform/RemoteComposeCanvas.java
+++ b/core/java/com/android/internal/widget/remotecompose/player/platform/RemoteComposeCanvas.java
@@ -31,6 +31,7 @@
 
 import com.android.internal.widget.remotecompose.core.CoreDocument;
 import com.android.internal.widget.remotecompose.core.RemoteContext;
+import com.android.internal.widget.remotecompose.core.operations.Header;
 import com.android.internal.widget.remotecompose.core.operations.RootContentBehavior;
 import com.android.internal.widget.remotecompose.core.operations.Theme;
 import com.android.internal.widget.remotecompose.player.RemoteComposeDocument;
@@ -105,10 +106,16 @@
         mARContext.setDensity(mDensity);
         mARContext.setUseChoreographer(true);
         setContentDescription(mDocument.getDocument().getContentDescription());
+
         updateClickAreas();
         requestLayout();
         mARContext.loadFloat(RemoteContext.ID_TOUCH_EVENT_TIME, -Float.MAX_VALUE);
         invalidate();
+        Integer fps = (Integer) mDocument.getDocument().getProperty(Header.DOC_DESIRED_FPS);
+        if (fps != null && fps > 0) {
+            mMaxFrameRate = fps;
+            mMaxFrameDelay = (long) (1000 / mMaxFrameRate);
+        }
     }
 
     @Override
diff --git a/core/jni/Android.bp b/core/jni/Android.bp
index 447822f..06702e2 100644
--- a/core/jni/Android.bp
+++ b/core/jni/Android.bp
@@ -134,6 +134,10 @@
                 "android_app_ActivityThread.cpp",
                 "android_app_NativeActivity.cpp",
                 "android_app_admin_SecurityLog.cpp",
+                "android_media_ImageReader.cpp",
+                "android_media_ImageWriter.cpp",
+                "android_media_PublicFormatUtils.cpp",
+                "android_media_Utils.cpp",
                 "android_opengl_EGL14.cpp",
                 "android_opengl_EGL15.cpp",
                 "android_opengl_EGLExt.cpp",
@@ -531,3 +535,35 @@
         "vintf",
     ],
 }
+
+cc_library_shared {
+    name: "libmedia_jni_utils",
+    srcs: [
+        ":libgui_frame_event_aidl",
+        "android_media_Utils.cpp",
+    ],
+
+    header_libs: [
+        "libgui_headers",
+    ],
+
+    shared_libs: [
+        "liblog",
+        "libui",
+        "libutils",
+    ],
+
+    include_dirs: [
+        "system/media/camera/include",
+    ],
+
+    export_include_dirs: ["."],
+
+    cflags: [
+        "-Wall",
+        "-Werror",
+        "-Wno-error=deprecated-declarations",
+        "-Wunused",
+        "-Wunreachable-code",
+    ],
+}
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 5c0b720..b2b8263 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -102,7 +102,10 @@
 extern int register_android_media_AudioProductStrategies(JNIEnv *env);
 extern int register_android_media_AudioVolumeGroups(JNIEnv *env);
 extern int register_android_media_AudioVolumeGroupChangeHandler(JNIEnv *env);
+extern int register_android_media_ImageReader(JNIEnv *env);
+extern int register_android_media_ImageWriter(JNIEnv *env);
 extern int register_android_media_MicrophoneInfo(JNIEnv *env);
+extern int register_android_media_PublicFormatUtils(JNIEnv *env);
 extern int register_android_media_ToneGenerator(JNIEnv *env);
 extern int register_android_media_audio_common_AidlConversion(JNIEnv* env);
 extern int register_android_media_midi(JNIEnv *env);
@@ -1658,8 +1661,11 @@
         REG_JNI(register_android_media_AudioProductStrategies),
         REG_JNI(register_android_media_AudioVolumeGroups),
         REG_JNI(register_android_media_AudioVolumeGroupChangeHandler),
+        REG_JNI(register_android_media_ImageReader),
+        REG_JNI(register_android_media_ImageWriter),
         REG_JNI(register_android_media_MediaMetrics),
         REG_JNI(register_android_media_MicrophoneInfo),
+        REG_JNI(register_android_media_PublicFormatUtils),
         REG_JNI(register_android_media_RemoteDisplay),
         REG_JNI(register_android_media_ToneGenerator),
         REG_JNI(register_android_media_audio_common_AidlConversion),
diff --git a/core/jni/android_content_res_ApkAssets.cpp b/core/jni/android_content_res_ApkAssets.cpp
index 1e7bfe3..66c65d0 100644
--- a/core/jni/android_content_res_ApkAssets.cpp
+++ b/core/jni/android_content_res_ApkAssets.cpp
@@ -111,9 +111,8 @@
 class LoaderAssetsProvider : public AssetsProvider {
  public:
   static std::unique_ptr<AssetsProvider> Create(JNIEnv* env, jobject assets_provider) {
-    return (!assets_provider) ? EmptyAssetsProvider::Create()
-                              : std::unique_ptr<AssetsProvider>(new LoaderAssetsProvider(
-                                    env, assets_provider));
+      return std::unique_ptr<AssetsProvider>{
+              assets_provider ? new LoaderAssetsProvider(env, assets_provider) : nullptr};
   }
 
   bool ForEachFile(const std::string& /* root_path */,
@@ -129,8 +128,8 @@
     return debug_name_;
   }
 
-  bool IsUpToDate() const override {
-    return true;
+  UpToDate IsUpToDate() const override {
+      return UpToDate::Always;
   }
 
   ~LoaderAssetsProvider() override {
@@ -212,7 +211,7 @@
     auto string_result = static_cast<jstring>(env->CallObjectMethod(
         assets_provider_, gAssetsProviderOffsets.toString));
     ScopedUtfChars str(env, string_result);
-    debug_name_ = std::string(str.c_str(), str.size());
+    debug_name_ = std::string(str.c_str());
   }
 
   // The global reference to the AssetsProvider
@@ -233,9 +232,9 @@
   AssetManager2::ApkAssetsPtr apk_assets;
   switch (format) {
     case FORMAT_APK: {
-        auto assets = MultiAssetsProvider::Create(std::move(loader_assets),
-                                                  ZipAssetsProvider::Create(path.c_str(),
-                                                                            property_flags));
+        auto assets = AssetsProvider::CreateWithOverride(ZipAssetsProvider::Create(path.c_str(),
+                                                                                   property_flags),
+                                                         std::move(loader_assets));
         apk_assets = ApkAssets::Load(std::move(assets), property_flags);
         break;
     }
@@ -243,15 +242,17 @@
       apk_assets = ApkAssets::LoadOverlay(path.c_str(), property_flags);
       break;
     case FORMAT_ARSC:
-      apk_assets = ApkAssets::LoadTable(AssetsProvider::CreateAssetFromFile(path.c_str()),
-                                        std::move(loader_assets),
-                                        property_flags);
-      break;
+        apk_assets =
+                ApkAssets::LoadTable(AssetsProvider::CreateAssetFromFile(path.c_str()),
+                                     AssetsProvider::CreateFromNullable(std::move(loader_assets)),
+                                     property_flags);
+        break;
     case FORMAT_DIRECTORY: {
-      auto assets = MultiAssetsProvider::Create(std::move(loader_assets),
-                                                DirectoryAssetsProvider::Create(path.c_str()));
-      apk_assets = ApkAssets::Load(std::move(assets), property_flags);
-      break;
+        auto assets =
+                AssetsProvider::CreateWithOverride(DirectoryAssetsProvider::Create(path.c_str()),
+                                                   std::move(loader_assets));
+        apk_assets = ApkAssets::Load(std::move(assets), property_flags);
+        break;
     }
     default:
       const std::string error_msg = base::StringPrintf("Unsupported format type %d", format);
@@ -308,18 +309,21 @@
   switch (format) {
     case FORMAT_APK: {
         auto assets =
-                MultiAssetsProvider::Create(std::move(loader_assets),
-                                            ZipAssetsProvider::Create(std::move(dup_fd),
-                                                                      friendly_name_utf8.c_str(),
-                                                                      property_flags));
+                AssetsProvider::CreateWithOverride(ZipAssetsProvider::Create(std::move(dup_fd),
+                                                                             friendly_name_utf8
+                                                                                     .c_str(),
+                                                                             property_flags),
+                                                   std::move(loader_assets));
         apk_assets = ApkAssets::Load(std::move(assets), property_flags);
         break;
     }
     case FORMAT_ARSC:
-      apk_assets = ApkAssets::LoadTable(
-          AssetsProvider::CreateAssetFromFd(std::move(dup_fd), nullptr /* path */),
-          std::move(loader_assets), property_flags);
-      break;
+        apk_assets =
+                ApkAssets::LoadTable(AssetsProvider::CreateAssetFromFd(std::move(dup_fd),
+                                                                       nullptr /* path */),
+                                     AssetsProvider::CreateFromNullable(std::move(loader_assets)),
+                                     property_flags);
+        break;
     default:
       const std::string error_msg = base::StringPrintf("Unsupported format type %d", format);
       jniThrowException(env, "java/lang/IllegalArgumentException", error_msg.c_str());
@@ -375,23 +379,28 @@
   switch (format) {
     case FORMAT_APK: {
         auto assets =
-                MultiAssetsProvider::Create(std::move(loader_assets),
-                                            ZipAssetsProvider::Create(std::move(dup_fd),
-                                                                      friendly_name_utf8.c_str(),
-                                                                      property_flags,
-                                                                      static_cast<off64_t>(offset),
-                                                                      static_cast<off64_t>(
-                                                                              length)));
+                AssetsProvider::CreateWithOverride(ZipAssetsProvider::Create(std::move(dup_fd),
+                                                                             friendly_name_utf8
+                                                                                     .c_str(),
+                                                                             property_flags,
+                                                                             static_cast<off64_t>(
+                                                                                     offset),
+                                                                             static_cast<off64_t>(
+                                                                                     length)),
+                                                   std::move(loader_assets));
         apk_assets = ApkAssets::Load(std::move(assets), property_flags);
         break;
     }
     case FORMAT_ARSC:
-      apk_assets = ApkAssets::LoadTable(
-          AssetsProvider::CreateAssetFromFd(std::move(dup_fd), nullptr /* path */,
-                                            static_cast<off64_t>(offset),
-                                            static_cast<off64_t>(length)),
-          std::move(loader_assets), property_flags);
-      break;
+        apk_assets =
+                ApkAssets::LoadTable(AssetsProvider::CreateAssetFromFd(std::move(dup_fd),
+                                                                       nullptr /* path */,
+                                                                       static_cast<off64_t>(offset),
+                                                                       static_cast<off64_t>(
+                                                                               length)),
+                                     AssetsProvider::CreateFromNullable(std::move(loader_assets)),
+                                     property_flags);
+        break;
     default:
       const std::string error_msg = base::StringPrintf("Unsupported format type %d", format);
       jniThrowException(env, "java/lang/IllegalArgumentException", error_msg.c_str());
@@ -408,13 +417,16 @@
 }
 
 static jlong NativeLoadEmpty(JNIEnv* env, jclass /*clazz*/, jint flags, jobject assets_provider) {
-  auto apk_assets = ApkAssets::Load(LoaderAssetsProvider::Create(env, assets_provider), flags);
-  if (apk_assets == nullptr) {
-    const std::string error_msg =
-        base::StringPrintf("Failed to load empty assets with provider %p", (void*)assets_provider);
-    jniThrowException(env, "java/io/IOException", error_msg.c_str());
-    return 0;
-  }
+    auto apk_assets = ApkAssets::Load(AssetsProvider::CreateFromNullable(
+                                              LoaderAssetsProvider::Create(env, assets_provider)),
+                                      flags);
+    if (apk_assets == nullptr) {
+        const std::string error_msg =
+                base::StringPrintf("Failed to load empty assets with provider %p",
+                                   (void*)assets_provider);
+        jniThrowException(env, "java/io/IOException", error_msg.c_str());
+        return 0;
+    }
   return CreateGuardedApkAssets(std::move(apk_assets));
 }
 
@@ -443,10 +455,10 @@
     return reinterpret_cast<jlong>(apk_assets->GetLoadedArsc()->GetStringPool());
 }
 
-static jboolean NativeIsUpToDate(CRITICAL_JNI_PARAMS_COMMA jlong ptr) {
+static jint NativeIsUpToDate(CRITICAL_JNI_PARAMS_COMMA jlong ptr) {
     auto scoped_apk_assets = ScopedLock(ApkAssetsFromLong(ptr));
     auto apk_assets = scoped_apk_assets->get();
-    return apk_assets->IsUpToDate() ? JNI_TRUE : JNI_FALSE;
+    return (jint)apk_assets->IsUpToDate();
 }
 
 static jlong NativeOpenXml(JNIEnv* env, jclass /*clazz*/, jlong ptr, jstring file_name) {
@@ -558,7 +570,7 @@
         {"nativeGetDebugName", "(J)Ljava/lang/String;", (void*)NativeGetDebugName},
         {"nativeGetStringBlock", "(J)J", (void*)NativeGetStringBlock},
         // @CriticalNative
-        {"nativeIsUpToDate", "(J)Z", (void*)NativeIsUpToDate},
+        {"nativeIsUpToDate", "(J)I", (void*)NativeIsUpToDate},
         {"nativeOpenXml", "(JLjava/lang/String;)J", (void*)NativeOpenXml},
         {"nativeGetOverlayableInfo", "(JLjava/lang/String;)Landroid/content/om/OverlayableInfo;",
          (void*)NativeGetOverlayableInfo},
diff --git a/core/jni/android_media_AudioRecord.cpp b/core/jni/android_media_AudioRecord.cpp
index 102edc9..22298b3 100644
--- a/core/jni/android_media_AudioRecord.cpp
+++ b/core/jni/android_media_AudioRecord.cpp
@@ -598,7 +598,7 @@
     }
     jint *values = env->GetIntArrayElements(result, 0);
     for (unsigned int i = 0; i < deviceIds.size(); i++) {
-        values[i++] = static_cast<jint>(deviceIds[i]);
+        values[i] = static_cast<jint>(deviceIds[i]);
     }
     env->ReleaseIntArrayElements(result, values, 0);
     return result;
diff --git a/core/jni/android_media_AudioTrack.cpp b/core/jni/android_media_AudioTrack.cpp
index 3fc1a02..3cf5d5f 100644
--- a/core/jni/android_media_AudioTrack.cpp
+++ b/core/jni/android_media_AudioTrack.cpp
@@ -1204,7 +1204,7 @@
     }
     jint *values = env->GetIntArrayElements(result, 0);
     for (unsigned int i = 0; i < deviceIds.size(); i++) {
-        values[i++] = static_cast<jint>(deviceIds[i]);
+        values[i] = static_cast<jint>(deviceIds[i]);
     }
     env->ReleaseIntArrayElements(result, values, 0);
     return result;
diff --git a/media/jni/android_media_ImageReader.cpp b/core/jni/android_media_ImageReader.cpp
similarity index 99%
rename from media/jni/android_media_ImageReader.cpp
rename to core/jni/android_media_ImageReader.cpp
index effa92c..20b9c57 100644
--- a/media/jni/android_media_ImageReader.cpp
+++ b/core/jni/android_media_ImageReader.cpp
@@ -13,6 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code
 
 //#define LOG_NDEBUG 0
 #define LOG_TAG "ImageReader_JNI"
diff --git a/media/jni/android_media_ImageWriter.cpp b/core/jni/android_media_ImageWriter.cpp
similarity index 99%
rename from media/jni/android_media_ImageWriter.cpp
rename to core/jni/android_media_ImageWriter.cpp
index 93deb51..1357dd8 100644
--- a/media/jni/android_media_ImageWriter.cpp
+++ b/core/jni/android_media_ImageWriter.cpp
@@ -13,6 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code
 
 //#define LOG_NDEBUG 0
 #define LOG_TAG "ImageWriter_JNI"
diff --git a/media/jni/android_media_PublicFormatUtils.cpp b/core/jni/android_media_PublicFormatUtils.cpp
similarity index 100%
rename from media/jni/android_media_PublicFormatUtils.cpp
rename to core/jni/android_media_PublicFormatUtils.cpp
diff --git a/media/jni/android_media_Utils.cpp b/core/jni/android_media_Utils.cpp
similarity index 100%
rename from media/jni/android_media_Utils.cpp
rename to core/jni/android_media_Utils.cpp
diff --git a/media/jni/android_media_Utils.h b/core/jni/android_media_Utils.h
similarity index 100%
rename from media/jni/android_media_Utils.h
rename to core/jni/android_media_Utils.h
diff --git a/core/proto/android/nfc/OWNERS b/core/proto/android/nfc/OWNERS
index ca16721..36823ae 100644
--- a/core/proto/android/nfc/OWNERS
+++ b/core/proto/android/nfc/OWNERS
@@ -1 +1 @@
-include platform/packages/apps/Nfc:/OWNERS
\ No newline at end of file
+include platform/packages/modules/Nfc:/OWNERS
\ No newline at end of file
diff --git a/core/res/Android.bp b/core/res/Android.bp
index be4fb8b..1199d77 100644
--- a/core/res/Android.bp
+++ b/core/res/Android.bp
@@ -174,6 +174,7 @@
         "android.media.tv.flags-aconfig",
         "android.security.flags-aconfig",
         "device_policy_aconfig_flags",
+        "android.xr.flags-aconfig",
         "com.android.hardware.input.input-aconfig",
         "aconfig_trade_in_mode_flags",
         "art-aconfig-flags",
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index c9f4cdc..78526ad 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -5230,6 +5230,182 @@
         android:protectionLevel="signature|privileged" />
 
     <!-- ==================================== -->
+    <!-- Permissions for XR perception data   -->
+    <!-- ==================================== -->
+    <eat-comment />
+
+    <!-- Used for permissions that are associated with accessing XR
+         tracked information about the person using the device and the
+         environment around them.
+
+         @FlaggedApi(android.xr.Flags.FLAG_XR_MANIFEST_ENTRIES) -->
+    <permission-group android:name="android.permission-group.XR_TRACKING"
+                      android:label="@string/permgrouplab_xr_tracking"
+                      android:description="@string/permgroupdesc_xr_tracking"
+                      android:priority="100"
+                      android:featureFlag="android.xr.xr_manifest_entries" />
+
+    <!-- Allows an application to get approximate eye gaze.
+
+         <p>Protection level: dangerous
+
+         @FlaggedApi(android.xr.Flags.FLAG_XR_MANIFEST_ENTRIES) -->
+    <permission android:name="android.permission.EYE_TRACKING_COARSE"
+                android:protectionLevel="dangerous"
+                android:permissionGroup="android.permission-group.UNDEFINED"
+                android:label="@string/permlab_eye_tracking_coarse"
+                android:description="@string/permdesc_eye_tracking_coarse"
+                android:featureFlag="android.xr.xr_manifest_entries" />
+
+    <!-- Allows an application to get face tracking data.
+
+         <p>Protection level: dangerous
+
+         @FlaggedApi(android.xr.Flags.FLAG_XR_MANIFEST_ENTRIES) -->
+    <permission android:name="android.permission.FACE_TRACKING"
+                android:protectionLevel="dangerous"
+                android:permissionGroup="android.permission-group.UNDEFINED"
+                android:label="@string/permlab_face_tracking"
+                android:description="@string/permdesc_face_tracking"
+                android:featureFlag="android.xr.xr_manifest_entries" />
+
+    <!-- Allows an application to get hand tracking data.
+
+         <p>Protection level: dangerous
+
+         @FlaggedApi(android.xr.Flags.FLAG_XR_MANIFEST_ENTRIES) -->
+    <permission android:name="android.permission.HAND_TRACKING"
+                android:protectionLevel="dangerous"
+                android:permissionGroup="android.permission-group.UNDEFINED"
+                android:label="@string/permlab_hand_tracking"
+                android:description="@string/permdesc_hand_tracking"
+                android:featureFlag="android.xr.xr_manifest_entries" />
+
+    <!-- Allows an application to get data derived by sensing the
+         user's environment.
+
+         <p>Protection level: dangerous
+
+         @FlaggedApi(android.xr.Flags.FLAG_XR_MANIFEST_ENTRIES) -->
+    <permission android:name="android.permission.SCENE_UNDERSTANDING_COARSE"
+                android:protectionLevel="dangerous"
+                android:permissionGroup="android.permission-group.UNDEFINED"
+                android:description="@string/permdesc_scene_understanding_coarse"
+                android:label="@string/permlab_scene_understanding_coarse"
+                android:featureFlag="android.xr.xr_manifest_entries" />
+
+    <!-- Used for permissions that are associated with accessing
+         particularly sensitive XR tracking data.
+
+         @FlaggedApi(android.xr.Flags.FLAG_XR_MANIFEST_ENTRIES) -->
+    <permission-group android:name="android.permission-group.XR_TRACKING_SENSITIVE"
+                      android:label="@string/permgrouplab_xr_tracking_sensitive"
+                      android:description="@string/permgroupdesc_xr_tracking_sensitive"
+                      android:priority="100"
+                      android:featureFlag="android.xr.xr_manifest_entries" />
+
+    <!-- Allows an application to get precise eye gaze data.
+
+         <p>Protection level: dangerous
+
+         @FlaggedApi(android.xr.Flags.FLAG_XR_MANIFEST_ENTRIES) -->
+    <permission android:name="android.permission.EYE_TRACKING_FINE"
+                android:protectionLevel="dangerous"
+                android:permissionGroup="android.permission-group.UNDEFINED"
+                android:label="@string/permlab_eye_tracking_fine"
+                android:description="@string/permdesc_eye_tracking_fine"
+                android:featureFlag="android.xr.xr_manifest_entries" />
+
+    <!-- Allows an application to get head tracking data.  Unmanaged
+         activities (OpenXR activities with the manifest property
+         "android.window.PROPERTY_XR_ACTIVITY_START_MODE" set to
+         "XR_ACTIVITY_START_MODE_FULL_SPACE_UNMANAGED") do not require
+         this permission to get head tracking data.
+
+         {@see https://developer.android.com/develop/xr/get-started#property_activity_xr_start_mode_property}
+
+         <p>Protection level: dangerous
+
+         @FlaggedApi(android.xr.Flags.FLAG_XR_MANIFEST_ENTRIES) -->
+    <permission android:name="android.permission.HEAD_TRACKING"
+                android:protectionLevel="dangerous"
+                android:permissionGroup="android.permission-group.UNDEFINED"
+                android:label="@string/permlab_head_tracking"
+                android:description="@string/permdesc_head_tracking"
+                android:featureFlag="android.xr.xr_manifest_entries" />
+
+    <!-- Allows an application to get highly precise data derived by sensing the
+         user's environment, such as a depth map.
+
+         <p>Protection level: dangerous
+
+         @FlaggedApi(android.xr.Flags.FLAG_XR_MANIFEST_ENTRIES) -->
+    <permission android:name="android.permission.SCENE_UNDERSTANDING_FINE"
+                android:protectionLevel="dangerous"
+                android:permissionGroup="android.permission-group.UNDEFINED"
+                android:description="@string/permdesc_scene_understanding_fine"
+                android:label="@string/permlab_scene_understanding_fine"
+                android:featureFlag="android.xr.xr_manifest_entries" />
+
+    <!-- Allows an application to trigger Eye Calibration, which
+         calibrates for IPD (inter-pupillary distance) adjustment and
+         eye tracking.
+
+         <p>Protection level: signature|privileged
+
+         @SystemApi
+         @FlaggedApi(android.xr.Flags.FLAG_XR_MANIFEST_ENTRIES)
+         @hide -->
+    <permission android:name="android.permission.EYE_CALIBRATION"
+                android:protectionLevel="signature|privileged"
+                android:featureFlag="android.xr.xr_manifest_entries" />
+
+    <!-- Allows an application to trigger Face Tracking Calibration.
+
+         <p>Protection level: signature|privileged
+
+         @SystemApi
+         @FlaggedApi(android.xr.Flags.FLAG_XR_MANIFEST_ENTRIES)
+         @hide -->
+    <permission android:name="android.permission.FACE_TRACKING_CALIBRATION"
+                android:protectionLevel="signature|privileged"
+                android:featureFlag="android.xr.xr_manifest_entries" />
+
+    <!-- Allows an application to import an anchor created and
+         exported by another application.
+
+         <p>Protection level: signature|privileged
+
+         @SystemApi
+         @FlaggedApi(android.xr.Flags.FLAG_XR_MANIFEST_ENTRIES)
+         @hide -->
+    <permission android:name="android.permission.IMPORT_XR_ANCHOR"
+                android:protectionLevel="signature|privileged"
+                android:featureFlag="android.xr.xr_manifest_entries" />
+
+    <!-- Allows an application to access XR tracking data while in the
+         background. Without this permission, XR tracking data such as
+         head tracking, hand tracking, eye tracking, or face tracking
+         is only available to an activity it is in the
+         foreground. With this permission, such data is also available
+         to services and to activities that are in the background.
+
+         <p>This permission must be granted in addition to the
+         corresponding permission such as {@link #HEAD_TRACKING} or
+         {@link #FACE_TRACKING} for the data being accessed.
+
+         <p>Protection level: normal|appop
+
+         @SystemApi
+         @FlaggedApi(android.xr.Flags.FLAG_XR_MANIFEST_ENTRIES)
+         @hide -->
+    <permission android:name="android.permission.XR_TRACKING_IN_BACKGROUND"
+                android:protectionLevel="normal|appop"
+                android:description="@string/permdesc_xr_tracking_in_background"
+                android:label="@string/permlab_xr_tracking_in_background"
+                android:featureFlag="android.xr.xr_manifest_entries" />
+
+    <!-- ==================================== -->
     <!-- Private permissions                  -->
     <!-- ==================================== -->
     <eat-comment />
@@ -7688,12 +7864,12 @@
     <permission android:name="android.permission.ACCESS_SMARTSPACE"
         android:protectionLevel="signature|privileged|development" />
 
-    <!-- @SystemApi Allows an application to start a contextual search.
-         @FlaggedApi("android.app.contextualsearch.flags.enable_service")
-         @hide  <p>Not for use by third-party applications.</p> -->
+    <!-- @SystemApi Allows a system application to start a contextual search.
+     Other applications can start a contextual search only if they have a
+     foreground activity.
+     @hide  <p>Not for use by third-party applications.</p> -->
     <permission android:name="android.permission.ACCESS_CONTEXTUAL_SEARCH"
-        android:protectionLevel="signature|privileged"
-        android:featureFlag="android.app.contextualsearch.flags.enable_service"/>
+        android:protectionLevel="signature|privileged" />
 
     <!-- @SystemApi Allows an application to manage the wallpaper effects
      generation service.
@@ -9385,6 +9561,10 @@
             android:permission="android.permission.BIND_JOB_SERVICE">
         </service>
 
+        <service android:name="com.android.server.security.UpdateCertificateRevocationStatusJobService"
+            android:permission="android.permission.BIND_JOB_SERVICE">
+        </service>
+
         <service android:name="com.android.server.pm.PackageManagerShellCommandDataLoader"
             android:exported="false">
             <intent-filter>
diff --git a/core/res/res/drawable/ic_notification_summarization.xml b/core/res/res/drawable/ic_notification_summarization.xml
index de905fa..d476872 100644
--- a/core/res/res/drawable/ic_notification_summarization.xml
+++ b/core/res/res/drawable/ic_notification_summarization.xml
@@ -19,5 +19,6 @@
     android:tint="?android:attr/colorControlNormal"
     android:viewportHeight="960"
     android:viewportWidth="960">
-    <path android:fillColor="#ffffff" android:pathData="M354,673L480,597L606,674L573,530L684,434L538,421L480,285L422,420L276,433L387,530L354,673ZM233,840L298,559L80,370L368,345L480,80L592,345L880,370L662,559L727,840L480,691L233,840ZM480,490L480,490L480,490L480,490L480,490L480,490L480,490L480,490L480,490L480,490Z"/>
+    <path android:fillColor="#ffffff"
+          android:pathData="M120,840L120,760L600,760L600,840L120,840ZM120,640L120,560L840,560L840,640L120,640ZM120,440L120,360L560,360L560,440L120,440ZM700,480Q700,388 636,324Q572,260 480,260Q572,260 636,196Q700,132 700,40Q700,132 764,196Q828,260 920,260Q828,260 764,324Q700,388 700,480Z"/>
 </vector>
\ No newline at end of file
diff --git a/core/res/res/layout/notification_2025_template_header.xml b/core/res/res/layout/notification_2025_template_header.xml
index 72b3798..5aae678 100644
--- a/core/res/res/layout/notification_2025_template_header.xml
+++ b/core/res/res/layout/notification_2025_template_header.xml
@@ -59,7 +59,7 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_alignParentStart="true"
-        android:layout_toStartOf="@id/expand_button"
+        android:layout_toStartOf="@id/expand_button_container"
         android:layout_alignWithParentIfMissing="true"
         android:layout_marginVertical="@dimen/notification_2025_margin"
         android:clipChildren="false"
@@ -81,12 +81,30 @@
         android:focusable="false"
         />
 
-    <include layout="@layout/notification_2025_expand_button"
+
+    <LinearLayout
+        android:id="@+id/expand_button_container"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_gravity="top|end"
-        android:layout_alignParentEnd="true" />
+        android:layout_alignParentEnd="true"
+        android:orientation="vertical"
+        >
+        <FrameLayout
+            android:id="@+id/expand_button_spacer"
+            android:layout_width="@dimen/notification_2025_expand_button_pill_width"
+            android:layout_height="@dimen/notification_2025_expand_button_pill_height"
+            android:layout_centerVertical="true"
+            android:layout_alignParentEnd="true"
+            android:layout_margin="@dimen/notification_2025_margin"
+            android:visibility="gone" />
 
+        <include layout="@layout/notification_2025_expand_button"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="top|end"
+            android:layout_alignParentEnd="true" />
+
+    </LinearLayout>
     <include layout="@layout/notification_close_button"
         android:id="@+id/close_button"
         android:layout_width="@dimen/notification_close_button_size"
diff --git a/core/res/res/layout/notification_template_header.xml b/core/res/res/layout/notification_template_header.xml
index 5795936..b7fd737 100644
--- a/core/res/res/layout/notification_template_header.xml
+++ b/core/res/res/layout/notification_template_header.xml
@@ -62,7 +62,7 @@
         android:layout_height="match_parent"
         android:layout_alignParentStart="true"
         android:layout_centerVertical="true"
-        android:layout_toStartOf="@id/expand_button"
+        android:layout_toStartOf="@id/expand_button_container"
         android:layout_alignWithParentIfMissing="true"
         android:clipChildren="false"
         android:gravity="center_vertical"
@@ -83,12 +83,28 @@
         android:focusable="false"
         />
 
-    <include layout="@layout/notification_expand_button"
+    <LinearLayout
+        android:id="@+id/expand_button_container"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_centerVertical="true"
-        android:layout_alignParentEnd="true" />
+        android:layout_alignParentEnd="true"
+        android:orientation="vertical"
+        >
+        <FrameLayout
+            android:id="@+id/expand_button_spacer"
+            android:layout_width="@dimen/notification_expand_button_pill_height"
+            android:layout_height="@dimen/notification_header_height"
+            android:layout_centerVertical="true"
+            android:layout_alignParentEnd="true"
+            android:layout_marginHorizontal="16dp"
+            android:visibility="gone" />
 
+        <include layout="@layout/notification_expand_button"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerVertical="true"
+            android:layout_alignParentEnd="true" />
+    </LinearLayout>
     <include layout="@layout/notification_close_button"
         android:id="@+id/close_button"
         android:layout_width="@dimen/notification_close_button_size"
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 368cf65..5da0924 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -2088,12 +2088,9 @@
     <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">"Appinligting"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Direktedelingteikens"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Appvoorstelle"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Applys"</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>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"D-paneel links"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"D-paneel regs"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"D-paneel middel"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Outoklik-tipe instellingspaneel"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Linksklik"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Onderbreek"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Posisie"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> is in die BEPERK-groep geplaas"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"het \'n prent gestuur"</string>
@@ -2269,7 +2270,7 @@
     <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Deur jou IT-admin geblokkeer"</string>
     <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Hierdie inhoud kan nie met werkprogramme gedeel word nie"</string>
     <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Hierdie inhoud kan nie met werkprogramme oopgemaak word nie"</string>
-    <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Hierdie inhoud kan nie met persoonlike programme gedeel word nie"</string>
+    <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Hierdie inhoud kan nie met persoonlike apps gedeel word nie"</string>
     <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Hierdie inhoud kan nie met persoonlike programme oopgemaak word nie"</string>
     <string name="resolver_turn_on_work_apps" msgid="1535946298236678122">"Werkapps is onderbreek"</string>
     <string name="resolver_switch_on_work" msgid="4527096360772311894">"Hervat"</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Apps"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Jou vingerafdrukke kan nie meer herken word nie. Stel Vingerafdrukslot weer op."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB-toestel is ingeprop wanneer dit gesluit is"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB-toestel is ingeprop wanneer jou Android gesluit is. Om die toestel te gebruik, moet jy eers jou Android ontsluit en dan weer die USB-toestel insit om dit te gebruik."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Verdagte USB-aktiwiteit"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB-datasein is gedeaktiveer."</string>
 </resources>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 1ab3beb..c55f1c6 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"ንቀል"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> ንቀል"</string>
     <string name="app_info" msgid="6113278084877079851">"የመተግበሪያ መረጃ"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"የቀጥታ ማጋራት ዒላማዎች"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"የመተግበሪያ አስተያየቶች"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"የመተግበሪያ ዝርዝር"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"ማሳያን በማስጀመር ላይ…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"መሣሪያን ዳግም በማስጀመር ላይ…"</string>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"ከDpad በስተግራ"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"ከDpad በስተቀኝ"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"የDpad ማዕከል"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"የራስ-ሰር ጠቅ ማድረግ ትየባ ቅንብሮች ፓነል"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"የግራ ጠቅታ"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"ባለበት አቁም"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"አቀማመጥ"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ወደ የRESTRICTED ባልዲ ተከትቷል"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>፦"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"አንድ ምስል ልከዋል"</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"ካርታዎች"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"መተግበሪያዎች"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"ከእንግዲህ የጣት አሻራዎችዎ ሊለዩ አይችሉም። በጣት አሻራ መክፈቻን እንደገና ያዋቅሩ።"</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"ሲቆለፍ የUSB መሣሪያ ተሰክቷል።"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Android ሲቆለፍ የUSB መሣሪያ ተሰክቷል። መሣሪያ ለመጠቀም እባክዎ መጀመሪያ Androidን ይክፈቱ እና ከዚያም እሱን ለመጠቀም የUSB መሣሪያ እንደገና ያስገቡ።"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"አጠራጣሪ የUSB እንቅስቃሴ"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"የUSB የውሂብ ምልክት ተሰናክሏል።"</string>
 </resources>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 637b08d..f542d439b 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -1468,7 +1468,7 @@
     <string name="select_keyboard_layout_notification_message" msgid="8835158247369158154">"انقر لاختيار لغة وتنسيق"</string>
     <string name="fast_scroll_alphabet" msgid="8854435958703888376">" أ ب ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ف ق ك ل م ن ه و ي"</string>
     <string name="fast_scroll_numeric_alphabet" msgid="2529539945421557329">" 0123456789 أ ب ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ف ق ك ل م ن ه و ي"</string>
-    <string name="alert_windows_notification_channel_group_name" msgid="6063891141815714246">"إظهار فوق التطبيقات الأخرى"</string>
+    <string name="alert_windows_notification_channel_group_name" msgid="6063891141815714246">"الظهور فوق التطبيقات الأخرى"</string>
     <string name="alert_windows_notification_channel_name" msgid="3437528564303192620">"جارٍ عرض <xliff:g id="NAME">%s</xliff:g> فوق تطبيقات أخرى"</string>
     <string name="alert_windows_notification_title" msgid="6331662751095228536">"يتم عرض <xliff:g id="NAME">%s</xliff:g> فوق التطبيقات الأخرى."</string>
     <string name="alert_windows_notification_message" msgid="6538171456970725333">"إذا كنت لا تريد أن يستخدم <xliff:g id="NAME">%s</xliff:g> هذه الميزة، فانقر لفتح الإعدادات، ثم اختر إيقافها."</string>
@@ -2092,12 +2092,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"إزالة تثبيت"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"إزالة تثبيت <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"معلومات عن التطبيق"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"أهداف المشاركة المباشرة"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"التطبيقات المقترَحة"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"قائمة التطبيقات"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"جارٍ بدء العرض التوضيحي…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"جارٍ إعادة ضبط الجهاز…"</string>
@@ -2254,6 +2251,14 @@
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"الزرّ المركزي"</string>
     <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"لوحة إعدادات نوع النقر التلقائي"</string>
     <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"النقر بالزر الأيسر"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
+    <skip />
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
+    <skip />
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
+    <skip />
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
+    <skip />
     <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"إيقاف مؤقت"</string>
     <string name="accessibility_autoclick_position" msgid="2933660969907663545">"تعديل الموضع"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"تم وضع <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> في الحزمة \"محظورة\"."</string>
@@ -2530,12 +2535,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"‏خرائط Google"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"التطبيقات"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"لم يعد بالإمكان التعرّف على بصمات أصابعك. يجب ضبط ميزة \"فتح الجهاز ببصمة الإصبع\" مجددًا."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"‏تم توصيل جهاز USB عندما كان الجهاز مقفلاً"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"‏تم توصيل جهاز USB عندما كان جهاز Android مقفلاً. لاستخدام الجهاز، يُرجى فتح قفل جهاز Android أولاً ثم إعادة إدخال جهاز USB لاستخدامه."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"‏نشاط مريب في جهاز USB"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"‏تم إيقاف مؤشر بيانات USB."</string>
 </resources>
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index 95d442b..b8afd2e 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"আনপিন"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g>ক আনপিন কৰক"</string>
     <string name="app_info" msgid="6113278084877079851">"এপ্ সম্পৰ্কীয় তথ্য"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"পোনপটীয়াকৈ কৰা শ্বেয়াৰৰ লক্ষ্য"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"এপৰ পৰামৰ্শ"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"এপৰ সূচী"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"ডেম\' আৰম্ভ কৰি থকা হৈছে…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"ডিভাইচটো আকৌ ছেটিং কৰি থকা হৈছে…"</string>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"ডিপেডৰ বাওঁফালৰ বুটাম"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"ডিপেডৰ সোঁফালৰ বুটাম"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"ডিপেডৰ মাজৰ বুটাম"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"প্ৰকাৰৰ ছেটিঙৰ পেনেলত স্বয়ংক্ৰিয়ভাৱে ক্লিক কৰক"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"বাওঁফালৰ ক্লিক"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"পজ কৰক"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"স্থান"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>ক সীমাবদ্ধ বাকেটটোত ৰখা হৈছে"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"এখন প্ৰতিচ্ছবি পঠিয়াইছে"</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"মেপ"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"এপ্লিকেশ্বন"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"আপোনাৰ ফিংগাৰপ্ৰিণ্ট আৰু চিনাক্ত কৰিব নোৱাৰি। ফিংগাৰপ্ৰিণ্ট আনলক পুনৰ ছেট আপ কৰক।"</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"লক হৈ থাকোঁতে USB ডিভাইচ প্লাগ ইন কৰা হৈছে"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Android লক হৈ থাকোঁতে USB ডিভাইচ প্লাগ ইন কৰা হৈছে। ডিভাইচ ব্যৱহাৰ কৰিবলৈ অনুগ্ৰহ কৰি প্ৰথমে Android আনলক কৰক আৰু তাৰ পাছত USB ডিভাইচটো ব্যৱহাৰ কৰিবলৈ সেইটো পুনৰ ভৰাওক।"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"সন্দেহজনক USBৰ কাৰ্যকলাপ"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB ডেটা ছিগনেল অক্ষম কৰা হৈছে।"</string>
 </resources>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index 4f7da4f..affa569 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Çıxarın"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"İşarələməyin: <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Tətbiq haqqında"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Birbaşa paylaşım hədəfləri"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Tətbiq təklifləri"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Tətbiq siyahısı"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Demo başlayır…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Cihaz sıfırlanır…"</string>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad Sola"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad Sağa"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad Mərkəzə"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Avtomatik klikləmə növü üzrə ayarlar paneli"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Sola klik"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Durdurun"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Mövqe"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> MƏHDUDLAŞDIRILMIŞ səbətinə yerləşdirilib"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"şəkil göndərdi"</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Xəritə"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Tətbiqlər"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Barmaq izlərinizi artıq tanımaq mümkün deyil. Barmaqla Kilidaçmanı yenidən ayarlayın."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Kilidli olduqda USB cihazı qoşulu olur"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Android kilidləndikdə USB cihazı qoşulu olur. Cihazdan istifadə etmək üçün əvvəlcə Android-i kiliddən çıxarın və sonra USB cihazını yenidən taxaraq ondan istifadə edin."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Şübhəli USB fəaliyyəti"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB data siqnalı deaktiv edilib."</string>
 </resources>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index 049359b..3acc8df 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -2089,12 +2089,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Otkači"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Otkači aplikaciju <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Informacije o aplikaciji"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Ciljevi direktnog deljenja"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Predlozi aplikacija"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Lista aplikacija"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Pokrećemo demonstraciju..."</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Resetujemo uređaj..."</string>
@@ -2251,6 +2248,10 @@
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"centar na D-pad-u"</string>
     <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Okno sa podešavanjima tipa automatskog klika"</string>
     <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Levi klik"</string>
+    <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"Kliknite desnim tasterom"</string>
+    <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"Dvaput kliknite"</string>
+    <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"Prevucite"</string>
+    <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"Skrolujte"</string>
     <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pauziraj"</string>
     <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Pozicija"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Paket <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> je dodat u segment OGRANIČENO"</string>
@@ -2527,12 +2528,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Mape"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplikacije"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Otisci prstiju više ne mogu da se prepoznaju. Ponovo podesite otključavanje otiskom prsta."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB uređaj je priključen kada je Android zaključan"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB uređaj je priključen kada je Android zaključan. Da biste koristili uređaj, prvo otključajte Android, pa ponovo ubacite USB uređaj da biste ga koristili."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Sumnjiva USB aktivnost"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Signal za prenos podataka sa USB-a je onemogućen."</string>
 </resources>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 02cc889..7c827bb 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -2090,12 +2090,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Адмацаваць"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Адмацаваць праграму \"<xliff:g id="LABEL">%1$s</xliff:g>\""</string>
     <string name="app_info" msgid="6113278084877079851">"Звесткі аб праграме"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Адрасаты для прамога абагульвання"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Прапановы праграм"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Спіс праграм"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Ідзе запуск дэманстрацыі…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Ідзе скід налад прылады…"</string>
@@ -2250,14 +2247,14 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Улева на панэлі кіравання"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Управа на панэлі кіравання"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"У цэнтр на панэлі кіравання"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
-    <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
-    <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
-    <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
-    <skip />
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Панэль налад тыпу аўтаматычнага націскання"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Націсканне левай клавішай мышы"</string>
+    <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"Націсканне правай кнопкай мышы"</string>
+    <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"Двайное націсканне"</string>
+    <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"Перацягванне"</string>
+    <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"Гартанне"</string>
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Прыпыніць"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Пазіцыя"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Пакет \"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>\" дададзены ў АБМЕЖАВАНУЮ групу"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"адпраўлены відарыс"</string>
@@ -2532,12 +2529,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Карты"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Праграмы"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Вашы адбіткі пальцаў больш не распазнаюцца. Паўторна наладзьце разблакіроўку адбіткам пальца."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB-прылада падключана, калі прылада заблакіравана"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB-прылада падключана, калі прылада Android заблакіравана. Каб выкарыстоўваць прыладу, разблакіруйце прыладу Android і паўторна ўстаўце USB-прыладу."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Падазроная актыўнасць на USB-прыладзе"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Сігнал даных USB адключаны."</string>
 </resources>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index d85e319..c3a2712 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Освобождаване"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Премахване на фиксирането на <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Информация за приложението"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Цели за директно споделяне"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Предложения за приложения"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Списък с приложения"</string>
     <string name="negative_duration" msgid="1938335096972945232">"-<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Демонстрацията се стартира…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Устройството се нулира…"</string>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Контролен пад – ляво"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Контролен пад – дясно"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Контролен пад – център"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Панел с настройки за типа на автоматичното кликване"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Кликване с ляв бутон"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Пауза"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Позиция"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Пакетът <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> е поставен в ОГРАНИЧЕНИЯ контейнер"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"изпратено изображение"</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Карти"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Приложения"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Отпечатъците ви вече не могат да бъдат разпознати. Настройте отново „Отключване с отпечатък“."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB устройството е свързано, когато устройството е заключено"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB устройството е включено, когато устройството с Android е заключено. За да използвате устройството, първо отключете Android и след това поставете отново USB устройството."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Подозрителна активност на USB"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Сигналът за данни през USB е деактивиран."</string>
 </resources>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index 19d4962..f6492c5 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"আনপিন করুন"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> অ্যাপ আনপিন করুন"</string>
     <string name="app_info" msgid="6113278084877079851">"অ্যাপের তথ্য"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"সরাসরি টার্গেট শেয়ার করুন"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"অ্যাপ সাজেশন"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"অ্যাপ তালিকা"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"ডেমো শুরু করা হচ্ছে…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"ডিভাইস আবার সেট করা হচ্ছে…"</string>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"ডিপ্যাড (Dpad)-এর বাঁদিকে"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"ডিপ্যাড (Dpad)-এর ডানদিকে"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"ডিপ্যাড (Dpad)-এর মাঝখানে"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"অটোক্লিক টাইপ সেটিংস প্যানেল"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"বাঁদিকের বোতামে ক্লিক করুন"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"পজ করুন"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"পজিশন"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> সীমাবদ্ধ গ্রুপে অন্তর্ভুক্ত করা হয়েছে"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"একটি ছবি পাঠানো হয়েছে"</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"ম্যাপ"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"অ্যাপ্লিকেশন"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"আপনার ফিঙ্গারপ্রিন্ট আর শনাক্ত করা যাবে না। \'ফিঙ্গারপ্রিন্ট আনলক\' ফিচার আবার সেট-আপ করুন।"</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"লক থাকাকালীন USB ডিভাইস প্লাগ-ইন করা হয়েছে"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Android লক থাকাকালীন USB ডিভাইস প্লাগ-ইন করা হয়েছে। ডিভাইস ব্যবহার করতে, প্রথমে Android আনলক করুন এবং তারপর সেটি ব্যবহার করতে USB ডিভাইস আবার যোগ করুন।"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"সন্দেহজনক USB অ্যাক্টিভিটি"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB ডেটা সিগন্যাল বন্ধ করা হয়েছে।"</string>
 </resources>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index e95bedf..3ff85ac 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -2089,12 +2089,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Otkači"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Otkači aplikaciju <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Informacije o aplikaciji"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Ciljevi direktnog dijeljenja"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Prijedlozi aplikacija"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Lista aplikacija"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Pokretanje demonstracije…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Vraćanje uređaja na početne postavke…"</string>
@@ -2251,8 +2248,12 @@
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Upravljač sredina"</string>
     <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Ploča postavki vrste automatskog klika"</string>
     <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Lijevi klik"</string>
+    <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"Desni klik"</string>
+    <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"Dvostruki klik"</string>
+    <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"Povuci"</string>
+    <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"Pomakni se"</string>
     <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pauziraj"</string>
-    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Pozicija"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Položaj"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Paket <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> je stavljen u odjeljak OGRANIČENO"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"je poslao/la sliku"</string>
@@ -2266,7 +2267,7 @@
     <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Blokirao je vaš IT administrator"</string>
     <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Ovaj sadržaj nije moguće dijeliti pomoću poslovnih aplikacija"</string>
     <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Ovaj sadržaj nije moguće otvoriti pomoću poslovnih aplikacija"</string>
-    <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Ovaj sadržaj nije moguće dijeliti pomoću ličnih aplikacija"</string>
+    <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Ovaj sadržaj nije moguće dijeliti s ličnim aplikacijama"</string>
     <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Ovaj sadržaj nije moguće otvoriti pomoću ličnih aplikacija"</string>
     <string name="resolver_turn_on_work_apps" msgid="1535946298236678122">"Poslovne aplikacije su pauzirane"</string>
     <string name="resolver_switch_on_work" msgid="4527096360772311894">"Ponovo pokreni"</string>
@@ -2527,12 +2528,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Mape"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplikacije"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Vaši otisci prstiju se više ne mogu prepoznavati. Ponovo postavite otključavanje otiskom prsta."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB uređaj je priključen dok je uređaj bio zaključan"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB uređaj je priključen dok je Android bio zaključan. Da koristite uređaj, prvo otključajte Android, a zatim ponovo umetnite USB uređaj da ga koristite."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Sumnjiva aktivnost USB-a"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Podatkovni signal USB-a je onemogućen."</string>
 </resources>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 9b67f28..9b61887 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -2089,12 +2089,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"No fixis"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"No fixis <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Informació de l\'app"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Destinataris de la compartició directa"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Suggeriments d\'aplicacions"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Llista d\'aplicacions"</string>
     <string name="negative_duration" msgid="1938335096972945232">"-<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"S\'està iniciant la demostració…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"S\'està restablint el dispositiu…"</string>
@@ -2249,14 +2246,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Creu direccional: esquerra"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Creu direccional: dreta"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Creu direccional: centre"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Tauler de configuració del tipus de clic automàtic"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Clic esquerre"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Posa en pausa"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Posició"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> s\'ha transferit al segment RESTRINGIT"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ha enviat una imatge"</string>
@@ -2531,12 +2532,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplicacions"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Les teves empremtes digitals ja no es poden reconèixer. Torna a configurar Desbloqueig amb empremta digital."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"S\'ha connectat un dispositiu USB quan el dispositiu estava bloquejat"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"El dispositiu USB està connectat quan Android està bloquejat. Per utilitzar el dispositiu, primer desbloqueja Android i, a continuació, torna a inserir el dispositiu USB per utilitzar-lo."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Activitat USB sospitosa"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"El senyal de dades per USB s\'ha desactivat."</string>
 </resources>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index f4eef97..9c8cc9a 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -2252,6 +2252,14 @@
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad střed"</string>
     <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Panel nastavení typu automatického kliknutí"</string>
     <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Kliknutí levým"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
+    <skip />
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
+    <skip />
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
+    <skip />
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
+    <skip />
     <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pozastavit"</string>
     <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Pozice"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Balíček <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> byl vložen do sekce OMEZENO"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index bcdb691..1b96dbb 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Frigør"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Frigør <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Appinfo"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Personer/grupper, der skal deles direkte med"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Appforslag"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Appliste"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Starter demoen…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Nulstiller enheden…"</string>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"D-pad, venstre"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"D-pad, højre"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"D-pad, midten"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Panel med indstillinger for type af automatisk klik"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Venstreklik"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Sæt på pause"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Placering"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> er blevet placeret i samlingen BEGRÆNSET"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"sendte et billede"</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Kort"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Apps"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Dine fingeraftryk kan ikke længere genkendes. Konfigurer fingeroplåsning igen."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB-enheden er tilsluttet, når Android er låst"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB-enheden er tilsluttet, når Android er låst. Hvis du vil bruge enheden, skal du først låse Android op og derefter tilslutte USB-enheden."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Mistænkelig USB-aktivitet"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB-datasignalet er blevet deaktiveret."</string>
 </resources>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 4191512..73e7b9a 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -2042,7 +2042,7 @@
     <string name="app_suspended_title" msgid="888873445010322650">"App nicht verfügbar"</string>
     <string name="app_suspended_default_message" msgid="6451215678552004172">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> ist momentan nicht verfügbar. Dies wird über die App \"<xliff:g id="APP_NAME_1">%2$s</xliff:g>\" verwaltet."</string>
     <string name="app_suspended_more_details" msgid="211260942831587014">"Weitere Informationen"</string>
-    <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"App-Pausierung aufheben"</string>
+    <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"Pausierung der App aufheben"</string>
     <string name="work_mode_off_title" msgid="6367463960165135829">"Geschäftliche Apps nicht mehr pausieren?"</string>
     <string name="work_mode_turn_on" msgid="5316648862401307800">"Nicht mehr pausieren"</string>
     <string name="work_mode_emergency_call_button" msgid="6818855962881612322">"Notruf"</string>
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Markierung entfernen"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> loslösen"</string>
     <string name="app_info" msgid="6113278084877079851">"App-Informationen"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"„Direct Share“-Ziele"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"App-Vorschläge"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"App-Liste"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Demo wird gestartet…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Gerät wird zurückgesetzt…"</string>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Steuerkreuz nach links"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Steuerkreuz nach rechts"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Steuerkreuz Mitte"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Bereich mit Einstellungen für automatische Klicks"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Linksklick"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pausieren"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Position"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> wurde in den BESCHRÄNKT-Bucket gelegt"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"hat ein Bild gesendet"</string>
@@ -2267,9 +2268,9 @@
     <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Private Ansicht"</string>
     <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Geschäftliche Ansicht"</string>
     <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Von deinem IT-Administrator blockiert"</string>
-    <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Diese Art von Inhalt kann nicht über geschäftliche Apps geteilt werden"</string>
+    <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Dieser Inhalt kann nicht über geschäftliche Apps geteilt werden"</string>
     <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Diese Art von Inhalt kann nicht mit geschäftlichen Apps geöffnet werden"</string>
-    <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Diese Art von Inhalt kann nicht über private Apps geteilt werden"</string>
+    <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Dieser Inhalt kann nicht über private Apps geteilt werden"</string>
     <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Diese Art von Inhalt kann nicht mit privaten Apps geöffnet werden"</string>
     <string name="resolver_turn_on_work_apps" msgid="1535946298236678122">"Geschäftliche Apps sind pausiert"</string>
     <string name="resolver_switch_on_work" msgid="4527096360772311894">"Nicht mehr pausieren"</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Anwendungen"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Deine Fingerabdrücke können nicht mehr erkannt werden. Bitte richte die Entsperrung per Fingerabdruck neu ein."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB-Gerät wurde angeschlossen, als das Android-Gerät gesperrt war"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Das USB-Gerät wurde angeschlossen, als das Android-Gerät gesperrt war. Du musst erst das Android-Gerät entsperren und dann das USB-Gerät noch einmal anschließen, damit du es verwenden kannst."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Verdächtige USB-Aktivitäten"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB-Datensignal wurde deaktiviert."</string>
 </resources>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 332fb1b..25a787c 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Ξεκαρφίτσωμα"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Ξεκαρφίτσωμα <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Πληροφορίες εφαρμογής"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Στοχευόμενοι χρήστες για Άμεση κοινή χρήση"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Προτεινόμενες εφαρμογές"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Λίστα εφαρμογών"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Έναρξη επίδειξης…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Επαναφορά συσκευής…"</string>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad αριστερά"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad δεξιά"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad κέντρο"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Πλαίσιο ρυθμίσεων τύπου αυτόματου κλικ"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Αριστερό κλικ"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Παύση"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Θέση"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Το πακέτο <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> τοποθετήθηκε στον κάδο ΠΕΡΙΟΡΙΣΜΕΝΗΣ ΠΡΟΣΒΑΣΗΣ."</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"έστειλε μια εικόνα"</string>
@@ -2269,7 +2270,7 @@
     <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Αποκλείστηκε από τον διαχειριστή IT"</string>
     <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Δεν είναι δυνατή η κοινοποίηση αυτού του περιεχομένου με εφαρμογές εργασιών"</string>
     <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Δεν είναι δυνατό το άνοιγμα αυτού του περιεχομένου με εφαρμογές εργασιών"</string>
-    <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Δεν είναι δυνατή η κοινοποίηση αυτού του περιεχομένου με προσωπικές εφαρμογές"</string>
+    <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Δεν είναι δυνατή η κοινοποίηση αυτού του περιεχομένου σε προσωπικές εφαρμογές"</string>
     <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Δεν είναι δυνατό το άνοιγμα αυτού του περιεχομένου με προσωπικές εφαρμογές"</string>
     <string name="resolver_turn_on_work_apps" msgid="1535946298236678122">"Οι εφαρμογές εργασιών τέθηκαν σε παύση"</string>
     <string name="resolver_switch_on_work" msgid="4527096360772311894">"Αναίρεση παύσης"</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Χάρτες"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Εφαρμογές"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Δεν είναι δυνατή πλέον η αναγνώριση των δακτυλικών αποτυπωμάτων σας. Ρυθμίστε ξανά τη λειτουργία Ξεκλείδωμα με δακτυλικό αποτύπωμα."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Σύνδεση συσκευής USB σε κατάσταση κλειδώματος"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Η συσκευή USB είναι συνδεδεμένη, όταν το Android είναι κλειδωμένο. Για να χρησιμοποιήσετε τη συσκευή, ξεκλειδώστε πρώτα το Android και, στη συνέχεια, επανατοποθετήστε τη συσκευή USB για να τη χρησιμοποιήσετε."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Ύποπτη δραστηριότητα USB"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Το σήμα δεδομένων USB έχει απενεργοποιηθεί."</string>
 </resources>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 74feb32..886beff 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Unpin"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Unpin <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"App info"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Direct share targets"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"App suggestions"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"App list"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Starting demo…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Resetting device…"</string>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad left"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad right"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad centre"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Autoclick type settings panel"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Left-click"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pause"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Position"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> has been put into the RESTRICTED bucket"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"sent an image"</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Applications"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Your fingerprints can no longer be recognised. Set up Fingerprint Unlock again."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB device plugged in when locked"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB device is plugged in when Android is locked. To use the device, please unlock Android first and then reinsert the USB device to use it."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Suspicious USB activity"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB data signal has been disabled."</string>
 </resources>
diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml
index 9b7764e..33bbc6f 100644
--- a/core/res/res/values-en-rCA/strings.xml
+++ b/core/res/res/values-en-rCA/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Unpin"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Unpin <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"App info"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Direct share targets"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"App suggestions"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"App list"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Starting demo…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Resetting device…"</string>
@@ -2250,6 +2247,10 @@
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad Center"</string>
     <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Autoclick type settings panel"</string>
     <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Left click"</string>
+    <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"Right click"</string>
+    <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"Double click"</string>
+    <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"Drag"</string>
+    <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"Scroll"</string>
     <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pause"</string>
     <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Position"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> has been put into the RESTRICTED bucket"</string>
@@ -2526,12 +2527,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Applications"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Your fingerprints can no longer be recognized. Set up Fingerprint Unlock again."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB device plugged in when locked"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB device is plugged in when Android is locked. To use device, please unlock Android first and then reinsert USB device to use it."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Suspicious USB activity"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB data signal has been disabled."</string>
 </resources>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 51148ae..f0a9c2a 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Unpin"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Unpin <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"App info"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Direct share targets"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"App suggestions"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"App list"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Starting demo…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Resetting device…"</string>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad left"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad right"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad centre"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Autoclick type settings panel"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Left-click"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pause"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Position"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> has been put into the RESTRICTED bucket"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"sent an image"</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Applications"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Your fingerprints can no longer be recognised. Set up Fingerprint Unlock again."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB device plugged in when locked"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB device is plugged in when Android is locked. To use the device, please unlock Android first and then reinsert the USB device to use it."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Suspicious USB activity"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB data signal has been disabled."</string>
 </resources>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 0b9bb83..8fcb412 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Unpin"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Unpin <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"App info"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Direct share targets"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"App suggestions"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"App list"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Starting demo…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Resetting device…"</string>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad left"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad right"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad centre"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Autoclick type settings panel"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Left-click"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pause"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Position"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> has been put into the RESTRICTED bucket"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"sent an image"</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Applications"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Your fingerprints can no longer be recognised. Set up Fingerprint Unlock again."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB device plugged in when locked"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB device is plugged in when Android is locked. To use the device, please unlock Android first and then reinsert the USB device to use it."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Suspicious USB activity"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB data signal has been disabled."</string>
 </resources>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 07c66ea..f46a4d4 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -2089,12 +2089,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Dejar de fijar"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Dejar de fijar <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Información de apps"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Objetivos de uso compartido directo"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Sugerencias de aplicaciones"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Lista de apps"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Iniciando demostración…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Restableciendo dispositivo…"</string>
@@ -2251,6 +2248,14 @@
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Pad direccional: centro"</string>
     <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Panel de configuración del tipo de clic automático"</string>
     <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Clic izquierdo"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
+    <skip />
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
+    <skip />
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
+    <skip />
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
+    <skip />
     <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pausar"</string>
     <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Posición"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Se colocó <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> en el bucket RESTRICTED"</string>
@@ -2527,12 +2532,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplicaciones"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Ya no se pueden reconocer tus huellas dactilares. Vuelve a configurar el Desbloqueo con huellas dactilares."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Dispositivo USB conectado cuando el dispositivo está bloqueado"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"El dispositivo USB está conectado cuando Android está bloqueado. Para usar el dispositivo, primero desbloquea Android y, luego, vuelve a insertar el dispositivo USB."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Actividad de USB sospechosa"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Se inhabilitó la señal de datos por USB."</string>
 </resources>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index f035d5b..d594897 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -2089,12 +2089,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"No fijar"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"No fijar <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Información de la app"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Objetivos de compartición directa"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Sugerencias de aplicaciones"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Lista de aplicaciones"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Iniciando demostración…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Restableciendo dispositivo…"</string>
@@ -2249,14 +2246,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Cruceta: izquierda"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Cruceta: derecha"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Cruceta: centro"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Panel de ajustes del tipo de clic automático"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Clic izquierdo"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pausar"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Posición"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> se ha incluido en el grupo de restringidos"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ha enviado una imagen"</string>
@@ -2531,12 +2532,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplicaciones"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Tus huellas digitales ya no pueden reconocerse. Vuelve a configurar Desbloqueo con huella digital."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Dispositivo USB conectado con el dispositivo bloqueado"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"El dispositivo USB está conectado cuando Android está bloqueado. Para usar el dispositivo, desbloquea Android primero y, a continuación, vuelve a insertar el dispositivo USB para usarlo."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Actividad USB sospechosa"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"La señal de datos USB se ha inhabilitado."</string>
 </resources>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index 1e299a6..5e961f4 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -318,7 +318,7 @@
     <string name="foreground_service_tap_for_details" msgid="9078123626015586751">"Aku ja andmekasutuse üksikasjade nägemiseks puudutage"</string>
     <string name="foreground_service_multiple_separator" msgid="5002287361849863168">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
     <string name="safeMode" msgid="8974401416068943888">"Turvarežiim"</string>
-    <string name="android_system_label" msgid="5974767339591067210">"Android-süsteem"</string>
+    <string name="android_system_label" msgid="5974767339591067210">"Androidi süsteem"</string>
     <string name="user_owner_label" msgid="8628726904184471211">"Lülitu isiklikule profiilile"</string>
     <string name="managed_profile_label" msgid="7316778766973512382">"Lülitu tööprofiilile"</string>
     <string name="user_owner_app_label" msgid="1553595155465750298">"Lülita <xliff:g id="APP_NAME">%1$s</xliff:g> isiklikule profiilile"</string>
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Vabasta"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Vabasta <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Rakenduse teave"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Otsejagamise sihtmärgid"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Rakenduste soovitused"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Rakenduste loend"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Demo käivitamine …"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Seadme lähtestamine …"</string>
@@ -2250,6 +2247,10 @@
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Suunaklahvistiku keskmine nupp"</string>
     <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Automaatkliki tüübi seadete paneel"</string>
     <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Vasakklikk"</string>
+    <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"Paremklikk"</string>
+    <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"Topeltklikk"</string>
+    <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"Lohista"</string>
+    <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"Keri"</string>
     <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Peata"</string>
     <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Asukoht"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> on lisatud salve PIIRANGUTEGA"</string>
@@ -2526,12 +2527,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Rakendused"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Teie sõrmejälgi ei saa enam tuvastada. Seadistage sõrmejäljega avamine uuesti."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB-seade ühendati, kui seade oli lukus"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB-seade ühendati, kui Android oli lukustatud. Seadme kasutamiseks avage esmalt Android ja ühendage siis USB-seade uuesti, et seda kasutada."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Kahtlane tegevus USB-ga"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB andmesignaal on keelatud."</string>
 </resources>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index 177449c..0e450d1 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Kendu aingura"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Kendu aingura <xliff:g id="LABEL">%1$s</xliff:g> aplikazioari"</string>
     <string name="app_info" msgid="6113278084877079851">"Aplikazioari buruzko informazioa"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Partekatze zuzenen helburuak"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Aplikazioen iradokizunak"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Aplikazioen zerrenda"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Demoa abiarazten…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Gailua berrezartzen…"</string>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Norabide-kontrolagailuko ezkerreko botoia"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Norabide-kontrolagailuko eskuineko botoia"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Norabide-kontrolagailuko erdiko botoia"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Automatikoki klik egiteko eginbide motaren ezarpenen panela"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Egin klik ezkerreko botoiarekin"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pausatu"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Ezarri posizioan"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Murriztuen edukiontzian ezarri da <xliff:g id="PACKAGE_NAME">%1$s</xliff:g>"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"erabiltzaileak irudi bat bidali du"</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplikazioak"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Zure hatz-markak ez dira ezagutzen jada. Konfiguratu berriro hatz-marka bidez desblokeatzeko eginbidea."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB bidezko gailua blokeatuta zegoen bitartean entxufatu da"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB bidezko gailua entxufatuta dago Android blokeatuta dagoenean. Gailua erabiltzeko, desblokeatu Android eta entxufatu berriro USB bidezko gailua hura erabiltzeko."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"USB bidezko jarduera susmagarriak"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB bidezko datu-seinalea desgaitu da."</string>
 </resources>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index e0a8c1b..4334713 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"برداشتن سنجاق"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"برداشتن سنجاق <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"اطلاعات برنامه"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"هدف‌های هم‌رسانی مستقیم"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"پیشنهادهای برنامه"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"فهرست برنامه"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"در حال شروع نسخه نمایشی…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"در حال بازنشانی دستگاه…"</string>
@@ -2248,14 +2245,14 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"پد کنترل چپ"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"پد کنترل راست"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"پد کنترل وسط"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
-    <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
-    <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
-    <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
-    <skip />
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"پانل تنظیمات نوع کلیک خودکار"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"کلیک چپ"</string>
+    <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"کلیک راست"</string>
+    <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"دوکلیک کردن"</string>
+    <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"کشیدن"</string>
+    <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"پیمایش"</string>
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"توقف موقت"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"موقعیت"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> در سطل «محدودشده» قرار گرفت"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"تصویری ارسال کرد"</string>
@@ -2530,12 +2527,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"نقشه"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"برنامه‌ها"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"اثر انگشتانتان دیگر قابل‌شناسایی نیست. «قفل‌گشایی با اثر انگشت» را دوباره راه‌اندازی کنید."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"‏دستگاه USB هنگام قفل بودن وصل شده است"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"‏دستگاه USB هنگام قفل بودن Android متصل شده است. برای استفاده از دستگاه، لطفاً ابتدا قفل Android را باز کنید و سپس دستگاه USB را دوباره وارد کنید."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"‏فعالیت مشکوک USB"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"‏نشانِ داده USB غیرفعال شده است."</string>
 </resources>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 1b53196..5e3913e 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Irrota"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Irrota <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Sovellustiedot"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Suorajaon vastaanottajat"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Sovellusehdotukset"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Sovelluslista"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Aloitetaan esittelyä…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Palautetaan asetuksia…"</string>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Suuntanäppäimistö: vasen painike"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Suuntanäppäimistö: oikea painike"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Suuntanäppäimistö: keskipainike"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Automaattisen klikkaustyypin asetuspaneeli"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Ykköspainike"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Keskeytä"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Sijainti"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> on nyt rajoitettujen ryhmässä"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"lähetti kuvan"</string>
@@ -2484,7 +2485,7 @@
     <string name="satellite_manual_selection_state_popup_cancel" msgid="973605633339469252">"Takaisin"</string>
     <string name="unarchival_session_app_label" msgid="6811856981546348205">"Odottaa…"</string>
     <string name="satellite_sos_available_notification_title" msgid="5396708154268096124">"Satellite SOS on nyt käytettävissä"</string>
-    <string name="satellite_sos_available_notification_summary" msgid="1727088812951848330">"Voit lähettää viestin hätäkeskukseen, jos sinulla ei ole mobiili‑ tai Wi-Fi-verkkoyhteyttä. Google Messages täytyy valita oletusviestisovellukseksi."</string>
+    <string name="satellite_sos_available_notification_summary" msgid="1727088812951848330">"Voit lähettää viestin hätäkeskukseen, jos sinulla ei ole mobiili‑ tai Wi-Fi-verkkoyhteyttä. Google Messagesin on oltava oletustekstiviestisovelluksesi."</string>
     <string name="satellite_sos_not_supported_notification_title" msgid="2659100983227637285">"Satellite SOS ei tueta"</string>
     <string name="satellite_sos_not_supported_notification_summary" msgid="1071762454665310549">"Satellite SOS ei tueta tällä laitteella"</string>
     <string name="satellite_sos_not_provisioned_notification_title" msgid="8564738683795406715">"Satellite SOS ei ole otettu käyttöön"</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Sovellukset"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Sormenjälkiäsi ei voi enää tunnistaa. Ota sormenjälkiavaus uudelleen käyttöön."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB-laite kytkettynä, kun lukitus on päällä"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB-laite on kytkettynä, kun Android on lukittu. Jos haluat käyttää laitetta, avaa ensin Androidin lukitus ja kytke USB-laite uudelleen."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Epäilyttävää USB-toimintaa"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB-datasignaali on poistettu käytöstä."</string>
 </resources>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index d742d87..6ef3e21 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -2089,12 +2089,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Annuler l\'épinglage"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Annuler l\'épinglage de <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Détails de l\'appli"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Cibles du partage direct"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Applis suggérées"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Liste d\'applis"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Démarrage de la démonstration en cours…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Réinitialisation de l\'appareil en cours…"</string>
@@ -2249,14 +2246,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Pavé directionnel – gauche"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Pavé directionnel – droite"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Pavé directionnel – centre"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Panneau de configuration des paramètres de type clic automatique"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Clic gauche"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pause"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Position"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> a été placé dans le compartiment RESTREINT"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g> :"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"a envoyé une image"</string>
@@ -2531,12 +2532,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Applications"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Vos empreintes digitales ne peuvent plus être reconnues. Reconfigurez le Déverrouillage par empreinte digitale."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"L\'appareil USB est branché quand Android est verrouillé"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"L\'appareil USB est branché quand Android est verrouillé. Pour utiliser l\'appareil, veuillez d\'abord déverrouiller Android, puis réinsérer l\'appareil USB."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Activité USB suspecte"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Le signal de données USB a été désactivé."</string>
 </resources>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index f0727d6..4fd8601 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -2089,12 +2089,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Retirer"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Retirer <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Infos sur l\'appli"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Cibles de partage direct"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Suggestions d\'applications"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Liste des applications"</string>
     <string name="negative_duration" msgid="1938335096972945232">"− <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Lancement de la démo…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Réinitialisation…"</string>
@@ -2249,14 +2246,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Pavé directionnel - Gauche"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Pavé directionnel - Droite"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Pavé directionnel - Centre"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Panneau des paramètres du type de clic automatique"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Clic gauche"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pause"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Position"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> a été placé dans le bucket RESTRICTED"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g> :"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"a envoyé une image"</string>
@@ -2531,12 +2532,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Applications"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Vos empreintes ne peuvent plus être reconnues. Reconfigurez le déverrouillage par empreinte digitale."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Appareil USB branché alors que l\'appareil Android est verrouillé"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"L\'appareil USB est branché alors que l\'appareil Android est verrouillé. Pour utiliser l\'appareil, veuillez d\'abord déverrouiller Android, puis brancher à nouveau l\'appareil USB."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Activité USB suspecte"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Le signal de données USB a été désactivé."</string>
 </resources>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index bb41a4f..4ce3fc3 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Deixar de fixar"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Deixar de fixar a <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Información da app"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Destinatarios da función de compartir directamente"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Suxestións de aplicacións"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Lista de aplicacións"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Iniciando demostración…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Restablecendo dispositivo…"</string>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Cruceta: esquerda"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Cruceta: dereita"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Cruceta: centro"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Panel de configuración do tipo de clic automático"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Clic co botón esquerdo do rato"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pausa"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Posición"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> incluíuse no grupo RESTRINXIDO"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"enviouse unha imaxe"</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Mapas"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplicacións"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Xa non se recoñecen as túas impresións dixitais. Configura de novo o desbloqueo dactilar."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Dispositivo USB conectado cando Android está bloqueado"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"O dispositivo USB está conectado cando Android está bloqueado. Para usalo, primeiro desbloquea Android e despois volve inserir o dispositivo USB."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Actividade USB sospeitosa"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Desactivouse o indicador de datos USB."</string>
 </resources>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index ff32df0..fcba3fe 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"અનપિન કરો"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g>ને અનપિન કરો"</string>
     <string name="app_info" msgid="6113278084877079851">"ઍપની માહિતી"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"સીધા શેર કરવાના લક્ષ્યો"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"ઍપના સૂચનો"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"ઍપની સૂચિ"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"ડેમો પ્રારંભ કરી રહ્યાં છે…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"ઉપકરણ ફરીથી સેટ કરી રહ્યાં છે…"</string>
@@ -2248,14 +2245,14 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"ડી-પૅડ ડાબે"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"ડી-પૅડ જમણે"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"ડી-પૅડ મધ્યમાં"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
-    <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
-    <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
-    <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
-    <skip />
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"ઑટોક્લિક પ્રકારના સેટિંગની પૅનલ"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"ડાબું ક્લિક કરો"</string>
+    <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"રાઇટ ક્લિક કરો"</string>
+    <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"બે વાર ક્લિક કરો"</string>
+    <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"ખેંચો"</string>
+    <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"સ્ક્રોલ કરો"</string>
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"થોભાવો"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"સ્થિતિ"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>ને પ્રતિબંધિત સમૂહમાં મૂકવામાં આવ્યું છે"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"છબી મોકલી"</string>
@@ -2530,12 +2527,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"ઍપ્લિકેશનો"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"તમારી ફિંગરપ્રિન્ટને હવેથી ઓળખી શકાશે નહીં. ફિંગરપ્રિન્ટ અનલૉક સુવિધાનું ફરી સેટઅપ કરો."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"લૉક કરેલું હોય ત્યારે USB ડિવાઇસ પ્લગ-ઇન હોય છે"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Android લૉક હોય ત્યારે USB ડિવાઇસ પ્લગ-ઇન હોય છે. ડિવાઇસનો ઉપયોગ કરવા માટે, કૃપા કરીને પહેલા Android અનલૉક કરો અને પછી USB ડિવાઇસનો ઉપયોગ કરવા માટે તેને ફરી શામેલ કરો."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"શંકાસ્પદ USB ઍક્ટિવિટી"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB ડેટા સિગ્નલ બંધ કરવામાં આવ્યું છે."</string>
 </resources>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 393316b..66f0ced 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -329,7 +329,7 @@
     <string name="permgroupdesc_location" msgid="1995955142118450685">"इस डिवाइस की जगह तक पहुंचने दें"</string>
     <string name="permgrouplab_calendar" msgid="6426860926123033230">"कैलेंडर"</string>
     <string name="permgroupdesc_calendar" msgid="6762751063361489379">"आपके कैलेंडर को ऐक्सेस करने की अनुमति"</string>
-    <string name="permgrouplab_sms" msgid="795737735126084874">"मैसेज (एसएमएस)"</string>
+    <string name="permgrouplab_sms" msgid="795737735126084874">"एसएमएस"</string>
     <string name="permgroupdesc_sms" msgid="5726462398070064542">"मैसेज (एसएमएस) भेजें और देखें"</string>
     <string name="permgrouplab_storage" msgid="17339216290379241">"फ़ाइल"</string>
     <string name="permgroupdesc_storage" msgid="5378659041354582769">"अपने डिवाइस में मौजूद फ़ाइलों का ऐक्सेस दें"</string>
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"अनपिन करें"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> को अनपिन करें"</string>
     <string name="app_info" msgid="6113278084877079851">"ऐप्लिकेशन की जानकारी"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"सीधे तौर पर कॉन्टेंट शेयर करने के लिए चुने गए लोग या ग्रुप"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"सुझाए गए ऐप्लिकेशन"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"ऐप्लिकेशन की सूची"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"डेमो प्रारंभ हो रहा है…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"डिवाइस फिर से रीसेट कर रहा है…"</string>
@@ -2248,14 +2245,14 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"डी-पैड का बाईं ओर वाला बटन"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"डी-पैड का दाईं ओर वाला बटन"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"डी-पैड का बीच वाला बटन"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
-    <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
-    <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
-    <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
-    <skip />
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"अपने-आप क्लिक होने की सुविधा वाली सेटिंग का पैनल"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"लेफ़्ट क्लिक करें"</string>
+    <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"राइट क्लिक करें"</string>
+    <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"दो बार क्लिक करें"</string>
+    <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"खींचें और छोड़ें"</string>
+    <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"स्क्रोल करें"</string>
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"रोकें"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"पोज़िशन"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> को प्रतिबंधित बकेट में रखा गया है"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"एक इमेज भेजी गई"</string>
@@ -2530,12 +2527,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"मैप"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"ऐप्लिकेशन"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"अब आपके फ़िंगरप्रिंट की पहचान नहीं की जा सकती. फ़िंगरप्रिंट अनलॉक की सुविधा को दोबारा सेट अप करें."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"यूएसबी डिवाइस को, Android डिवाइस के लॉक होने के दौरान प्लग इन किया गया"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"यूएसबी डिवाइस को, Android डिवाइस के लॉक होने के दौरान प्लग इन किया गया. यूएसबी डिवाइस का इस्तेमाल करने के लिए, कृपया पहले Android डिवाइस को अनलॉक करें. इसके बाद, यूएसबी को फिर से इंसर्ट करें."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"यूएसबी से कोई संदिग्ध गतिविधि की गई"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"यूएसबी से डेटा सिग्नल भेजने की प्रोसेस बंद कर दी गई है."</string>
 </resources>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index cc4d296..aadf118 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -2089,12 +2089,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Otkvači"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Otkvači sudionika <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Informacije o aplikaciji"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Osoba/skupina za izravno dijeljenje"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Prijedlozi aplikacija"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Popis aplikacija"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Pokretanje demo-načina..."</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Vraćanje uređaja na zadano…"</string>
@@ -2251,6 +2248,10 @@
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"U središtu plohe za smjerove"</string>
     <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Ploča postavki vrste automatskog klika"</string>
     <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Lijevi klik"</string>
+    <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"Desni klik"</string>
+    <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"Dvostruki klik"</string>
+    <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"Povuci"</string>
+    <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"Pomakni se"</string>
     <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pauziraj"</string>
     <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Pozicija"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Paket <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> premješten je u spremnik OGRANIČENO"</string>
@@ -2527,12 +2528,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Karte"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplikacije"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Vaši se otisci prstiju više ne prepoznaju. Ponovo postavite otključavanje otiskom prsta."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB uređaj priključen je kada je zaključan"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB uređaj priključen je kad je Android zaključan. Da biste upotrebljavali uređaj, najprije otključajte Android, a zatim ponovno umetnite USB uređaj da biste ga upotrebljavali."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Sumnjiva aktivnost USB-a"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB podatkovni signal je onemogućen."</string>
 </resources>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index ddfef1a..39a4cfc 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Feloldás"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> rögzítésének feloldása"</string>
     <string name="app_info" msgid="6113278084877079851">"Alkalmazásinfó"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Közvetlen megosztási lehetőségek"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Alkalmazásjavaslatok"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Alkalmazáslista"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Bemutató indítása…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Eszköz visszaállítása…"</string>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"D-pad – balra"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"D-pad – jobbra"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"D-pad – középre"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Automatikus kattintás típusának beállításai panel"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Kattintás bal egérgombbal"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Szüneteltetés"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Pozíció"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"A következő csomag a KORLÁTOZOTT csoportba került: <xliff:g id="PACKAGE_NAME">%1$s</xliff:g>"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"képet küldött"</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Térkép"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Alkalmazások"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Az ujjlenyomata már nem ismerhető fel. Állítsa be újra a Feloldás ujjlenyomattal funkciót."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB-eszköz zárolt állapotban csatlakoztatva"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Az USB-eszköz csatlakoztatása az Android rendszer zárolt állapotában történt. Az eszköz használatához először oldja fel az Android zárolását, majd helyezze be újra az USB-eszközt."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Gyanús USB-tevékenység"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Az USB-adatjel le lett tiltva."</string>
 </resources>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index 92633245..f4b83f2 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -2248,14 +2248,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad-ի «Ձախ» կոճակ"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad-ի «Աջ» կոճակ"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad-ի «Կենտրոն» կոճակ"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Ավտոմատ սեղմման տեսակի կարգավորումների վահանակ"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Ձախ սեղմում"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Դադարեցնել"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Դիրքը"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> փաթեթը գցվեց ՍԱՀՄԱՆԱՓԱԿՎԱԾ զամբյուղի մեջ"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>՝"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"օգտատերը պատկեր է ուղարկել"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 86f71148..ce9a7f6 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Lepas pin"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Lepas sematan <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Info aplikasi"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Target berbagi langsung"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Saran aplikasi"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Daftar aplikasi"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Memulai demo..."</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Mereset perangkat..."</string>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad Kiri"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad Kanan"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad Tengah"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Panel setelan jenis klik otomatis"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Klik kiri"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Jeda"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Posisi"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> telah dimasukkan ke dalam bucket DIBATASI"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"mengirim gambar"</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplikasi"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Sidik jari Anda tidak dapat dikenali lagi. Siapkan Buka dengan Sidik Jari lagi."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Perangkat USB dicolokkan saat terkunci"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Perangkat USB dicolokkan saat Android terkunci. Untuk menggunakan perangkat, buka kunci Android terlebih dahulu, lalu pasang kembali perangkat USB untuk menggunakannya."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Aktivitas USB yang mencurigakan"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Sinyal data USB telah dinonaktifkan."</string>
 </resources>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index 360e3d9..b80efc7 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Losa"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Losa <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Forritsupplýsingar"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Deila beint með"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Tillögð forrit"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Forritalisti"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Byrjar kynningu…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Endurstillir tækið…"</string>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Vinstrihnappur stýriflatar"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Hægrihnappur stýriflatar"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Miðjuhnappur stýriflatar"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Stillingasvæði fyrir tegund sjálfvirks smells"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Vinstrismellur"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Hlé"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Staðsetning"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> var sett í flokkinn TAKMARKAÐ"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"sendi mynd"</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Kort"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Forrit"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Ekki er lengur hægt að bera kennsl á fingraförin þín. Settu fingrafarskenni upp aftur."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB-tæki stungið í samband á meðan tæki var læst"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB-tæki stungið í samband á meðan Android-tækið var læst. Byrjaðu á því að taka Android-tækið úr lás og stingdu síðan USB-tækinu í samband til að nota það."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Grunsamleg USB-virkni"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Slökkt var á USB-gagnamerki."</string>
 </resources>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 1914ea5..3ca9f7f 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -333,11 +333,11 @@
     <string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
     <string name="permgroupdesc_sms" msgid="5726462398070064542">"Possono inviare e visualizzare SMS"</string>
     <string name="permgrouplab_storage" msgid="17339216290379241">"File"</string>
-    <string name="permgroupdesc_storage" msgid="5378659041354582769">"accedere ai file sul tuo dispositivo"</string>
+    <string name="permgroupdesc_storage" msgid="5378659041354582769">"Possono accedere ai file sul tuo dispositivo"</string>
     <string name="permgrouplab_readMediaAural" msgid="1858331312624942053">"Musica e audio"</string>
-    <string name="permgroupdesc_readMediaAural" msgid="7565467343667089595">"accedere a musica e audio sul tuo dispositivo"</string>
+    <string name="permgroupdesc_readMediaAural" msgid="7565467343667089595">"Possono accedere a musica e audio sul tuo dispositivo"</string>
     <string name="permgrouplab_readMediaVisual" msgid="4724874717811908660">"Foto e video"</string>
-    <string name="permgroupdesc_readMediaVisual" msgid="4080463241903508688">"accedere a foto e video sul tuo dispositivo"</string>
+    <string name="permgroupdesc_readMediaVisual" msgid="4080463241903508688">"Possono accedere a foto e video sul tuo dispositivo"</string>
     <string name="permgrouplab_microphone" msgid="2480597427667420076">"Microfono"</string>
     <string name="permgroupdesc_microphone" msgid="1047786732792487722">"Possono registrare audio"</string>
     <string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Attività fisica"</string>
@@ -345,7 +345,7 @@
     <string name="permgrouplab_camera" msgid="9090413408963547706">"Fotocamera"</string>
     <string name="permgroupdesc_camera" msgid="7585150538459320326">"Possono scattare foto e registrare video"</string>
     <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Dispositivi nelle vicinanze"</string>
-    <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"rilevare e connettersi a dispositivi nelle vicinanze"</string>
+    <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"Possono rilevare e connettersi a dispositivi nelle vicinanze"</string>
     <string name="permgrouplab_calllog" msgid="7926834372073550288">"Registri chiamate"</string>
     <string name="permgroupdesc_calllog" msgid="2026996642917801803">"Possono leggere e modificare il registro chiamate del telefono"</string>
     <string name="permgrouplab_phone" msgid="570318944091926620">"Telefono"</string>
@@ -2089,12 +2089,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Stacca"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Sblocca <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Informazioni app"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Target di condivisione diretta"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"App suggerite"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Elenco di app"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Avvio della demo…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Reset del dispositivo…"</string>
@@ -2249,14 +2246,14 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"D-pad - Sinistra"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"D-pad - Destra"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"D-pad - Centro"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
-    <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
-    <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
-    <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
-    <skip />
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Riquadro impostazioni del tipo di clic automatico"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Clic sinistro"</string>
+    <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"Clic con il tasto destro del mouse"</string>
+    <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"Doppio clic"</string>
+    <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"Trascina"</string>
+    <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"Scorri"</string>
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Metti in pausa"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Posizione"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> è stato inserito nel bucket RESTRICTED"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ha inviato un\'immagine"</string>
@@ -2531,12 +2528,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Applicazioni"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Non è più possibile riconoscere le tue impronte. Riconfigura lo Sblocco con l\'Impronta."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Dispositivo USB collegato quando bloccato"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Il dispositivo USB è collegato quando Android è bloccato. Per usare il dispositivo, sblocca prima Android e poi reinserisci il dispositivo USB."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Attività USB sospetta"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"L\'indicatore di dati USB è stato disattivato."</string>
 </resources>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 5e0df47..cfa0987 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -1786,7 +1786,7 @@
     <string name="hearing_aids_feature_name" msgid="1125892105105852542">"מכשירי שמיעה"</string>
     <string name="hearing_device_status_disconnected" msgid="497547752953543832">"מנותק"</string>
     <string name="hearing_device_status_connected" msgid="2149385149669918764">"מחובר"</string>
-    <string name="hearing_device_status_active" msgid="4770378695482566032">"פעיל"</string>
+    <string name="hearing_device_status_active" msgid="4770378695482566032">"מצב פעיל"</string>
     <string name="hearing_device_status_loading" msgid="5717083847663109747">"בטעינה"</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>
@@ -2249,14 +2249,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"‏לחצן שמאלי ב-Dpad"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"‏לחצן ימני ב-Dpad"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"‏לחצן אמצעי ב-Dpad"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"חלונית ההגדרות של סוג הקליק האוטומטי"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"לחיצה שמאלית"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"השהיה"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"מיקום"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> התווספה לקטגוריה \'מוגבל\'"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"נשלחה תמונה"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index ac37d55..ad770aa 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"固定を解除"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> の固定を解除"</string>
     <string name="app_info" msgid="6113278084877079851">"アプリ情報"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"ダイレクト シェア ターゲット"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"アプリの候補"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"アプリリスト"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"デモを開始しています…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"デバイスをリセットしています…"</string>
@@ -2250,6 +2247,10 @@
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"D-pad: 中央"</string>
     <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"自動クリックの種類の設定パネル"</string>
     <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"左クリック"</string>
+    <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"右クリック"</string>
+    <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"ダブルクリック"</string>
+    <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"ドラッグ"</string>
+    <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"スクロール"</string>
     <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"一時停止"</string>
     <string name="accessibility_autoclick_position" msgid="2933660969907663545">"位置"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> は RESTRICTED バケットに移動しました。"</string>
@@ -2526,12 +2527,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"マップ"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"アプリ"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"指紋を認識できなくなりました。指紋認証をもう一度設定してください。"</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"ロック状態で USB デバイスが接続されました"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Android がロックされている状態で USB デバイスが接続されています。デバイスを使用するには、まず Android のロックを解除してから、USB デバイスを再挿入してください。"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"不審な USB アクティビティ"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB データシグナルが無効になっています。"</string>
 </resources>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index 2dee93b..481c422 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"ჩამაგრების მოხსნა"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g>-ის ჩამაგრების მოხსნა"</string>
     <string name="app_info" msgid="6113278084877079851">"აპის შესახებ"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"პირდაპირი გაზიარების მიზნები"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"აპის შეთავაზებები"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"აპების სია"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"მიმდინარეობს დემონსტრაციის დაწყება…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"მიმდინარეობს მოწყობილობის გადაყენება…"</string>
@@ -2250,6 +2247,10 @@
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad ცენტრი"</string>
     <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"ავტოდაწკაპუნების ტიპის პარამეტრების არე"</string>
     <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"მარცხენა დაწკაპუნება"</string>
+    <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"მარჯვენა დაწკაპუნება"</string>
+    <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"ორმაგი დაწკაპუნება"</string>
+    <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"ჩავლება"</string>
+    <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"გადაადგილება"</string>
     <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"პაუზა"</string>
     <string name="accessibility_autoclick_position" msgid="2933660969907663545">"პოზიცია"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> მოთავსდა კალათაში „შეზღუდული“"</string>
@@ -2526,12 +2527,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"აპლიკაციები"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"თქვენი თითის ანაბეჭდის ამოცნობა ვეღარ ხერხდება. ხელახლა დააყენეთ ანაბეჭდით განბლოკვა."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB მოწყობილობა ჩართულია, როდესაც ჩაკეტილია"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB მოწყობილობა ჩართულია, როდესაც Android ჩაკეტილია. მოწყობილობის გამოსაყენებლად ჯერ განბლოკეთ Android და შემდეგ ხელახლა ჩადეთ USB მოწყობილობა მის გამოსაყენებლად."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"საეჭვო USB აქტივობა"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB მონაცემთა სიგნალი გამორთულია."</string>
 </resources>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index 6655e5d..70412be 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Босату"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> босату"</string>
     <string name="app_info" msgid="6113278084877079851">"Қолданба ақпараты"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Тікелей бөлісу опциялары"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Қолданба ұсыныстары"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Қолданбалар тізімі"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Демо нұсқасы іске қосылуда..."</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Құрылғы бастапқы күйге қайтарылуда..."</string>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Сол жақ Dpad түймесі"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Оң жақ Dpad түймесі"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Ортаңғы Dpad түймесі"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Автоматты басу түрі параметрлері панелі"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Сол жағын басу"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Кідірту"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Орналастыру"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ШЕКТЕЛГЕН себетке салынды."</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"сурет жіберілді"</string>
@@ -2266,7 +2267,7 @@
     <string name="resolver_work_tab" msgid="2690019516263167035">"Жұмыс"</string>
     <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Жеке көру"</string>
     <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Жұмыс деректерін көру"</string>
-    <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Әкімшіңіз бөгеген"</string>
+    <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Әкімшіңіз блоктаған"</string>
     <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Бұл контентті жұмыс қолданбаларымен бөлісу мүмкін емес."</string>
     <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Бұл контентті жұмыс қолданбаларымен ашу мүмкін емес."</string>
     <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Бұл контентті жеке қолданбалармен бөлісу мүмкін емес."</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Қолданбалар"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Саусағыңыздың іздері бұдан былай танылмайды. Саусақ ізімен ашу функциясын қайта реттеу"</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB құрылғысы құлыптаулы кезде жалғанған"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB құрылғысы Android құрылғысы құлыптаулы кезде жалғанған. Құрылғыны пайдалану үшін алдымен Android құрылғысының құлпын ашып, содан кейін USB құрылғысын қайта енгізіңіз."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"USB-ге қатысты күдікті әрекет"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB дерек сигналы өшірілді."</string>
 </resources>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index 3d78797..fdd522b 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"មិនខ្ទាស់"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"ដកខ្ទាស់ <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"ព័ត៌មាន​កម្មវិធី"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"គោលដៅចែករំលែកដោយផ្ទាល់"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"ការណែនាំកម្មវិធី"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"បញ្ជីកម្មវិធី"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"កំពុងចាប់ផ្តើមការបង្ហាញសាកល្បង…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"កំពុងកំណត់ឧបករណ៍ឡើងវិញ…"</string>
@@ -2250,6 +2247,10 @@
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad កណ្ដាល"</string>
     <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"ផ្ទាំងការកំណត់ប្រភេទចុចស្វ័យប្រវត្តិ"</string>
     <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"ចុចម៉ៅស៍ខាងឆ្វេង"</string>
+    <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"ចុចម៉ៅស៍ខាងស្ដាំ"</string>
+    <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"ចុចពីរដង"</string>
+    <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"អូស"</string>
+    <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"រំកិល"</string>
     <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"ផ្អាក"</string>
     <string name="accessibility_autoclick_position" msgid="2933660969907663545">"ទីតាំង"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ត្រូវបានដាក់​ទៅក្នុងធុង​ដែលបានដាក់កំហិត"</string>
@@ -2526,12 +2527,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"ផែនទី"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"កម្មវិធី"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"លែងអាចសម្គាល់ស្នាមម្រាមដៃរបស់អ្នកបានទៀតហើយ។ សូមរៀបចំការដោះសោ​ដោយស្កេន​ស្នាមម្រាមដៃម្ដងទៀត។"</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"បានដោតឧបករណ៍ USB នៅពេលជាប់សោ"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"ឧបករណ៍ USB ត្រូវបានដោត នៅពេល Android ត្រូវបានចាក់សោ។ ដើម្បីប្រើឧបករណ៍ សូមដោះសោ Android ជាមុនសិន បន្ទាប់មកដោតឧបករណ៍ USB ឡើងវិញ ដើម្បីប្រើប្រាស់វា។"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"សកម្មភាព USB ដែលគួរឱ្យសង្ស័យ"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"សញ្ញាទិន្នន័យ USB ត្រូវបានបិទ។"</string>
 </resources>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index 1d89ad7..887938c 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"ಅನ್‌ಪಿನ್"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> ಅನ್ನು ಅನ್‌ಪಿನ್ ಮಾಡಿ"</string>
     <string name="app_info" msgid="6113278084877079851">"ಆ್ಯಪ್ ಮಾಹಿತಿ"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"ನೇರ ಹಂಚಿಕೊಳ್ಳುವಿಕೆ ಟಾರ್ಗೆಟ್‌ಗಳು"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"ಆ್ಯಪ್ ಸಲಹೆಗಳು"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"ಆ್ಯಪ್ ಪಟ್ಟಿ"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"ಡೆಮೋ ಪ್ರಾರಂಭಿಸಲಾಗುತ್ತಿದೆ..."</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"ಸಾಧನ ಮರುಹೊಂದಿಸಲಾಗುತ್ತಿದೆ..."</string>
@@ -2248,14 +2245,14 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad ನ ಎಡಭಾಗದ ಬಟನ್"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad ನ ಬಲಭಾಗದ ಬಟನ್"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad ನ ಮಧ್ಯದ ಬಟನ್"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
-    <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
-    <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
-    <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
-    <skip />
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"ಆಟೋಕ್ಲಿಕ್ ಪ್ರಕಾರದ ಸೆಟ್ಟಿಂಗ್‌ಗಳ ಪ್ಯಾನೆಲ್"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"ಎಡ-ಕ್ಲಿಕ್"</string>
+    <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"ಬಲ-ಕ್ಲಿಕ್"</string>
+    <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"ಡಬಲ್‌ ಕ್ಲಿಕ್"</string>
+    <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"ಡ್ರ್ಯಾಗ್ ಮಾಡಿ"</string>
+    <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"ಸ್ಕ್ರಾಲ್ ಮಾಡಿ"</string>
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"ವಿರಾಮಗೊಳಿಸಿ"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"ಸ್ಥಾನ"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ಅನ್ನು ನಿರ್ಬಂಧಿತ ಬಕೆಟ್‌ಗೆ ಹಾಕಲಾಗಿದೆ"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ಚಿತ್ರವನ್ನು ಕಳುಹಿಸಲಾಗಿದೆ"</string>
@@ -2530,12 +2527,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"ಆ್ಯಪ್‌ಗಳು"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"ನಿಮ್ಮ ಫಿಂಗರ್‌ಪ್ರಿಂಟ್‌ಗಳನ್ನು ಇನ್ನು ಮುಂದೆ ಗುರುತಿಸಲಾಗುವುದಿಲ್ಲ. ಫಿಂಗರ್‌ಪ್ರಿಂಟ್ ಅನ್‌ಲಾಕ್ ಅನ್ನು ಮತ್ತೊಮ್ಮೆ ಸೆಟಪ್ ಮಾಡಿ."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"ಲಾಕ್ ಆಗಿರುವಾಗ USB ಸಾಧನವನ್ನು ಪ್ಲಗ್-ಇನ್ ಮಾಡಲಾಗುತ್ತದೆ"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Android ಲಾಕ್ ಆಗಿರುವಾಗ USB ಸಾಧನವನ್ನು ಪ್ಲಗ್-ಇನ್ ಮಾಡಲಾಗುತ್ತದೆ. ಸಾಧನವನ್ನು ಬಳಸಲು, ಮೊದಲು Android ಅನ್ನು ಅನ್‌ಲಾಕ್ ಮಾಡಿ ಮತ್ತು ನಂತರ ಅದನ್ನು ಬಳಸಲು USB ಸಾಧನವನ್ನು ಪುನಃ ಸೇರಿಸಿ."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"ಅನುಮಾನಾಸ್ಪದ USB ಚಟುವಟಿಕೆ"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB ಡೇಟಾ ಸಿಗ್ನಲ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ."</string>
 </resources>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index ad1bdae..fc39271 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"고정 해제"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> 고정 해제"</string>
     <string name="app_info" msgid="6113278084877079851">"앱 정보"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"직접 공유 타겟"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"앱 제안"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"앱 목록"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"데모 시작 중..."</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"기기 초기화 중..."</string>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"방향 패드 왼쪽"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"방향 패드 오른쪽"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"방향 패드 가운데"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"자동 클릭 유형 설정 패널"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"왼쪽 클릭"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"일시중지"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"위치"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> 항목이 RESTRICTED 버킷으로 이동함"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"이미지 보냄"</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"지도"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"애플리케이션"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"지문을 더 이상 인식할 수 없습니다. 지문 잠금 해제를 다시 설정하세요."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"잠금 상태에서 USB 기기가 연결됨"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Android가 잠겨 있는 상태에서 USB 기기가 연결되었습니다. 기기를 사용하려면 먼저 Android를 잠금 해제한 다음 USB 기기를 다시 삽입하세요."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"의심스러운 USB 활동"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB 데이터 신호가 사용 중지됨"</string>
 </resources>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index cb4edb9..f8c0022 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Кадоодон алып коюу"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> бошотуу"</string>
     <string name="app_info" msgid="6113278084877079851">"Колдонмо тууралуу"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Түздөн-түз бөлүшүлгөндөрдү алуучулар"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Сунушталган колдонмолор"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Колдонмолордун тизмеси"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Демо режим башталууда…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Түзмөк баштапкы абалга келтирилүүдө…"</string>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad\'дын сол баскычы"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad\'дын оң баскычы"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad\'дын ортоңку баскычы"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Авточыкылдатуу түрүнүн параметрлеринин панели"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Сол баскычын чыкылдатуу"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Тындыруу"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Орду"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ЧЕКТЕЛГЕН чакага коюлган"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"сүрөт жөнөттү"</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Карталар"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Колдонмолор"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Манжаңыздын изи мындан ары таанылбайт. Манжа изи менен ачуу функциясын кайрадан тууралаңыз."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB түзмөк Android кулпуланып турганда туташтырылды"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB түзмөк Android кулпуланганда туташтырылды. Түзмөктү колдонуу үчүн алгач Android\'дин кулпусун ачып, USB түзмөктү кайрадан сайыңыз."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"USB\'ге байланыштуу шектүү аракет"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB сигналы өчүрүлдү."</string>
 </resources>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index 4b426c8..429f3f7 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"ຖອນປັກໝຸດ"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"ຖອດປັກມຸດ <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"ຂໍ້ມູນແອັບ"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"ເປົ້າໝາຍການແບ່ງປັນໂດຍກົງ"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"ການແນະນຳແອັບ"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"ລາຍຊື່ແອັບ"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"ກຳລັງເລີ່ມເດໂມ…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"ກຳລັງຣີເຊັດອຸປະກອນ…"</string>
@@ -2250,6 +2247,10 @@
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad ກາງ"</string>
     <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"ແຜງການຕັ້ງຄ່າປະເພດການຄລິກອັດຕະໂນມັດ"</string>
     <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"ຄລິກຊ້າຍ"</string>
+    <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"ຄລິກຂວາ"</string>
+    <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"ຄລິກສອງເທື່ອ"</string>
+    <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"ລາກ"</string>
+    <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"ເລື່ອນ"</string>
     <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"ຢຸດຊົ່ວຄາວ"</string>
     <string name="accessibility_autoclick_position" msgid="2933660969907663545">"ຕຳແໜ່ງ"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ຖືກວາງໄວ້ໃນກະຕ່າ \"ຈຳກັດ\" ແລ້ວ"</string>
@@ -2526,12 +2527,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"ແຜນທີ່"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"ແອັບພລິເຄຊັນ"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"ລະບົບບໍ່ສາມາດຈຳແນກລາຍນິ້ວມືຂອງທ່ານໄດ້ອີກຕໍ່ໄປ. ກະລຸນາຕັ້ງຄ່າການປົດລັອກດ້ວຍລາຍນິ້ວມືອີກຄັ້ງ."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"ທ່ານສຽບອຸປະກອນ USB ໃນຂະນະທີ່ລັອກຢູ່"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"ທ່ານສຽບອຸປະກອນ USB ໃນຂະນະທີ່ Android ລັອກຢູ່. ເພື່ອໃຊ້ອຸປະກອນ, ກະລຸນາປົດລັອກ Android ກ່ອນແລ້ວຈຶ່ງສຽບອຸປະກອນ USB ອີກຄັ້ງເພື່ອນຳໃຊ້."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"ການເຄື່ອນໄຫວຂອງ USB ທີ່ໜ້າສົງໄສ"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"ສັນຍານຂໍ້ມູນຂອງ USB ຖືກປິດການນຳໃຊ້."</string>
 </resources>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 544cd41..3ca681b 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -2090,12 +2090,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Atsegti"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Atsegti <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Programos informacija"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Tiesioginio bendrinimo paskirties vietos"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Siūlomos programos"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Programų sąrašas"</string>
     <string name="negative_duration" msgid="1938335096972945232">"–<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Paleidžiama demonstracinė versija…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Įrenginys nustatomas iš naujo…"</string>
@@ -2250,14 +2247,14 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Valdymo pultas – kairėn"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Valdymo pultas – dešinėn"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Valdymo pultas – centras"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
-    <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
-    <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
-    <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
-    <skip />
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Automatinio paspaudimo tipo nustatymų skydelis"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Spustelėti kairiuoju klavišu"</string>
+    <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"Spustelėti dešiniuoju klavišu"</string>
+    <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"Dukart spustelėti"</string>
+    <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"Vilkti"</string>
+    <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"Slinkti"</string>
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pristabdyti"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Pozicija"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"„<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>“ įkeltas į grupę APRIBOTA"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"išsiuntė vaizdą"</string>
@@ -2532,12 +2529,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Žemėlapiai"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Programos"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Nebegalima atpažinti jūsų piršto atspaudų. Dar kartą nustatykite atrakinimą piršto atspaudu."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB įrenginys prijungtas, kai užrakintas"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB įrenginys prijungtas, kai „Android“ užrakintas. Jei norite naudoti įrenginį, pirmiausia atrakinkite „Android“, tada vėl įkiškite USB įrenginį, kad galėtumėte jį naudoti."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Įtartina USB veikla"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB duomenų signalas išjungtas."</string>
 </resources>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 02e9339..1e7ffd1 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -2089,12 +2089,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Atspraust"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Atspraust lietotni <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Lietotnes informācija"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Tiešās kopīgošanas adresāti"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Ieteicamās lietotnes"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Lietotņu saraksts"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Notiek demonstrācijas palaišana..."</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Notiek ierīces atiestatīšana..."</string>
@@ -2249,14 +2246,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Virzienu slēdzis — pa kreisi"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Virzienu slēdzis — pa labi"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Virzienu slēdzis — centrs"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Automātiskās klikšķināšanas veida iestatījumu panelis"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Noklikšķināt ar peles kreiso pogu"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pārtraukt"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Pozīcija"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Pakotne “<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>” ir ievietota ierobežotā kopā."</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"nosūtīts attēls"</string>
@@ -2531,12 +2532,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Lietojumprogrammas"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Jūsu pirkstu nospiedumus vairs nevar atpazīt. Vēlreiz iestatiet autorizāciju ar pirksta nospiedumu."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB ierīce tika pievienota, kad Android ierīce bija bloķēta"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB ierīce tika pievienota, kad Android ierīce bija bloķēta. Lai izmantotu ierīci, vispirms atbloķējiet Android ierīci un pēc tam atkārtoti pievienojiet USB ierīci."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Aizdomīgas darbības ar USB"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB datu signāls ir atspējots."</string>
 </resources>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index df101f2..c1a7c1d 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Откачете"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Откачи <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Информации за апликација"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Директни цели на споделување"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Предлози за апликации"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Список со апликации"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Се вклучува демонстрацијата…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Се ресетира уредот…"</string>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Навигациско копче за налево"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Навигациско копче за надесно"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Навигациско копче за средина"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Табла со поставки за вид автоматско кликнување"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Кликни со лево копче"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Паузирај"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Позиционирај"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> е ставен во корпата ОГРАНИЧЕНИ"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"испрати слика"</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Карти"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Апликации"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Вашите отпечатоци веќе не може да се препознаат. Поставете „Отклучување со отпечаток“ повторно."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB-уредот е приклучен кога е заклучен"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB-уредот е приклучен кога Android е заклучен. За да го користите уредот, прво отклучете го Android, па вметнете го USB-уредот повторно за да го користите."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Сомнителна активност на USB-уредот"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Сигналот со податоци преку USB е оневозможен."</string>
 </resources>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index b5ded52..5c31433 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"അൺപിൻ ചെയ്യുക"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> അൺപിൻ ചെയ്യുക"</string>
     <string name="app_info" msgid="6113278084877079851">"ആപ്പ് വിവരം"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"നേരിട്ടുള്ള പങ്കിടൽ ടാർഗറ്റുകൾ"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"ആപ്പ് നിർദ്ദേശങ്ങൾ"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"ആപ്പ് ലിസ്റ്റ്"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"ഡെമോ ആരംഭിക്കുന്നു…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"ഉപകരണം പുനക്രമീകരിക്കുന്നു…"</string>
@@ -2250,6 +2247,10 @@
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad സെന്റർ"</string>
     <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"ഓട്ടോക്ലിക്ക് തരം ക്രമീകരണ പാനല്‍"</string>
     <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"ഇടത് ക്ലിക്ക്"</string>
+    <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"വലത്-ക്ലിക്ക്"</string>
+    <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"ഡബിൾ ക്ലിക്ക്"</string>
+    <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"വലിച്ചിടുക"</string>
+    <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"സ്‌ക്രോൾ ചെയ്യുക"</string>
     <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"താൽക്കാലികമായി നിർത്തുക"</string>
     <string name="accessibility_autoclick_position" msgid="2933660969907663545">"സ്ഥാനം"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> നിയന്ത്രിത ബക്കറ്റിലേക്ക് നീക്കി"</string>
@@ -2526,12 +2527,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"ആപ്പുകൾ"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"നിങ്ങളുടെ ഫിംഗർപ്രിന്റുകൾ ഇനി തിരിച്ചറിയാനാകില്ല. ഫിംഗർപ്രിന്റ് അൺലോക്ക് വീണ്ടും സജ്ജീകരിക്കുക."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"ലോക്കായിരിക്കുമ്പോഴാണ് USB ഉപകരണം പ്ലഗ്-ഇൻ ചെയ്തത്"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Android ലോക്കായിരിക്കുമ്പോഴാണ് USB ഉപകരണം പ്ലഗ്-ഇൻ ചെയ്തത്. ഉപകരണം ഉപയോഗിക്കാൻ ആദ്യം Android അൺലോക്ക് ചെയ്യുക, ശേഷം USB ഉപകരണം വീണ്ടും ഇൻസേർട്ട് ചെയ്ത് ഉപയോഗിക്കുക."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"സംശയാസ്പദമായ USB ആക്റ്റിവിറ്റി"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB ഡാറ്റാ സിഗ്‌നൽ പ്രവർത്തനരഹിതമാക്കി."</string>
 </resources>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index a61bd7f..24637fa 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Unpin"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g>-г тогтоосныг болиулах"</string>
     <string name="app_info" msgid="6113278084877079851">"Аппын мэдээлэл"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Шууд хуваалцах сонголтууд"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Санал болгож буй аппууд"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Аппын жагсаалт"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Жишээг эхлүүлж байна…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Төхөөрөмжийг шинэчилж байна…"</string>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad зүүн"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad баруун"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad гол"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Автомат товшилтын төрлийн тохиргооны түр зуурын самбар"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Зүүн талыг товших"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Түр зогсоох"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Байрлал"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>-г ХЯЗГААРЛАСАН сагс руу орууллаа"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"зураг илгээсэн"</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Газрын зураг"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Аппликэйшн"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Таны хурууны хээг цаашид таних боломжгүй. Хурууны хээгээр түгжээ тайлахыг дахин тохируулна уу."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Түгжээтэй үед USB төхөөрөмж залгаатай байна"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Android-г түгжсэн үед USB төхөөрөмж залгаатай байна. Төхөөрөмжийг ашиглахын тулд эхлээд Android-н түгжээг тайлж, дараа нь USB төхөөрөмжийг ашиглахын тулд дахин оруулна уу."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"USB-н сэжигтэй үйл ажиллагаа"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB-н өгөгдлийн дохиог идэвхгүй болгосон."</string>
 </resources>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index 3f2e57f5..0717eb9 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"अनपिन करा"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> ला अनपिन करा"</string>
     <string name="app_info" msgid="6113278084877079851">"अ‍ॅप माहिती"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"थेट शेअर करण्यासंबंधी लक्ष्ये"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"अ‍ॅप सूचना"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"अ‍ॅप सूची"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"डेमो सुरू करत आहे..."</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"डिव्हाइस रीसेट करत आहे..."</string>
@@ -2248,14 +2245,14 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad डावीकडील"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad चे उजवीकडील"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad चे मधले"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
-    <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
-    <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
-    <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
-    <skip />
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"ऑटोक्लिक प्रकाराचे सेटिंग्ज पॅनल"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"लेफ्ट क्लिक करा"</string>
+    <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"राइट क्लिक करा"</string>
+    <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"डबल क्लिक करा"</string>
+    <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"ड्रॅग करा"</string>
+    <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"स्क्रोल करा"</string>
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"थांबवा"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"स्थिती"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> हे प्रतिबंधित बादलीमध्ये ठेवण्यात आले आहे"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"इमेज पाठवली आहे"</string>
@@ -2530,12 +2527,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"अ‍ॅप्लिकेशन"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"तुमची फिंगरप्रिंट यापुढे ओळखता येणार नाहीत. फिंगरप्रिंट अनलॉक पुन्हा सेट करा."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"लॉक केलेले असताना USB डिव्हाइस प्लग इन केले आहे"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Android लॉक केलेले असताना USB डिव्हाइस प्लग इन केले आहे. डिव्हाइस वापरण्यासाठी, कृपया सर्वप्रथम Android अनलॉक करा आणि त्यानंतर USB डिव्हाइस वापरण्यासाठी ते पुन्हा घाला."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"संशयास्पद USB ॲक्टिव्हिटी"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB डेटा सिग्नल बंद करण्यात आला आहे."</string>
 </resources>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index f9aeec4..5cac65d 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Nyahsemat"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Nyahsemat <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Maklumat apl"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Sasaran perkongsian langsung"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Cadangan apl"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Senarai apl"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Memulakan tunjuk cara…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Menetapkan semula peranti…"</string>
@@ -2250,6 +2247,10 @@
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad Tengah"</string>
     <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Panel tetapan jenis autoklik"</string>
     <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Klik kiri"</string>
+    <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"Klik kanan"</string>
+    <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"Klik dua kali"</string>
+    <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"Seret"</string>
+    <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"Tatal"</string>
     <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Jeda"</string>
     <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Kedudukan"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> telah diletakkan dalam baldi TERHAD"</string>
@@ -2526,12 +2527,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplikasi"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Cap jari anda tidak dapat dicam lagi. Sediakan semula Buka Kunci Cap Jari."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Peranti USB dipalamkan apabila dikunci"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Peranti USB dipalamkan apabila Android dikunci. Untuk menggunakan peranti, sila buka kunci Android dahulu, kemudian masukkan semula peranti USB untuk menggunakan peranti itu."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Aktiviti USB yang mencurigakan"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Isyarat data USB telah dilumpuhkan."</string>
 </resources>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index 293b316..10bcd1b 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"ဖြုတ်ပါ"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> ကို ပင်ဖြုတ်ရန်"</string>
     <string name="app_info" msgid="6113278084877079851">"အက်ပ်အချက်အလက်"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"တိုက်ရိုက်မျှဝေသည့် ပစ်မှတ်များ"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"အက်ပ်အကြံပြုချက်များ"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"အက်ပ်စာရင်း"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"သရုပ်ပြချက်ကို စတင်နေသည်…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"စက်ပစ္စည်းကို ပြန်လည်သတ်မှတ်နေသည်…"</string>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad ဘယ်"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad ညာ"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad အလယ်"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"အော်တိုနှိပ်ခြင်း အမျိုးအစား ဆက်တင်အကန့်"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"ဘယ်ကလစ်"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"ခဏရပ်ရန်"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"နေရာ"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ကို တားမြစ်ထားသော သိမ်းဆည်းမှုအတွင်းသို့ ထည့်ပြီးပါပြီ"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>-"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ပုံပို့ထားသည်"</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"အပလီကေးရှင်းများ"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"သင့်လက်ဗွေများကို မသိရှိနိုင်တော့ပါ။ ‘လက်ဗွေသုံး လော့ခ်ဖွင့်ခြင်း’ ထပ်မံစနစ်ထည့်သွင်းပါ။"</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"လော့ခ်ချထားချိန်တွင် USB စက်ကို ပလတ်တပ်ထားခြင်း"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Android လော့ခ်ချထားချိန်တွင် USB စက်ကို ပလတ်တပ်ထားသည်။ စက်သုံးရန်အတွက် Android ကို အရင်ဖွင့်ပြီး USB စက်ပြန်ထည့်ကာ သုံးပါ။"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"သံသယဖြစ်ဖွယ် USB လုပ်ဆောင်ချက်"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB ဒေတာအချက်ပြမှုကို ပိတ်လိုက်ပါပြီ။"</string>
 </resources>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index a79ff1e..800f118 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Løsne"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Løsne <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Info om appen"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Direkte delingsmål"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Appforslag"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Appliste"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Starter demo …"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Tilbakestiller enheten …"</string>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Venstre på styrepilene"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Høyre på styrepilene"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Midt på styrepilene"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Innstillingspanel for type autoklikk"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Venstreklikk"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Sett på pause"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Plassér"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> er blitt plassert i TILGANGSBEGRENSET-toppmappen"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"har sendt et bilde"</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Apper"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Fingeravtrykkene dine kan ikke gjenkjennes lenger. Konfigurer opplåsing med fingeravtrykk på nytt."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB-enheten er koblet til når den er låst"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB-enheten er koblet til når Android er låst. Før du kan bruke enheten, må du låse opp Android og så sette inn USB-enheten på nytt."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Mistenkelig USB-aktivitet"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB-datasignalet er slått av."</string>
 </resources>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index 3f24b27..ce0c67e 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -351,7 +351,7 @@
     <string name="permgroupdesc_phone" msgid="270048070781478204">"फोन कलहरू गर्नुहोस् र व्यवस्थापन गर्नुहोस्"</string>
     <string name="permgrouplab_sensors" msgid="9134046949784064495">"बडी सेन्सरहरू"</string>
     <string name="permgroupdesc_sensors" msgid="2610631290633747752">"तपाईंको महत्त्वपूर्ण संकेत बारे सेन्सर डेटा पहुँच गर्नुहोस्"</string>
-    <string name="permgrouplab_notifications" msgid="5472972361980668884">"सूचनाहरू"</string>
+    <string name="permgrouplab_notifications" msgid="5472972361980668884">"नोटिफिकेसनहरू"</string>
     <string name="permgroupdesc_notifications" msgid="4608679556801506580">"सूचनाहरू देखाउनुहोस्"</string>
     <string name="capability_title_canRetrieveWindowContent" msgid="7554282892101587296">"विन्डो सामग्रीको पुनःबहाली गर्नुहोस्।"</string>
     <string name="capability_desc_canRetrieveWindowContent" msgid="6195610527625237661">"तपाईँको अन्तरक्रिया भइरहेको विन्डोको सामग्रीको निरीक्षण गर्नुहोस्।"</string>
@@ -877,7 +877,7 @@
     <string name="policylab_disableKeyguardFeatures" msgid="5071855750149949741">"स्क्रिन लकका केही सुविधा असक्षम पार्ने"</string>
     <string name="policydesc_disableKeyguardFeatures" msgid="6641673177041195957">"स्क्रिन लकका केही सुविधाहरूको प्रयोगमा रोक लगाउन।"</string>
   <string-array name="phoneTypes">
-    <item msgid="8996339953292723951">"गृह"</item>
+    <item msgid="8996339953292723951">"घर"</item>
     <item msgid="7740243458912727194">"मोबाइल"</item>
     <item msgid="8526146065496663766">"काम गर्नुहोस्"</item>
     <item msgid="8150904584178569699">"कार्य फ्याक्स"</item>
@@ -887,19 +887,19 @@
     <item msgid="6216981255272016212">" कस्टम"</item>
   </string-array>
   <string-array name="emailAddressTypes">
-    <item msgid="7786349763648997741">"गृह"</item>
+    <item msgid="7786349763648997741">"घर"</item>
     <item msgid="435564470865989199">"काम"</item>
     <item msgid="4199433197875490373">"अन्य"</item>
     <item msgid="3233938986670468328">" कस्टम"</item>
   </string-array>
   <string-array name="postalAddressTypes">
-    <item msgid="3861463339764243038">"गृह"</item>
+    <item msgid="3861463339764243038">"घर"</item>
     <item msgid="5472578890164979109">"काम"</item>
     <item msgid="5718921296646594739">"अन्य"</item>
     <item msgid="5523122236731783179">" कस्टम"</item>
   </string-array>
   <string-array name="imAddressTypes">
-    <item msgid="588088543406993772">"गृह"</item>
+    <item msgid="588088543406993772">"घर"</item>
     <item msgid="5503060422020476757">"काम"</item>
     <item msgid="2530391194653760297">"अन्य"</item>
     <item msgid="7640927178025203330">" कस्टम"</item>
@@ -920,7 +920,7 @@
     <item msgid="8293711853624033835">"Jabber"</item>
   </string-array>
     <string name="phoneTypeCustom" msgid="5120365721260686814">" कस्टम"</string>
-    <string name="phoneTypeHome" msgid="3880132427643623588">"गृह"</string>
+    <string name="phoneTypeHome" msgid="3880132427643623588">"घर"</string>
     <string name="phoneTypeMobile" msgid="1178852541462086735">"मोबाइल"</string>
     <string name="phoneTypeWork" msgid="6604967163358864607">"काम"</string>
     <string name="phoneTypeFaxWork" msgid="6757519896109439123">"कार्य फ्याक्स"</string>
@@ -945,16 +945,16 @@
     <string name="eventTypeAnniversary" msgid="4684702412407916888">"वार्षिक समारोह"</string>
     <string name="eventTypeOther" msgid="530671238533887997">"अन्य"</string>
     <string name="emailTypeCustom" msgid="1809435350482181786">" कस्टम"</string>
-    <string name="emailTypeHome" msgid="1597116303154775999">"गृह"</string>
+    <string name="emailTypeHome" msgid="1597116303154775999">"घर"</string>
     <string name="emailTypeWork" msgid="2020095414401882111">"काम"</string>
     <string name="emailTypeOther" msgid="5131130857030897465">"अन्य"</string>
     <string name="emailTypeMobile" msgid="787155077375364230">"मोबाइल"</string>
     <string name="postalTypeCustom" msgid="5645590470242939129">" कस्टम"</string>
-    <string name="postalTypeHome" msgid="7562272480949727912">"गृह"</string>
+    <string name="postalTypeHome" msgid="7562272480949727912">"घर"</string>
     <string name="postalTypeWork" msgid="8553425424652012826">"काम"</string>
     <string name="postalTypeOther" msgid="7094245413678857420">"अन्य"</string>
     <string name="imTypeCustom" msgid="5653384545085765570">" कस्टम"</string>
-    <string name="imTypeHome" msgid="6996507981044278216">"गृह"</string>
+    <string name="imTypeHome" msgid="6996507981044278216">"घर"</string>
     <string name="imTypeWork" msgid="2099668940169903123">"काम"</string>
     <string name="imTypeOther" msgid="8068447383276219810">"अन्य"</string>
     <string name="imProtocolCustom" msgid="4437878287653764692">" कस्टम"</string>
@@ -986,7 +986,7 @@
     <string name="relationTypeSister" msgid="3721676005094140671">"बहिनी"</string>
     <string name="relationTypeSpouse" msgid="6916682664436031703">"पति-पत्नी"</string>
     <string name="sipAddressTypeCustom" msgid="6283889809842649336">" कस्टम"</string>
-    <string name="sipAddressTypeHome" msgid="5918441930656878367">"गृह"</string>
+    <string name="sipAddressTypeHome" msgid="5918441930656878367">"घर"</string>
     <string name="sipAddressTypeWork" msgid="7873967986701216770">"काम गर्नुहोस्"</string>
     <string name="sipAddressTypeOther" msgid="6317012577345187275">"अन्य"</string>
     <string name="quick_contacts_not_available" msgid="1262709196045052223">"यो सम्पर्क हेर्न कुनै पनि एप फेला परेन।"</string>
@@ -1408,7 +1408,7 @@
     <string name="install_carrier_app_notification_button" msgid="6257740533102594290">"एप डाउनलोड गर्नुहोस्"</string>
     <string name="carrier_app_notification_title" msgid="5815477368072060250">"नयाँ SIM घुसाइयो"</string>
     <string name="carrier_app_notification_text" msgid="6567057546341958637">"यसलाई सेटअप गर्न ट्याप गर्नुहोस्"</string>
-    <string name="time_zone_change_notification_title" msgid="5232503069219193218">"तपाईंको प्रामाणिक समय परिवर्तन गरिएको छ"</string>
+    <string name="time_zone_change_notification_title" msgid="5232503069219193218">"तपाईंको प्रामाणिक समय परिवर्तन भएको छ"</string>
     <string name="time_zone_change_notification_body" msgid="6135793674904665585">"तपाईं अहिले <xliff:g id="TIME_ZONE_DISPLAY_NAME">%1$s</xliff:g> (<xliff:g id="TIME_ZONE_OFFSET">%2$s</xliff:g>) मा हुनुहुन्छ"</string>
     <string name="time_picker_dialog_title" msgid="9053376764985220821">"समय मिलाउनुहोस्"</string>
     <string name="date_picker_dialog_title" msgid="5030520449243071926">"मिति मिलाउनुहोस्"</string>
@@ -1758,7 +1758,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>
@@ -2188,12 +2188,12 @@
     <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"यस सूचनालाई कम महत्त्वपूर्ण ठानी यसका लागि साइलेन्ट मोड सेट गरिएको छ। प्रतिक्रिया दिन ट्याप गर्नुहोस्।"</string>
     <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"यस सूचनालाई धेरै महत्त्वपूर्ण सूचनाका रूपमा सेट गरिएको छ। प्रतिक्रिया दिन ट्याप गर्नुहोस्।"</string>
     <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"यस सूचनालाई कम महत्त्वपूर्ण सूचनाका रूपमा सेट गरिएको छ। प्रतिक्रिया दिन ट्याप गर्नुहोस्।"</string>
-    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"परिष्कृत सूचनाहरू"</string>
-    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"अब परिष्कृत सूचनाहरू नामक सुविधाले कारबाही तथा जवाफहरूसम्बन्धी सुझाव देखाउँछ। Android को एड्याप्टिभ सूचनाहरू नामक सुविधाले अब उप्रान्त काम गर्दैन।"</string>
+    <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"परिष्कृत नोटिफिकेसनहरू"</string>
+    <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"अब परिष्कृत नोटिफिकेसनहरू नामक सुविधाले कारबाही तथा जवाफहरूसम्बन्धी सुझाव देखाउँछ। Android को एड्याप्टिभ नोटिफिकेसनहरू नामक सुविधाले अब उप्रान्त काम गर्दैन।"</string>
     <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"ठिक छ"</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 १२ मा Android को एड्याप्टिभ सूचनाहरू नामक सुविधालाई परिष्कृत सूचनाहरू नामक सुविधाले प्रतिस्थापन गरेको छ। यो सुविधाले कारबाही तथा जवाफसम्बन्धी सुझाव देखाउँछ र तपाईंका सूचनाहरू व्यवस्थित गर्छ।\n\nपरिष्कृत सूचनाहरू नामक सुविधाले सूचनामा उल्लिखित सम्पर्क व्यक्तिको नाम र म्यासेज जस्ता व्यक्तिगत जानकारीलगायतका सामग्री हेर्न तथा प्रयोग गर्न सक्छ। यो सुविधाले फोन उठाउने तथा \'बाधा नपुऱ्याउनुहोस्\' मोड नियन्त्रण गर्ने कार्यसहित सूचनाहरू हटाउने वा सूचनाहरूको जवाफ दिने कार्य पनि गर्न सक्छ।"</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Android १२ मा Android को एड्याप्टिभ नोटिफिकेसनहरू नामक सुविधालाई परिष्कृत नोटिफिकेसनहरू नामक सुविधाले प्रतिस्थापन गरेको छ। यो सुविधाले कारबाही तथा जवाफसम्बन्धी सुझाव देखाउँछ र तपाईंका नोटिफिकेसनहरू व्यवस्थित गर्छ।\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>
@@ -2231,7 +2231,7 @@
     <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"होम"</string>
     <string name="accessibility_system_action_back_label" msgid="4205361367345537608">"पछाडि फर्कनुहोस्"</string>
     <string name="accessibility_system_action_recents_label" msgid="4782875610281649728">"हालसालैका एपहरू"</string>
-    <string name="accessibility_system_action_notifications_label" msgid="6083767351772162010">"सूचनाहरू"</string>
+    <string name="accessibility_system_action_notifications_label" msgid="6083767351772162010">"नोटिफिकेसनहरू"</string>
     <string name="accessibility_system_action_quick_settings_label" msgid="4583900123506773783">"द्रुत सेटिङहरू"</string>
     <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"पावर संवाद"</string>
     <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"लक स्क्रिन"</string>
@@ -2248,14 +2248,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad को बायाँको बटन"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad को दायाँको बटन"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad को बिचको बटन"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"अटोक्लिकको प्रकारसम्बन्धी सेटिङको प्यानल"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"बायाँ क्लिक गर्नुहोस्"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"पज गर्नुहोस्"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"स्थिति"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> लाई प्रतिबन्धित बाल्टीमा राखियो"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"फोटो पठाइयो"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 38bcffa..3466641 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Losmaken"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> losmaken"</string>
     <string name="app_info" msgid="6113278084877079851">"App-info"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Doelen voor direct delen"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"App-suggesties"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"App-lijst"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Demo starten…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Apparaat resetten…"</string>
@@ -2250,6 +2247,10 @@
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"D-pad midden"</string>
     <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Deelvenster met instellingen voor het type automatisch klikken"</string>
     <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Klikken met de linkermuisknop"</string>
+    <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"Klikken met de rechtermuisknop"</string>
+    <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"Dubbelklikken"</string>
+    <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"Slepen"</string>
+    <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"Scrollen"</string>
     <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pauzeren"</string>
     <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Positie"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> is in de bucket RESTRICTED geplaatst"</string>
@@ -2526,12 +2527,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Kaarten"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Apps"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Je vingerafdrukken worden niet meer herkend. Stel Ontgrendelen met vingerafdruk opnieuw in."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB-apparaat aangesloten terwijl vergrendeld"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Het USB-apparaat is aangesloten terwijl Android is vergrendeld. Als je het apparaat wilt gebruiken, ontgrendel je eerst Android en plaats je het USB-apparaat opnieuw om het te gebruiken."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Verdachte USB-activiteit"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB-gegevenssignaal is uitgezet."</string>
 </resources>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index e99010f..418231f 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -2042,7 +2042,7 @@
     <string name="app_suspended_title" msgid="888873445010322650">"ଆପ୍‌ ଉପଲବ୍ଧ ନାହିଁ"</string>
     <string name="app_suspended_default_message" msgid="6451215678552004172">"ବର୍ତ୍ତମାନ <xliff:g id="APP_NAME_0">%1$s</xliff:g> ଉପଲବ୍ଧ ନାହିଁ। ଏହା <xliff:g id="APP_NAME_1">%2$s</xliff:g> ଦ୍ଵାରା ପରିଚାଳିତ ହେଉଛି।"</string>
     <string name="app_suspended_more_details" msgid="211260942831587014">"ଅଧିକ ଜାଣନ୍ତୁ"</string>
-    <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"ଆପ୍ ଅନପଜ୍ କରନ୍ତୁ"</string>
+    <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"ଆପ ପୁଣି ଆରମ୍ଭ କରନ୍ତୁ"</string>
     <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>
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"ଅନପିନ୍ କରନ୍ତୁ"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g>ରେ ଅନ୍‌ପିନ୍ କରନ୍ତୁ"</string>
     <string name="app_info" msgid="6113278084877079851">"ଆପ୍‍ ସୂଚନା"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"ଡାଇରେକ୍ଟ ସେୟାର ଟାର୍ଗେଟ"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"ଆପ ପରାମର୍ଶ"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"ଆପ ତାଲିକା"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"ଡେମୋ ଆରମ୍ଭ କରାଯାଉଛି…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"ଡିଭାଇସ୍‍କୁ ରିସେଟ୍‍ କରାଯାଉଛି…"</string>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad ବାମ"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad ଡାହାଣ"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad କେନ୍ଦ୍ର"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"ଅଟୋକ୍ଲିକ ପ୍ରକାର ସେଟିଂସ ପେନେଲ"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"ବାମ ବଟନ କ୍ଲିକ କରନ୍ତୁ"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"ବିରତ କରନ୍ତୁ"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"ସ୍ଥିତି"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>କୁ ପ୍ରତିବନ୍ଧିତ ବକେଟରେ ରଖାଯାଇଛି"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ଏକ ଛବି ପଠାଯାଇଛି"</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"ଆପ୍ଲିକେସନ"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"ଆପଣଙ୍କ ଟିପଚିହ୍ନକୁ ଆଉ ଚିହ୍ନଟ କରାଯାଇପାରିବ ନାହିଁ। ଫିଙ୍ଗରପ୍ରିଣ୍ଟ ଅନଲକ ପୁଣି ସେଟ ଅପ କରନ୍ତୁ।"</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"ଲକ ଥିବା ସମୟରେ USB ଡିଭାଇସ ପ୍ଲଗ ଇନ ହୋଇଛି"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Android ଲକ ଥିବାବେଳେ USB ଡିଭାଇସ ପ୍ଲଗ ଇନ ହୋଇଥାଏ। ଡିଭାଇସ ବ୍ୟବହାର କରିବାକୁ, ଦୟାକରି ପ୍ରଥମେ Android ଅନଲକ କରନ୍ତୁ ଏବଂ ତାପରେ ଏହାକୁ ବ୍ୟବହାର କରିବାକୁ USB ଡିଭାଇସ ପୁଣି ଭର୍ତ୍ତି କରନ୍ତୁ।"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"ସନ୍ଦେହଜନକ USB କାର୍ଯ୍ୟକଳାପ"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB ଡାଟା ସିଗନାଲକୁ ଅକ୍ଷମ କରାଯାଇଛି।"</string>
 </resources>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index 63765aa..26769a6 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"ਅਨਪਿੰਨ ਕਰੋ"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> ਨੂੰ ਅਨਪਿੰਨ ਕਰੋ"</string>
     <string name="app_info" msgid="6113278084877079851">"ਐਪ ਜਾਣਕਾਰੀ"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"ਸਿੱਧੇ ਤੌਰ \'ਤੇ ਸਾਂਝਾ ਕਰਨ ਲਈ ਟਾਰਗੇਟ ਗਰੁੱਪ"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"ਐਪ ਸੁਝਾਅ"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"ਐਪ ਸੂਚੀ"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"ਡੈਮੋ ਚਾਲੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"ਡੀਵਾਈਸ ਰੀਸੈੱਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string>
@@ -2250,6 +2247,10 @@
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad ਦਾ ਵਿਚਕਾਰਲਾ ਬਟਨ"</string>
     <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"ਸਵੈ-ਕਲਿੱਕ ਟਾਈਪ ਸੈਟਿੰਗ ਪੈਨਲ"</string>
     <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"ਖੱਬਾ-ਕਲਿੱਕ ਦਬਾਓ"</string>
+    <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"ਸੱਜਾ-ਕਲਿੱਕ ਦਬਾਓ"</string>
+    <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"ਡਬਲ ਕਲਿੱਕ ਕਰੋ"</string>
+    <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"ਘਸੀਟੋ"</string>
+    <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"ਸਕ੍ਰੋਲ ਕਰੋ"</string>
     <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"ਰੋਕੋ"</string>
     <string name="accessibility_autoclick_position" msgid="2933660969907663545">"ਸਥਿਤੀ"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ਨੂੰ ਪ੍ਰਤਿਬੰਧਿਤ ਖਾਨੇ ਵਿੱਚ ਪਾਇਆ ਗਿਆ ਹੈ"</string>
@@ -2526,12 +2527,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"ਐਪਲੀਕੇਸ਼ਨਾਂ"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"ਤੁਹਾਡੇ ਫਿੰਗਰਪ੍ਰਿੰਟਾਂ ਦੀ ਹੁਣ ਪਛਾਣ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ। ਫਿੰਗਰਪ੍ਰਿੰਟ ਅਣਲਾਕ ਦਾ ਦੁਬਾਰਾ ਸੈੱਟਅੱਪ ਕਰੋ।"</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"ਲਾਕ ਹੋਣ \'ਤੇ USB ਡੀਵਾਈਸ ਨੂੰ ਪਲੱਗ-ਇਨ ਕੀਤਾ ਗਿਆ"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Android ਲਾਕ ਹੋਣ \'ਤੇ USB ਡੀਵਾਈਸ ਨੂੰ ਪਲੱਗ-ਇਨ ਕੀਤਾ ਗਿਆ। ਡੀਵਾਈਸ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ, ਕਿਰਪਾ ਕਰਕੇ ਪਹਿਲਾਂ Android ਨੂੰ ਅਣਲਾਕ ਕਰੋ ਅਤੇ ਫਿਰ USB ਡੀਵਾਈਸ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਉਸਨੂੰ ਦੁਬਾਰਾ ਲਗਾਓ।"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"ਸ਼ੱਕੀ USB ਸਰਗਰਮੀ"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB ਡਾਟਾ ਸਿਗਨਲ ਬੰਦ ਕਰ ਦਿੱਤਾ ਗਿਆ ਹੈ।"</string>
 </resources>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 372608d..e091700 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -2090,12 +2090,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Odepnij"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Odepnij: <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"O aplikacji"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Odbiorcy udostępniania bezpośredniego"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Sugestie aplikacji"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Lista aplikacji"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Uruchamiam tryb demo…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Resetuję urządzenie…"</string>
@@ -2250,14 +2247,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad – w lewo"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad – w prawo"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad – środek"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Panel ustawień typu automatycznego kliknięcia"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Kliknięcie lewym przyciskiem"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Wstrzymaj"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Pozycja"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Umieszczono pakiet <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> w zasobniku danych RESTRICTED"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"wysłano obraz"</string>
@@ -2532,12 +2533,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Mapy"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplikacje"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Nie można już rozpoznać Twoich odcisków palców. Skonfiguruj ponownie odblokowywanie odciskiem palca."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Podłączono urządzenie USB przy zablokowanym urządzeniu"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Podłączono urządzenie USB, gdy Android był zablokowany. Aby używać urządzenia USB, najpierw odblokuj Androida, a potem podłącz je ponownie."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Podejrzana aktywność przez USB"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Sygnał danych z urządzenia USB został wyłączony."</string>
 </resources>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index dc52759..06b43cb 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -2089,12 +2089,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Liberar guia"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Liberar <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Informações do app"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Destinos de compartilhamento direto"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Sugestões de apps"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Lista de apps"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Iniciando demonstração…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Redefinindo dispositivo…"</string>
@@ -2249,14 +2246,14 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Botão direcional: para a esquerda"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Botão direcional: para a direita"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Botão direcional: centro"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
-    <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
-    <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
-    <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
-    <skip />
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Painel de configurações do tipo de clique automático"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Botão esquerdo"</string>
+    <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"Clicar com o botão direito do mouse"</string>
+    <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"Clicar duas vezes"</string>
+    <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"Arrastar"</string>
+    <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"Rolar"</string>
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pausar"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Posição"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> foi colocado no intervalo \"RESTRITO\""</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"enviou uma imagem"</string>
@@ -2531,12 +2528,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Mapas"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Apps"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"As impressões digitais não são mais reconhecidas. Configure o Desbloqueio por impressão digital de novo."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"O dispositivo USB foi conectado com o Android bloqueado"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"O dispositivo USB foi conectado com o Android bloqueado. Para usá-lo, primeiro desbloqueie o Android e, em seguida, reconecte o dispositivo USB."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Atividade suspeita do USB"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"O indicador de dados USB foi desativado."</string>
 </resources>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 1418a0b..f48c326 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -2089,12 +2089,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Soltar"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Soltar <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Info. da app"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Segmentações de partilha direta"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Sugestões de apps"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Lista de apps"</string>
     <string name="negative_duration" msgid="1938335096972945232">"-<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"A iniciar a demonstração…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"A repor o dispositivo…"</string>
@@ -2251,6 +2248,10 @@
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Teclado direcional: centrar"</string>
     <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Painel de definições do tipo de clique automático"</string>
     <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Clicar com o botão esquerdo do rato"</string>
+    <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"Clicar com o botão direito do rato"</string>
+    <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"Clicar duas vezes"</string>
+    <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"Arrastar"</string>
+    <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"Deslocar"</string>
     <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pausar"</string>
     <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Posição"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> foi colocado no contentor RESTRITO."</string>
@@ -2527,12 +2528,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplicações"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Já não é possível reconhecer as suas impressões digitais. Configure o Desbloqueio por impressão digital novamente."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Dispositivo USB ligado quando bloqueado"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"O dispositivo USB está ligado quando o Android está bloqueado. Para usar o dispositivo, desbloqueie primeiro o Android e, de seguida, volte a inserir o dispositivo USB para o usar."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Atividade USB suspeita"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"O sinal de dados USB foi desativado."</string>
 </resources>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index dc52759..06b43cb 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -2089,12 +2089,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Liberar guia"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Liberar <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Informações do app"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Destinos de compartilhamento direto"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Sugestões de apps"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Lista de apps"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Iniciando demonstração…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Redefinindo dispositivo…"</string>
@@ -2249,14 +2246,14 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Botão direcional: para a esquerda"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Botão direcional: para a direita"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Botão direcional: centro"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
-    <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
-    <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
-    <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
-    <skip />
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Painel de configurações do tipo de clique automático"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Botão esquerdo"</string>
+    <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"Clicar com o botão direito do mouse"</string>
+    <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"Clicar duas vezes"</string>
+    <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"Arrastar"</string>
+    <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"Rolar"</string>
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pausar"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Posição"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> foi colocado no intervalo \"RESTRITO\""</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"enviou uma imagem"</string>
@@ -2531,12 +2528,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Mapas"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Apps"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"As impressões digitais não são mais reconhecidas. Configure o Desbloqueio por impressão digital de novo."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"O dispositivo USB foi conectado com o Android bloqueado"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"O dispositivo USB foi conectado com o Android bloqueado. Para usá-lo, primeiro desbloqueie o Android e, em seguida, reconecte o dispositivo USB."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Atividade suspeita do USB"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"O indicador de dados USB foi desativado."</string>
 </resources>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 7536941..73f532a 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -2089,12 +2089,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Anulează fixarea"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Anulează fixarea pentru <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Informații despre aplicație"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Destinații de distribuire directă"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Sugestii de aplicații"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Lista cu aplicații"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Se pornește demonstrația…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Se resetează dispozitivul…"</string>
@@ -2249,14 +2246,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad stânga"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad dreapta"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad centru"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Panoul de setări pentru clicul automat"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Clic stânga"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Întrerupe"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Poziție"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> a fost adăugat la grupul RESTRICȚIONATE"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"a trimis o imagine"</string>
@@ -2531,12 +2532,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplicații"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"E posibil ca amprentele tale să nu mai fie recunoscute. Configurează din nou Deblocarea cu amprenta."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Dispozitiv USB conectat când Android este blocat"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Dispozitivul USB este conectat când dispozitivul Android este blocat. Pentru a folosi dispozitivul, deblochează mai întâi dispozitivul Android, apoi reconectează dispozitivul USB pentru a-l folosi."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Activitate suspectă a dispozitivului USB"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Semnalul de date USB a fost dezactivat."</string>
 </resources>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index f35392f..e0e0807 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -2090,12 +2090,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Открепить"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Открепить приложение \"<xliff:g id="LABEL">%1$s</xliff:g>\""</string>
     <string name="app_info" msgid="6113278084877079851">"О приложении"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Получатели Direct Share"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Рекомендуемые приложения"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Список приложений"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Запуск деморежима…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Сброс данных…"</string>
@@ -2252,6 +2249,10 @@
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"D-pad – по центру"</string>
     <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Панель настроек типа автонажатия"</string>
     <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Нажать левую кнопку"</string>
+    <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"Нажать правую кнопку"</string>
+    <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"Нажать дважды"</string>
+    <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"Перетащить"</string>
+    <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"Прокрутить"</string>
     <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Приостановить"</string>
     <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Положение"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Приложение \"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>\" помещено в категорию с ограниченным доступом."</string>
@@ -2528,12 +2529,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Карты"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Приложения"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Ваши отпечатки больше не распознаются. Настройте разблокировку по отпечатку пальца снова."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Разблокируйте экран"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Устройство Android заблокировано. Чтобы использовать USB-устройство, переподключите его после разблокировки экрана."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Обнаружено подозрительное USB-устройство"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Передача данных по USB отключена."</string>
 </resources>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index d21df4a..45dd5df 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -2248,14 +2248,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad වම"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad දකුණ"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad මැද"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"ස්වයං ක්ලික් ආකාර සැකසීම් පැනලය"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"වම්පස ක්ලිකය"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"විරාම කරන්න"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"ස්ථානය"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> අවහිර කළ බාල්දියට දමා ඇත"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"රූපයක් එව්වා"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 56fa73c..d675978 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -75,7 +75,7 @@
     <string name="CLIRDefaultOffNextCallOff" msgid="2491576172356463443">"V predvolenom nastavení nie je identifikácia volajúceho obmedzená. Ďalší hovor: Bez obmedzenia"</string>
     <string name="page_size_compat_apk_warning" msgid="2982396798449041224">"Táto aplikácia nie je kompatibilná s režimom 16 kB. Nepodarilo sa skontrolovať zarovnanie súboru APK. Táto aplikácia bude spustená v režime kompatibilnom s veľkosťou stránky. Ak chcete dosiahnuť najlepšiu kompatibilitu, znova skompilujte aplikáciu s podporou 16 kB. Viac sa dozviete na &lt;a href=\"https://developer.android.com/16kb-page-size\"&gt;https://developer.android.com/16kb-page-size&lt;/a&gt;."</string>
     <string name="page_size_compat_elf_warning" msgid="6753874059564812651">"Táto aplikácia nie je kompatibilná s režimom 16 kB. Nepodarilo sa skontrolovať zarovnanie formátu ELF. Táto aplikácia bude spustená v režime kompatibilnom s veľkosťou stránky. Ak chcete dosiahnuť najlepšiu kompatibilitu, znova skompilujte aplikáciu s podporou 16 kB. Viac sa dozviete na &lt;a href=\"https://developer.android.com/16kb-page-size\"&gt;https://developer.android.com/16kb-page-size&lt;/a&gt;."</string>
-    <string name="page_size_compat_apk_and_elf_warning" msgid="7628675779500605390">"Táto aplikácia nie je kompatibilná s režimom 16 kB. Nepodarilo sa skontrolovať zarovnanie súboru APK a formátu ELF. Táto aplikácia bude spustená v režime kompatibilnom s veľkosťou stránky. Ak chcete dosiahnuť najlepšiu kompatibilitu, znova skompilujte aplikáciu s podporou 16 kB. Viac sa dozviete na &lt;a href=\"https://developer.android.com/16kb-page-size\"&gt;https://developer.android.com/16kb-page-size&lt;/a&gt;."</string>
+    <string name="page_size_compat_apk_and_elf_warning" msgid="7628675779500605390">"Táto aplikácia nie je kompatibilná s 16 kB stránkovaním. Kontrola zarovnania v súboroch APK a ELF sa nepodarila. Aplikácia pobeží v režime kompatibility s veľkosťou stránky. Pre optimálnu kompatibilitu aplikáciu prekompilujte s podporou 16 kB stránkovania. Viac sa dozviete na &lt;a href=\"https://developer.android.com/16kb-page-size\"&gt;https://developer.android.com/16kb-page-size&lt;/a&gt;."</string>
     <string name="serviceNotProvisioned" msgid="8289333510236766193">"Služba nie je poskytovaná."</string>
     <string name="CLIRPermanent" msgid="166443681876381118">"Nemôžete meniť nastavenie identifikácie volajúcich."</string>
     <string name="auto_data_switch_title" msgid="3286350716870518297">"Dátové pripojenie bolo prepnuté na operátora <xliff:g id="CARRIERDISPLAY">%s</xliff:g>"</string>
@@ -2090,12 +2090,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Uvoľniť"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Odopnúť <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Informácie o aplikácii"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Ciele priameho zdieľania"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Návrhy aplikácií"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Zoznam aplikácií"</string>
     <string name="negative_duration" msgid="1938335096972945232">"-<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Spúšťa sa ukážka…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Resetuje sa zariadenie…"</string>
@@ -2252,6 +2249,10 @@
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Stlačiť stredné tlačidlo krížového ovládača"</string>
     <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Panel nastavení typu automatického kliknutia"</string>
     <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Kliknutie ľavým tlačidlom"</string>
+    <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"Kliknúť pravým tlačidlom"</string>
+    <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"Dvakrát kliknúť"</string>
+    <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"Presunúť"</string>
+    <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"Posúvať"</string>
     <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pozastaviť"</string>
     <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Pozícia"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Balík <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> bol vložený do kontajnera OBMEDZENÉ"</string>
@@ -2528,12 +2529,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Mapy"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplikácie"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Vaše odtlačky prstov sa už nedajú rozpoznať. Znova nastavte odomknutie odtlačkom prsta."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Zariadenie USB bolo pripojené počas uzamknutia"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Zariadenie USB bolo pripojené, keď bolo zariadenie s Androidom uzamknuté. Ak chcete dané zariadenie používať, najprv odomknite zariadenie s Androidom a potom znova vložte zariadenie USB."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Podozrivá aktivita cez USB"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Dátový signál cez USB bol deaktivovaný."</string>
 </resources>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index f44f1e7..0136f5f8 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -278,7 +278,7 @@
     <string name="bugreport_option_full_title" msgid="7681035745950045690">"Celotno poročilo"</string>
     <string name="bugreport_option_full_summary" msgid="1975130009258435885">"To možnost uporabite za najmanj motenj sistema, če je naprava neodzivna ali prepočasna oziroma ko potrebujete vse razdelke poročila. Ne omogoča vnosa več podrobnosti ali snemanja dodatnih posnetkov zaslona."</string>
     <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Posnetek zaslona za poročilo o napakah bo narejen čez # sekundo.}one{Posnetek zaslona za poročilo o napakah bo narejen čez # sekundo.}two{Posnetek zaslona za poročilo o napakah bo narejen čez # sekundi.}few{Posnetek zaslona za poročilo o napakah bo narejen čez # sekunde.}other{Posnetek zaslona za poročilo o napakah bo narejen čez # sekund.}}"</string>
-    <string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Posnetek zaslona s poročilom o napakah je izdelan"</string>
+    <string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Posnetek zaslona s poročilom je ustvarjen"</string>
     <string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Izdelava posnetka zaslona s poročilom o napakah ni uspela"</string>
     <string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Tihi način"</string>
     <string name="global_action_silent_mode_on_status" msgid="2371892537738632013">"Zvok je IZKLOPLJEN"</string>
@@ -2090,12 +2090,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Odpenjanje"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Odpni aplikacijo <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Podatki o aplikacijah"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Naslovniki neposrednega deljenja"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Predlagane aplikacije"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Seznam aplikacij"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Začenjanje predstavitve …"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Ponastavljanje naprave …"</string>
@@ -2252,6 +2249,10 @@
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Smerni gumb sredina"</string>
     <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Podokno z nastavitvami vrste samodejnega klika"</string>
     <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Levi klik"</string>
+    <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"Desni klik"</string>
+    <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"Dvoklik"</string>
+    <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"Vlečenje"</string>
+    <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"Drsenje"</string>
     <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Začasna zaustavitev"</string>
     <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Položaj"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Paket <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> je bil dodan v segment OMEJENO"</string>
@@ -2528,12 +2529,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Zemljevidi"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplikacije"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Vaših prstnih odtisov ni več mogoče prepoznati. Znova nastavite odklepanje s prstnim odtisom."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Naprava USB je bila priključena pri zaklenjenem Androidu"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Naprava USB je bila priključena pri zaklenjenem Androidu. Če želite uporabljati napravo, najprej odklenite Android in nato znova vstavite napravo USB, da jo boste lahko uporabljali."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Sumljiva dejavnost USB"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Podatkovni signal USB je bil onemogočen."</string>
 </resources>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index 3739b53..37aa8bf 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Zhgozhdo"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Zhgozhdoje <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Informacioni mbi aplikacionin"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Objektivat e ndarjes së drejtpërdrejtë"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Aplikacionet e sugjeruara"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Lista e aplikacioneve"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Po nis demonstrimin..."</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Po rivendos pajisjen…"</string>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Majtas në bllokun e drejtimit"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Djathtas në bllokun e drejtimit"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Qendra e bllokut të drejtimit"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Paneli i cilësimeve për llojin e klikimit automatik"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Klikimi majtas"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Vendos në pauzë"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Pozicioni"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> është vendosur në grupin E KUFIZUAR"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"dërgoi një imazh"</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplikacionet"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Gjurmët e tua të gishtave nuk mund të njihen më. Konfiguro përsëri \"Shkyçjen me gjurmën e gishtit\"."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Pajisja USB është e futur kur është e kyçur"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Pajisja USB është e futur kur Android është i kyçur. Për ta përdorur pajisjen, shkyç fillimisht Android dhe më pas fut përsëri pajisjen USB për ta përdorur."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Aktivitet i dyshimtë i USB-së"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Sinjali i të dhënave të USB-së është çaktivizuar."</string>
 </resources>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 009c27b..a4f0e55 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -2089,12 +2089,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Откачи"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Откачи апликацију <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Информације о апликацији"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Циљеви директног дељења"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Предлози апликација"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Листа апликација"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Покрећемо демонстрацију..."</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Ресетујемо уређај..."</string>
@@ -2251,6 +2248,10 @@
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"центар на D-pad-у"</string>
     <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Окно са подешавањима типа аутоматског клика"</string>
     <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Леви клик"</string>
+    <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"Кликните десним тастером"</string>
+    <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"Двапут кликните"</string>
+    <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"Превуците"</string>
+    <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"Скролујте"</string>
     <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Паузирај"</string>
     <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Позиција"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Пакет <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> је додат у сегмент ОГРАНИЧЕНО"</string>
@@ -2527,12 +2528,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Мапе"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Апликације"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Отисци прстију више не могу да се препознају. Поново подесите откључавање отиском прста."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB уређај је прикључен када је Android закључан"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB уређај је прикључен када је Android закључан. Да бисте користили уређај, прво откључајте Android, па поново убаците USB уређај да бисте га користили."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Сумњива USB активност"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Сигнал за пренос података са USB-а је онемогућен."</string>
 </resources>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 442763a..e56097f 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Lossa"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Lossa <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Appinformation"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Personer/grupper att dela direkt med"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Appförslag"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Applista"</string>
     <string name="negative_duration" msgid="1938335096972945232">"-<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Demo startas …"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Enheten återställs …"</string>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Styrkors, vänster"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Styrkors, höger"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Styrkors, mitten"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Inställningspanel för typ av automatiskt klick"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Vänsterklick"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pausa"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Position"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> har placerats i hinken RESTRICTED"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"har skickat en bild"</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Appar"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Det går inte längre att känna igen dina fingeravtryck. Ställ in fingeravtryckslås igen."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB-enhet ansluten när enheten är låst"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB-enheten är ansluten när Android är låst. Om du vill använda enheten måste du först låsa upp Android och sedan sätta i USB-enheten igen."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Misstänkt USB-aktivitet"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB-datasignalen har inaktiverats."</string>
 </resources>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 8153eb0..03a581a 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Bandua"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Bandua <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Maelezo ya programu"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Chaguo za kutuma maudhui moja kwa moja"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Mapendekezo ya programu"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Orodha ya programu"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Inaanzisha onyesho..."</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Inaweka upya kifaa..."</string>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Kitufe cha kushoto cha Dpad"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Kitufe cha kulia cha Dpad"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Kitufe cha katikati cha Dpad"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Kidirisha cha mipangilio ya aina ya kubofya kiotomatiki"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Bofya kushoto"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Sitisha"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Nafasi"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> kimewekwa katika kikundi KILICHODHIBITIWA"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"alituma picha"</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Ramani"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Programu"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Alama zako za vidole hazitambuliki tena. Weka tena mipangilio ya Kufungua kwa Alama ya Kidole."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Kifaa cha USB kimechomekwa wakati Android imefungwa"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Kifaa cha USB huchomekwa wakati Android imefungwa. Tafadhali fungua kwanza Android kisha uweke upya kifaa cha USB ili ukitumie."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Shughuli za USB za kutilia shaka"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Kiashiria cha data cha USB kimezimwa."</string>
 </resources>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index 9416841..16c021e 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"பின்னை அகற்று"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> ஐப் பின் நீக்கு"</string>
     <string name="app_info" msgid="6113278084877079851">"ஆப்ஸ் தகவல்"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"நேரடிப் பகிர்வு இலக்குகள்"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"ஆப்ஸ் பரிந்துரைகள்"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"ஆப்ஸ் பட்டியல்"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"டெமோவைத் தொடங்குகிறது…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"சாதனத்தை மீட்டமைக்கிறது…"</string>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"இடது திசை காட்டும் பட்டன்"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"வலது திசை காட்டும் பட்டன்"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"மையப் பகுதியைக் காட்டும் பட்டன்"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"ஆட்டோ கிளிக் வகை அமைப்புகள் பேனல்"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"இடது கிளிக்"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"இடைநிறுத்து"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"நிலை"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> என்பதை வரம்பிடப்பட்ட பக்கெட்திற்குள் சேர்க்கப்பட்டது"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"படம் அனுப்பப்பட்டது"</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"ஆப்ஸ்"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"உங்கள் கைரேகைகளை இனி அடையாளம் காண முடியாது. கைரேகை அன்லாக் அம்சத்தை மீண்டும் அமையுங்கள்."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"பூட்டப்பட்டிருக்கும்போது USB சாதனம் செருகப்பட்டது"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Android பூட்டப்பட்டிருக்கும்போது USB சாதனம் செருகப்பட்டது. சாதனத்தைப் பயன்படுத்த, முதலில் Androidடைத் திறக்கவும், பின்னர் USB சாதனத்தைப் பயன்படுத்த அதை மீண்டும் செருகவும்."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"சந்தேகத்திற்குரிய USB செயல்பாடு"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB தரவு சிக்னல் முடக்கப்பட்டுள்ளது."</string>
 </resources>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index 4bb85f7..c565618 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"అన్‌‌పిన్‌ ‌చేయి"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g>ను అన్‌పిన్ చేయి"</string>
     <string name="app_info" msgid="6113278084877079851">"యాప్ సమాచారం"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"టార్గెట్‌లను నేరుగా షేర్ చేయడం"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"యాప్ సూచనలు"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"యాప్ లిస్ట్"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"డెమోను ప్రారంభిస్తోంది..."</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"పరికరాన్ని రీసెట్ చేస్తోంది..."</string>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad ఎడమవైపున"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad కుడివైపున"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"DPad మధ్యన"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"ఆటో-క్లిక్ టైప్ సెట్టింగ్‌ల ప్యానెల్"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"ఎడమ క్లిక్"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"పాజ్ చేయండి"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"స్థానం"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> పరిమితం చేయబడిన బకెట్‌లో ఉంచబడింది"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ఇమేజ్‌ను పంపారు"</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"అప్లికేషన్‌లు"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"మీ వేలిముద్రలను ఇకపై గుర్తించడం సాధ్యం కాదు. వేలిముద్ర అన్‌లాక్‌ను మళ్లీ సెటప్ చేయండి."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"లాక్ చేసి ఉన్నప్పుడు USB డివైజ్ ప్లగ్-ఇన్ అయి ఉంది"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Android లాక్ అయినప్పుడు USB డివైజ్ ప్లగ్-ఇన్ చేయబడింది. డివైజ్‌ను ఉపయోగించడానికి, దయచేసి ముందుగా Androidను అన్‌లాక్ చేసి, ఆ తర్వాత, USB డివైజ్‌ను ఉపయోగించడానికి దాన్ని మళ్లీ ఇన్‌సర్ట్ చేయండి."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"USB యాక్టివిటీ అనుమానాస్పదంగా ఉంది"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB డేటా సిగ్నల్ డిజేబుల్ అయింది."</string>
 </resources>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 2608455..f4a3651 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"เลิกปักหมุด"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"เลิกปักหมุด <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"ข้อมูลแอป"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"เป้าหมายการแชร์โดยตรง"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"คำแนะนำเกี่ยวกับแอป"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"รายการแอป"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"กำลังเริ่มการสาธิต…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"กำลังรีเซ็ตอุปกรณ์…"</string>
@@ -2250,6 +2247,10 @@
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad กึ่งกลาง"</string>
     <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"แผงการตั้งค่าประเภทการคลิกอัตโนมัติ"</string>
     <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"คลิกซ้าย"</string>
+    <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"คลิกขวา"</string>
+    <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"ดับเบิลคลิก"</string>
+    <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"ลาก"</string>
+    <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"เลื่อน"</string>
     <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"หยุดชั่วคราว"</string>
     <string name="accessibility_autoclick_position" msgid="2933660969907663545">"วางตำแหน่ง"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"ใส่ <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ในที่เก็บข้อมูลที่ถูกจำกัดแล้ว"</string>
@@ -2526,12 +2527,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"แผนที่"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"แอปพลิเคชัน"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"ระบบจะไม่จดจำลายนิ้วมือของคุณอีกต่อไป ตั้งค่าการปลดล็อกด้วยลายนิ้วมืออีกครั้ง"</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"เสียบอุปกรณ์ USB ขณะล็อกอยู่"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"คุณเสียบอุปกรณ์ USB ขณะ Android ล็อกอยู่ หากต้องการใช้อุปกรณ์ โปรดปลดล็อก Android ก่อนแล้วจึงเสียบอุปกรณ์ USB อีกครั้งเพื่อใช้งาน"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"กิจกรรม USB ที่น่าสงสัย"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"สัญญาณข้อมูล USB ปิดอยู่"</string>
 </resources>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 482d7fd..8782970 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"I-unpin"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"I-unpin ang <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Impormasyon ng app"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Mga target ng direktang pagbabahagi"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Mga iminumungkahing app"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Listahan ng app"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Sinisimulan ang demo…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Nire-reset ang device…"</string>
@@ -2250,6 +2247,14 @@
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad Center"</string>
     <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Panel ng mga setting ng uri ng autoclick"</string>
     <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Mag-left click"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
+    <skip />
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
+    <skip />
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
+    <skip />
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
+    <skip />
     <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"I-pause"</string>
     <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Posisyon"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Inilagay ang <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> sa PINAGHIHIGPITANG bucket"</string>
@@ -2526,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Mga Mapa"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Mga Application"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Hindi na makikilala ang iyong mga fingerprint. I-set up ulit ang Pag-unlock Gamit ang Fingerprint."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Nakasaksak ang USB device kapag naka-lock"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Nakasaksak ang USB device kapag naka-lock ang Android. Para magamit ang device, paki-unlock muna ang Android at pagkatapos ay isaksak ulit ang USB device para magamit ito."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Kahina-hinalang aktibidad sa USB"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Na-disable ang data signal ng USB."</string>
 </resources>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index cb65ad7..7048a83 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Sabitlemeyi kaldır"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> uygulamasının sabitlemesini kaldır"</string>
     <string name="app_info" msgid="6113278084877079851">"Uygulama bilgileri"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Doğrudan paylaşım hedefleri"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Önerilen uygulamalar"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Uygulama listesi"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Demo başlatılıyor…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Cihaz sıfırlanıyor…"</string>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad Sol"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad Sağ"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad Orta"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Otomatik tıklama türü ayarları paneli"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Sol tıklama"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Duraklatma"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Konum"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> KISITLANMIŞ gruba yerleştirildi"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"bir resim gönderildi"</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Haritalar"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Uygulamalar"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Parmak izleriniz artık tanınamıyor. Parmak İzi Kilidi\'ni tekrar kurun."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB cihazı, Android kilitliyken takıldı"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB cihazı, Android kilitliyken takıldı. Cihazı kullanmak için lütfen önce Android\'in kilidini açın, ardından USB cihazını yeniden takın."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Şüpheli USB etkinliği"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB veri sinyali devre dışı bırakıldı."</string>
 </resources>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 341aff5..a366990 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -2250,14 +2250,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Кнопка \"вліво\" панелі керування"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Кнопка \"вправо\" панелі керування"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Центральна кнопка панелі керування"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Панель налаштувань типу автоматичного натискання"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Натиснути лівою кнопкою миші"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Призупинити"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Змінити позицію"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Пакет \"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>\" додано в сегмент з обмеженнями"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"надіслано зображення"</string>
@@ -2449,7 +2453,7 @@
     <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Функція Dual Screen недоступна, оскільки телефон сильно нагрівається"</string>
     <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Функція Dual Screen недоступна"</string>
     <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Функція Dual Screen недоступна, оскільки ввімкнено режим енергозбереження. Її можна вимкнути в налаштуваннях."</string>
-    <string name="device_state_notification_settings_button" msgid="691937505741872749">"Перейти до налаштувань"</string>
+    <string name="device_state_notification_settings_button" msgid="691937505741872749">"Відкрити налаштування"</string>
     <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Вимкнути"</string>
     <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"Клавіатуру \"<xliff:g id="DEVICE_NAME">%s</xliff:g>\" налаштовано"</string>
     <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Вибрано розкладку клавіатури \"<xliff:g id="LAYOUT_1">%s</xliff:g>\". Натисніть, щоб змінити."</string>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index ec832e6..b725a12 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"پن ہٹائیں"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> سے پن ہٹائیں"</string>
     <string name="app_info" msgid="6113278084877079851">"ایپ کی معلومات"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"براہ راست اشتراک کے اہداف"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"ایپ کی تجاویز"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"ایپ کی فہرست"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"ڈیمو شروع ہو رہا ہے…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"آلہ ری سیٹ ہو رہا ہے…"</string>
@@ -2248,14 +2245,14 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"‏Dpad بائیں کریں"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"‏Dpad دائیں کریں"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"‏Dpad سینٹر"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
-    <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
-    <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
-    <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
-    <skip />
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"خودکار کلک کی قسم کی ترتیبات کا پینل"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"بایاں کلک کریں"</string>
+    <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"دایاں کلک کریں"</string>
+    <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"دو بار کلک کریں"</string>
+    <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"گھسیٹیں"</string>
+    <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"اسکرول کریں"</string>
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"موقوف کریں"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"پوزیشن"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> کو پابند کردہ بکٹ میں رکھ دیا گیا ہے"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ایک تصویر بھیجی"</string>
@@ -2530,12 +2527,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"نقشے"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"ایپلیکیشنز"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"آپ کے فنگر پرنٹس کو مزید پہچانا نہیں جا سکتا۔ فنگر پرنٹ اَن لاک کو دوبارہ سیٹ اپ کریں۔"</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"‏مقفل ہونے پر USB آلہ پلگ ان ہوتا ہے"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"‏‫Android کے مقفل ہونے پر USB آلہ پلگ ان ہوتا ہے۔ آلہ استعمال کرنے کے لیے، براہ کرم پہلے Android کو غیر مقفل کریں اور پھر اسے استعمال کرنے کے لیے USB آلہ کو دوبارہ داخل کریں۔"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"‏‫USB کی مشکوک سرگرمی"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"‏‫USB ڈیٹا سگنل کو غیر فعال کر دیا گیا ہے۔"</string>
 </resources>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index e764fc2..a834669 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Yechib olish"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Yechib olish: <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Ilova haqida"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Direct Share nishonlari"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Ilova takliflari"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Ilovalar roʻyxati"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Demo boshlanmoqda…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Qurilma asl holatga qaytarilmoqda…"</string>
@@ -2250,6 +2247,14 @@
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad – markazga"</string>
     <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Avtomatik klik turi sozlamalari paneli"</string>
     <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Chap klik"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
+    <skip />
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
+    <skip />
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
+    <skip />
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
+    <skip />
     <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pauza"</string>
     <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Joylashuvi"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> cheklangan turkumga joylandi"</string>
@@ -2526,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Xaritalar"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Ilovalar"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Barmoq izlaringiz endi tanilmaydi. Barmoq izi bilan ochishni qayta sozlang."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Qulflanganida USB qurilma quvvat manbasiga ulandi"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Android qulflanganda USB qurilma quvvat manbasiga ulandi. Qurilmani ishlatish uchun avval Android qulfini oching va keyin uni ishlatish uchun USB qurilmani qayta kiriting."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Shubhali USB faoliyati"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB maʼlumotlar signali faolsizlantirilgan."</string>
 </resources>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index cd89cfd..c07ff1d 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Bỏ ghim"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Bỏ ghim <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Thông tin ứng dụng"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Mục tiêu chia sẻ trực tiếp"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Ứng dụng đề xuất"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Danh sách ứng dụng"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Đang bắt đầu bản trình diễn..."</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Đang đặt lại thiết bị..."</string>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Chuyển sang trái bằng bàn phím di chuyển"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Chuyển sang phải bằng bàn phím di chuyển"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Căn giữa bằng bàn phím di chuyển"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Bảng cài đặt loại tự động nhấp"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Nhấp chuột trái"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Tạm dừng"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Vị trí"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Đã đưa <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> vào bộ chứa BỊ HẠN CHẾ"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"đã gửi hình ảnh"</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Bản đồ"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Ứng dụng"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Hệ thống không nhận dạng được vân tay của bạn. Hãy thiết lập lại tính năng Mở khoá bằng vân tay."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Thiết bị USB được cắm khi thiết bị Android đang khoá"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Thiết bị USB đã được cắm khi thiết bị Android đang khoá. Để sử dụng thiết bị USB, trước tiên, hãy mở khoá thiết bị Android rồi cắm lại thiết bị USB."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Hoạt động đáng ngờ liên quan đến USB"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Tín hiệu dữ liệu qua USB đã bị tắt."</string>
 </resources>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index d5aa069..c746d3c 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -1409,7 +1409,7 @@
     <string name="carrier_app_notification_title" msgid="5815477368072060250">"已插入新 SIM 卡"</string>
     <string name="carrier_app_notification_text" msgid="6567057546341958637">"点按即可进行设置"</string>
     <string name="time_zone_change_notification_title" msgid="5232503069219193218">"您的时区已更改"</string>
-    <string name="time_zone_change_notification_body" msgid="6135793674904665585">"您现在位于<xliff:g id="TIME_ZONE_DISPLAY_NAME">%1$s</xliff:g> (<xliff:g id="TIME_ZONE_OFFSET">%2$s</xliff:g>)"</string>
+    <string name="time_zone_change_notification_body" msgid="6135793674904665585">"您当前所处的时区是<xliff:g id="TIME_ZONE_DISPLAY_NAME">%1$s</xliff:g> (<xliff:g id="TIME_ZONE_OFFSET">%2$s</xliff:g>)"</string>
     <string name="time_picker_dialog_title" msgid="9053376764985220821">"设置时间"</string>
     <string name="date_picker_dialog_title" msgid="5030520449243071926">"设置日期"</string>
     <string name="date_time_set" msgid="4603445265164486816">"设置"</string>
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"取消置顶"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"取消置顶<xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"应用信息"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"直接分享目标"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"应用建议"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"应用列表"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"正在启动演示模式…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"正在重置设备…"</string>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"向左方向键"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"向右方向键"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"方向键中心"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"自动点击类型设置面板"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"点击鼠标左键"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"暂停"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"位置"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> 已被放入受限存储分区"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"发送了一张图片"</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"地图"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"应用"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"系统无法再识别您的指纹。请重新设置“指纹解锁”功能。"</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"锁定时插入了 USB 设备"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"在 Android 设备锁定时插入了 USB 设备。如需使用 USB 设备,请先解锁 Android 设备,然后重新插入 USB 设备才能使用 USB 设备。"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"可疑的 USB 活动"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB 数据信号已停用。"</string>
 </resources>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 91c8521..c6b952c 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"取消固定"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"取消將<xliff:g id="LABEL">%1$s</xliff:g>置頂"</string>
     <string name="app_info" msgid="6113278084877079851">"應用程式資料"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"直接分享對象"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"應用程式建議"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"應用程式清單"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"正在開始示範…"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"正在重設裝置…"</string>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"十字鍵向左鍵"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"十字鍵向右鍵"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"十字鍵中心鍵"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"自動點擊類型設定面板"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"按一下左鍵"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"暫停"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"位置"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> 已納入受限制的儲存區"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"已傳送圖片"</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"地圖"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"應用程式"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"無法再辨識你的指紋。請重新設定「指紋解鎖」功能。"</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB 裝置插入時已鎖定"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB 裝置插入時,Android 已鎖定。如要使用裝置,請先解鎖 Android,然後重新插入 USB 裝置,才能使用。"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"可疑的 USB 活動"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB 資料訊號已停用。"</string>
 </resources>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 1a71fed..ca0402a 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"取消固定"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"將「<xliff:g id="LABEL">%1$s</xliff:g>」取消固定"</string>
     <string name="app_info" msgid="6113278084877079851">"應用程式資訊"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"直接分享目標"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"應用程式建議"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"應用程式清單"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"正在啟動示範模式..."</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"正在重設裝置..."</string>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad 向左移"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad 向右移"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad 置中"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"自動點選類型設定面板"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"按滑鼠左鍵"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"暫停"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"位置"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"已將「<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>」移入受限制的值區"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"傳送了一張圖片"</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"地圖"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"應用程式"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"系統無法再辨識你的指紋,請重新設定「指紋解鎖」。"</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"在鎖定時插入 USB 裝置"</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"在 Android 裝置鎖定時插入 USB 裝置。如要使用 USB 裝置,請先解鎖 Android 裝置再重新插入。"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"可疑的 USB 活動"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB 資料信號已停用。"</string>
 </resources>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 3eb20d6..96d6b57 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -2088,12 +2088,9 @@
     <string name="unpin_target" msgid="3963318576590204447">"Susa ukuphina"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Susa ukuphina ku-<xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="app_info" msgid="6113278084877079851">"Ulwazi nge-app"</string>
-    <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
-    <skip />
-    <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
-    <skip />
-    <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
-    <skip />
+    <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Qondisa ofuna ukwabelana nabo"</string>
+    <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Iziphakamiso ze-app"</string>
+    <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Uhlu lwama-app"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Iqalisa i-demo..."</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Isetha kabusha idivayisi..."</string>
@@ -2248,14 +2245,18 @@
     <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Ngakwesokunxele se-Dpad"</string>
     <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Ngakwesokudla se-Dpad"</string>
     <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Isikhungo se-Dpad"</string>
-    <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+    <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Iphaneli yamasethingi ohlobo lokuchofoza ngokuzenzekelayo"</string>
+    <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Chofoza kwesokunxele"</string>
+    <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+    <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+    <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
     <skip />
-    <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+    <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
     <skip />
+    <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Misa"</string>
+    <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Indawo"</string>
     <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"I-<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ifakwe kubhakede LOKUKHAWULELWE"</string>
     <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
     <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"uthumele isithombe"</string>
@@ -2530,12 +2531,8 @@
     <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Amamephu"</string>
     <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Ama-application"</string>
     <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Isigxivizo somunwe wakho ngeke zisakwazi ukubonwa. Setha Ukuvula Ngesigxivizo Somunwe futhi."</string>
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
-    <skip />
-    <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
-    <skip />
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Idivayisi ye-USB iyapulagwa uma i-Android ikhiyiwe."</string>
+    <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Idivayisi ye-USB iyapulagwa uma i-Android ikhiyiwe. Ukuze usebenzisa idivayisi, sicela uvule i-Android kuqala bese uphinde ufake idivayisi ye-USB ukuze uyisebenzise."</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Umsebenzi we-USB osolisayo"</string>
+    <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Isignali yedatha ye-USB ivaliwe."</string>
 </resources>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index a1f85c3..6611178 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -3313,7 +3313,6 @@
         <!-- Provides brief supplemental information for the view, such as the purpose of
              the view when that purpose is not conveyed within its textual representation.
              This property is used primarily for accessibility. -->
-        <!-- @FlaggedApi("android.view.accessibility.supplemental_description") -->
         <attr name="supplementalDescription" format="string" localization="suggested" />
 
         <!-- Sets the id of a view that screen readers are requested to visit after this view.
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 17acf9a..1a311d57 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -60,6 +60,7 @@
         <item><xliff:g id="id">@string/status_bar_oem_satellite</xliff:g></item>
         <item><xliff:g id="id">@string/status_bar_wifi</xliff:g></item>
         <item><xliff:g id="id">@string/status_bar_hotspot</xliff:g></item>
+        <item><xliff:g id="id">@string/status_bar_stacked_mobile</xliff:g></item>
         <item><xliff:g id="id">@string/status_bar_mobile</xliff:g></item>
         <item><xliff:g id="id">@string/status_bar_airplane</xliff:g></item>
         <item><xliff:g id="id">@string/status_bar_battery</xliff:g></item>
@@ -94,6 +95,7 @@
     <string translatable="false" name="status_bar_secure">secure</string>
     <string translatable="false" name="status_bar_clock">clock</string>
     <string translatable="false" name="status_bar_mobile">mobile</string>
+    <string translatable="false" name="status_bar_stacked_mobile">stacked_mobile</string>
     <string translatable="false" name="status_bar_vpn">vpn</string>
     <string translatable="false" name="status_bar_ethernet">ethernet</string>
     <string translatable="false" name="status_bar_microphone">microphone</string>
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index 595160e..e9d87e4 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -431,15 +431,18 @@
     <!-- The minimum height of the notification content (even when there's only one line of text) -->
     <dimen name="notification_2025_content_min_height">40dp</dimen>
 
-    <!-- Height of a headerless notification with one or two lines -->
-    <!-- 16 * 2 (margins) + 40 (min content height) = 72 (notification) -->
+    <!-- Max height of a collapsed (headerless) notification with a summarization -->
+    <dimen name="notification_collapsed_height_with_summarization">156dp</dimen>
+
+    <!-- Max height of a collapsed (headerless) notification with one or two lines -->
+    <!-- 16 * 2 (margins) + 48 (min content height) = 72 (notification) -->
     <dimen name="notification_2025_min_height">72dp</dimen>
 
     <!-- Height of a headerless notification with one line -->
     <!-- 16 * 2 (margins) + 24 (1 line) = 56 (notification) -->
     <dimen name="notification_headerless_min_height">56dp</dimen>
 
-    <!-- Height of a small two-line notification -->
+    <!-- Max height of a collapsed two-line notification -->
     <!-- 20 * 2 (margins) + 24 * 2 (2 lines) = 88 (notification) -->
     <dimen name="notification_min_height">88dp</dimen>
 
diff --git a/core/res/res/values/ids.xml b/core/res/res/values/ids.xml
index 3b39a65..5b5ef09 100644
--- a/core/res/res/values/ids.xml
+++ b/core/res/res/values/ids.xml
@@ -157,6 +157,9 @@
   <!-- Accessibility action identifier for {@link android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction#ACTION_CONTEXT_CLICK}. -->
   <item type="id" name="accessibilityActionContextClick" />
 
+  <!-- Accessibility action identifier for {@link android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction#ACTION_SET_EXTENDED_SELECTION}. -->
+  <item type="id" name="accessibilityActionSetExtendedSelection" />
+
   <item type="id" name="remote_input_tag" />
   <item type="id" name="pending_intent_tag" />
   <item type="id" name="remote_checked_change_listener_tag" />
diff --git a/core/res/res/values/public-final.xml b/core/res/res/values/public-final.xml
index af1e5123..61e2a28 100644
--- a/core/res/res/values/public-final.xml
+++ b/core/res/res/values/public-final.xml
@@ -3941,7 +3941,7 @@
     <!-- @FlaggedApi("android.permission.flags.replace_body_sensor_permission_enabled")
          @hide @SystemApi -->
     <public name="backgroundPermission"/>
-    <!-- @FlaggedApi(android.view.accessibility.supplemental_description) -->
+    <!-- @FlaggedApi("android.view.accessibility.supplemental_description") -->
     <public name="supplementalDescription"/>
     <!-- @FlaggedApi("android.security.enable_intent_matching_flags") -->
     <public name="intentMatchingFlags"/>
@@ -3969,7 +3969,7 @@
   <!-- @FlaggedApi("android.permission.flags.replace_body_sensor_permission_enabled")
        @hide @SystemApi -->
   <public type="attr" name="backgroundPermission" id="0x010106a7" />
-  <!-- @FlaggedApi(android.view.accessibility.supplemental_description) -->
+  <!-- @FlaggedApi("android.view.accessibility.supplemental_description") -->
   <public type="attr" name="supplementalDescription" id="0x010106a8" />
   <!-- @FlaggedApi("android.security.enable_intent_matching_flags") -->
   <public type="attr" name="intentMatchingFlags" id="0x010106a9" />
diff --git a/core/res/res/values/public-staging.xml b/core/res/res/values/public-staging.xml
index 2d411d0..e3137e2 100644
--- a/core/res/res/values/public-staging.xml
+++ b/core/res/res/values/public-staging.xml
@@ -129,6 +129,8 @@
   <staging-public-group type="id" first-id="0x01b20000">
     <!-- @FlaggedApi(android.appwidget.flags.Flags.FLAG_ENGAGEMENT_METRICS) -->
     <public name="remoteViewsMetricsId"/>
+    <!-- @FlaggedApi("android.view.accessibility.a11y_selection_api")  -->
+    <public name="accessibilityActionSetExtendedSelection"/>
   </staging-public-group>
 
   <staging-public-group type="style" first-id="0x01b10000">
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index abbba9d..7a93ca1 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -1011,6 +1011,16 @@
     <!-- Description of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. [CHAR LIMIT=NONE]-->
     <string name="permgroupdesc_notifications">show notifications</string>
 
+    <!-- Title of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. [CHAR LIMIT=40]-->
+    <string name="permgrouplab_xr_tracking">XR tracking data</string>
+    <!-- Description of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. [CHAR LIMIT=NONE]-->
+    <string name="permgroupdesc_xr_tracking">access XR data about you and the environment around you</string>
+
+    <!-- Title of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. [CHAR LIMIT=40]-->
+    <string name="permgrouplab_xr_tracking_sensitive">sensitive XR tracking data</string>
+    <!-- Description of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. [CHAR LIMIT=NONE]-->
+    <string name="permgroupdesc_xr_tracking_sensitive">access sensitive tracking data, such as eye gaze</string>
+
     <!-- Title for the capability of an accessibility service to retrieve window content. -->
     <string name="capability_title_canRetrieveWindowContent">Retrieve window content</string>
     <!-- Description for the capability of an accessibility service to retrieve window content. -->
@@ -1875,6 +1885,45 @@
     <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
     <string name="permdesc_mediaLocation">Allows the app to read locations from your media collection.</string>
 
+    <string name="permlab_eye_tracking_coarse">track your approximate eye gaze</string>
+    <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+    <string name="permdesc_eye_tracking_coarse">Allows the app to track your approximate eye gaze.</string>
+
+    <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+    <string name="permlab_eye_tracking_fine">track where you are looking</string>
+    <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+    <string name="permdesc_eye_tracking_fine">Allows the app to access precise eye gaze data.</string>
+
+    <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+    <string name="permlab_face_tracking">track your face</string>
+    <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+    <string name="permdesc_face_tracking">Allows the app to access face tracking data.</string>
+
+    <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+    <string name="permlab_hand_tracking">track your hands</string>
+    <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+    <string name="permdesc_hand_tracking">Allows the app to access hand tracking data.</string>
+
+    <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+    <string name="permlab_head_tracking">track your head</string>
+    <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+    <string name="permdesc_head_tracking">Allows the app to access head tracking data.</string>
+
+    <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+    <string name="permlab_scene_understanding_coarse">understand your immediate environment</string>
+    <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+    <string name="permdesc_scene_understanding_coarse">Allows the app to access tracking data about the environment directly around you.</string>
+
+    <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+    <string name="permlab_scene_understanding_fine">understand your immediate environment at high detail</string>
+    <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+    <string name="permdesc_scene_understanding_fine">Allows the app to access tracking data about the environment directly around you with very high detail.</string>
+
+    <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+    <string name="permlab_xr_tracking_in_background">access XR data while not in the foreground</string>
+    <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+    <string name="permdesc_xr_tracking_in_background">Allows the app to access XR data while not in the foreground.</string>
+
     <!-- Name for an app setting that lets the user authenticate for that app using biometrics (e.g. fingerprint or face). [CHAR LIMIT=30] -->
     <string name="biometric_app_setting_name">Use biometrics</string>
     <!-- Name for an app setting that lets the user authenticate for that app using biometrics (e.g. fingerprint or face) or their screen lock credential (i.e. PIN, pattern, or password). [CHAR LIMIT=70] -->
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index cc2897a..c62732d 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -3235,6 +3235,8 @@
   <java-symbol type="id" name="header_text" />
   <java-symbol type="id" name="header_text_secondary" />
   <java-symbol type="id" name="expand_button" />
+  <java-symbol type="id" name="expand_button_spacer" />
+  <java-symbol type="id" name="expand_button_container" />
   <java-symbol type="id" name="expand_button_pill" />
   <java-symbol type="id" name="expand_button_pill_colorized_layer" />
   <java-symbol type="id" name="expand_button_number" />
@@ -3318,6 +3320,7 @@
   <java-symbol type="string" name="status_bar_no_calling" />
   <java-symbol type="string" name="status_bar_call_strength" />
   <java-symbol type="string" name="status_bar_mobile" />
+  <java-symbol type="string" name="status_bar_stacked_mobile" />
   <java-symbol type="string" name="status_bar_ethernet" />
   <java-symbol type="string" name="status_bar_vpn" />
   <java-symbol type="string" name="status_bar_microphone" />
@@ -5899,6 +5902,7 @@
 
   <java-symbol type="array" name="config_notificationDefaultUnsupportedAdjustments" />
   <java-symbol type="drawable" name="ic_notification_summarization" />
+  <java-symbol type="dimen" name="notification_collapsed_height_with_summarization" />
 
   <!-- Advanced Protection Service USB feature -->
   <java-symbol type="string" name="usb_apm_usb_plugged_in_when_locked_notification_title" />
diff --git a/core/tests/coretests/src/android/app/AutomaticZenRuleTest.java b/core/tests/coretests/src/android/app/AutomaticZenRuleTest.java
index 5765562..6fe3b6c 100644
--- a/core/tests/coretests/src/android/app/AutomaticZenRuleTest.java
+++ b/core/tests/coretests/src/android/app/AutomaticZenRuleTest.java
@@ -26,7 +26,6 @@
 import android.content.ComponentName;
 import android.net.Uri;
 import android.os.Parcel;
-import android.platform.test.annotations.EnableFlags;
 import android.platform.test.annotations.Presubmit;
 import android.platform.test.flag.junit.SetFlagsRule;
 
@@ -112,7 +111,6 @@
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_MODES_API)
     public void testLongInputsFromParcel() {
         // Create a rule with long fields, set directly via reflection so that we can confirm that
         // a rule with too-long fields that comes in via a parcel has its fields truncated directly.
@@ -169,7 +167,6 @@
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_MODES_API)
     public void builderConstructor_nullInputs_throws() {
         assertThrows(NullPointerException.class,
                 () -> new AutomaticZenRule.Builder(null, Uri.parse("condition")));
@@ -178,7 +175,6 @@
     }
 
     @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,
@@ -188,7 +184,6 @@
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_MODES_API)
     public void builder_defaultsAreSensible() {
         AutomaticZenRule rule = new AutomaticZenRule.Builder("name",
                 Uri.parse("conditionId")).build();
@@ -200,7 +195,6 @@
     }
 
     @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)
@@ -209,14 +203,12 @@
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_MODES_API)
     public void validate_builderWithoutType_succeeds() throws Exception {
         AutomaticZenRule rule = new AutomaticZenRule.Builder("rule", Uri.parse("uri")).build();
         rule.validate(); // No exception.
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_MODES_API)
     public void validate_constructorWithoutType_succeeds() throws Exception {
         AutomaticZenRule rule = new AutomaticZenRule("rule", new ComponentName("pkg", "cps"),
                 new ComponentName("pkg", "activity"), Uri.parse("condition"), null,
@@ -225,7 +217,6 @@
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_MODES_API)
     public void validate_invalidType_throws() throws Exception {
         AutomaticZenRule rule = new AutomaticZenRule.Builder("rule", Uri.parse("uri")).build();
 
@@ -238,7 +229,6 @@
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_MODES_API)
     public void setType_invalidType_throws() {
         AutomaticZenRule rule = new AutomaticZenRule.Builder("rule", Uri.parse("uri")).build();
 
@@ -246,7 +236,6 @@
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_MODES_API)
     public void setTypeBuilder_invalidType_throws() {
         AutomaticZenRule.Builder builder = new AutomaticZenRule.Builder("rule", Uri.parse("uri"));
 
diff --git a/core/tests/coretests/src/android/app/NotificationManagerTest.java b/core/tests/coretests/src/android/app/NotificationManagerTest.java
index d816039..250b9ce 100644
--- a/core/tests/coretests/src/android/app/NotificationManagerTest.java
+++ b/core/tests/coretests/src/android/app/NotificationManagerTest.java
@@ -521,7 +521,7 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_MODES_API, Flags.FLAG_MODES_UI})
+    @EnableFlags(Flags.FLAG_MODES_UI)
     public void areAutomaticZenRulesUserManaged_handheld_isTrue() {
         PackageManager pm = mock(PackageManager.class);
         when(pm.hasSystemFeature(any())).thenReturn(false);
@@ -531,7 +531,7 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_MODES_API, Flags.FLAG_MODES_UI})
+    @EnableFlags(Flags.FLAG_MODES_UI)
     public void areAutomaticZenRulesUserManaged_auto_isFalse() {
         PackageManager pm = mock(PackageManager.class);
         when(pm.hasSystemFeature(eq(PackageManager.FEATURE_AUTOMOTIVE))).thenReturn(true);
@@ -541,7 +541,7 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_MODES_API, Flags.FLAG_MODES_UI})
+    @EnableFlags(Flags.FLAG_MODES_UI)
     public void areAutomaticZenRulesUserManaged_tv_isFalse() {
         PackageManager pm = mock(PackageManager.class);
         when(pm.hasSystemFeature(eq(PackageManager.FEATURE_LEANBACK))).thenReturn(true);
@@ -551,7 +551,7 @@
     }
 
     @Test
-    @EnableFlags({Flags.FLAG_MODES_API, Flags.FLAG_MODES_UI})
+    @EnableFlags(Flags.FLAG_MODES_UI)
     public void areAutomaticZenRulesUserManaged_watch_isFalse() {
         PackageManager pm = mock(PackageManager.class);
         when(pm.hasSystemFeature(eq(PackageManager.FEATURE_WATCH))).thenReturn(true);
diff --git a/core/tests/coretests/src/android/app/NotificationTest.java b/core/tests/coretests/src/android/app/NotificationTest.java
index ca6ad6f..f89e441 100644
--- a/core/tests/coretests/src/android/app/NotificationTest.java
+++ b/core/tests/coretests/src/android/app/NotificationTest.java
@@ -2532,6 +2532,46 @@
 
     @Test
     @EnableFlags(Flags.FLAG_API_RICH_ONGOING)
+    public void progressStyle_addProgressPoint_dropsZeroPoints() {
+        // GIVEN
+        final Notification.ProgressStyle progressStyle = new Notification.ProgressStyle();
+        // Points should not be a negative integer.
+        progressStyle
+                .addProgressPoint(new Notification.ProgressStyle.Point(0));
+
+        // THEN
+        assertThat(progressStyle.getProgressPoints()).isEmpty();
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_API_RICH_ONGOING)
+    public void progressStyle_setProgressPoint_dropsZeroPoints() {
+        // GIVEN
+        final Notification.ProgressStyle progressStyle = new Notification.ProgressStyle();
+        // Points should not be a negative integer.
+        progressStyle
+                .setProgressPoints(List.of(new Notification.ProgressStyle.Point(0)));
+
+        // THEN
+        assertThat(progressStyle.getProgressPoints()).isEmpty();
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_API_RICH_ONGOING)
+    public void progressStyle_createProgressModel_ignoresPointsAtMax() {
+        // GIVEN
+        final Notification.ProgressStyle progressStyle = new Notification.ProgressStyle();
+        progressStyle.addProgressSegment(new Notification.ProgressStyle.Segment(100));
+        // Points should not larger than progress maximum.
+        progressStyle
+                .addProgressPoint(new Notification.ProgressStyle.Point(100));
+
+        // THEN
+        assertThat(progressStyle.createProgressModel(Color.BLUE, Color.RED).getPoints()).isEmpty();
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_API_RICH_ONGOING)
     public void progressStyle_createProgressModel_ignoresPointsExceedingMax() {
         // GIVEN
         final Notification.ProgressStyle progressStyle = new Notification.ProgressStyle();
@@ -2573,14 +2613,14 @@
         // THEN
         assertThat(progressStyle.createProgressModel(defaultProgressColor, backgroundColor)
                 .getPoints()).isEqualTo(
-                        List.of(new Notification.ProgressStyle.Point(0)
-                                .setColor(expectedProgressColor),
-                                new Notification.ProgressStyle.Point(20)
+                        List.of(new Notification.ProgressStyle.Point(20)
                                 .setColor(expectedProgressColor),
                                 new Notification.ProgressStyle.Point(50)
                                 .setColor(expectedProgressColor),
                                 new Notification.ProgressStyle.Point(70)
-                                .setColor(expectedProgressColor)
+                                .setColor(expectedProgressColor),
+                                new Notification.ProgressStyle.Point(80)
+                                        .setColor(expectedProgressColor)
                         )
         );
     }
diff --git a/core/tests/coretests/src/android/hardware/input/InputFlagsTest.java b/core/tests/coretests/src/android/hardware/input/InputFlagsTest.java
deleted file mode 100644
index b4f1dee..0000000
--- a/core/tests/coretests/src/android/hardware/input/InputFlagsTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.hardware.input;
-
-import static com.android.hardware.input.Flags.keyboardA11yStickyKeysFlag;
-import static com.android.hardware.input.Flags.keyboardLayoutPreviewFlag;
-
-import android.platform.test.annotations.Presubmit;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-/**
- * Tests for {@link com.android.hardware.input.Flags}
- *
- * Build/Install/Run:
- *  atest FrameworksCoreTests:InputFlagsTest
- */
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-@Presubmit
-public class InputFlagsTest {
-
-    /**
-     * Test that the flags work
-     */
-    @Test
-    public void testFlags() {
-        // No crash when accessing the flag.
-        keyboardLayoutPreviewFlag();
-        keyboardA11yStickyKeysFlag();
-    }
-}
-
diff --git a/core/tests/coretests/src/android/hardware/input/OWNERS b/core/tests/coretests/src/android/hardware/input/OWNERS
deleted file mode 100644
index 3f8a602..0000000
--- a/core/tests/coretests/src/android/hardware/input/OWNERS
+++ /dev/null
@@ -1,2 +0,0 @@
-include /core/java/android/hardware/input/OWNERS
-
diff --git a/core/tests/coretests/src/android/service/notification/ConditionTest.java b/core/tests/coretests/src/android/service/notification/ConditionTest.java
index e94273e..65c108a 100644
--- a/core/tests/coretests/src/android/service/notification/ConditionTest.java
+++ b/core/tests/coretests/src/android/service/notification/ConditionTest.java
@@ -23,10 +23,8 @@
 
 import static org.junit.Assert.assertThrows;
 
-import android.app.Flags;
 import android.net.Uri;
 import android.os.Parcel;
-import android.platform.test.annotations.EnableFlags;
 import android.platform.test.flag.junit.SetFlagsRule;
 
 import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -113,7 +111,6 @@
 
     @Test
     public void testLongFields_inConstructors() {
-        mSetFlagsRule.enableFlags(Flags.FLAG_MODES_API);
         String longString = Strings.repeat("A", 65536);
         Uri longUri = Uri.parse("uri://" + Strings.repeat("A", 65530));
 
@@ -136,7 +133,6 @@
 
     @Test
     public void testLongFields_viaParcel() throws Exception {
-        mSetFlagsRule.enableFlags(Flags.FLAG_MODES_API);
         // Set fields via reflection to force them to be long, then parcel and unparcel to make sure
         // it gets truncated upon unparcelling.
         Condition cond = new Condition(Uri.parse("uri://placeholder"), "placeholder",
@@ -170,8 +166,6 @@
 
     @Test
     public void testEquals() {
-        mSetFlagsRule.enableFlags(Flags.FLAG_MODES_API);
-
         Condition cond1 = new Condition(Uri.parse("uri://placeholder"), "placeholder",
                 Condition.STATE_TRUE, Condition.SOURCE_USER_ACTION);
         Condition cond2 = new Condition(Uri.parse("uri://placeholder"), "placeholder",
@@ -186,8 +180,6 @@
 
     @Test
     public void testParcelConstructor() {
-        mSetFlagsRule.enableFlags(Flags.FLAG_MODES_API);
-
         Condition cond = new Condition(Uri.parse("uri://placeholder"), "placeholder",
                 Condition.STATE_TRUE, Condition.SOURCE_USER_ACTION);
 
@@ -200,28 +192,24 @@
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_MODES_API)
     public void constructor_unspecifiedSource_succeeds() {
         new Condition(Uri.parse("id"), "Summary", Condition.STATE_TRUE);
         // No exception.
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_MODES_API)
     public void constructor_validSource_succeeds() {
         new Condition(Uri.parse("id"), "Summary", Condition.STATE_TRUE, Condition.SOURCE_CONTEXT);
         // No exception.
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_MODES_API)
     public void constructor_invalidSource_throws() {
         assertThrows(IllegalArgumentException.class,
                 () -> new Condition(Uri.parse("uri"), "Summary", Condition.STATE_TRUE, 1000));
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_MODES_API)
     public void constructor_parcelWithInvalidSource_throws() {
         Condition original = new Condition(Uri.parse("condition"), "Summary", Condition.STATE_TRUE,
                 Condition.SOURCE_SCHEDULE);
@@ -237,7 +225,6 @@
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_MODES_API)
     public void validate_invalidSource_throws() throws Exception {
         Condition condition = new Condition(Uri.parse("condition"), "Summary", Condition.STATE_TRUE,
                 Condition.SOURCE_SCHEDULE);
diff --git a/core/tests/coretests/src/android/view/WindowManagerTests.java b/core/tests/coretests/src/android/view/WindowManagerTests.java
index 211d768..b32aa46 100644
--- a/core/tests/coretests/src/android/view/WindowManagerTests.java
+++ b/core/tests/coretests/src/android/view/WindowManagerTests.java
@@ -16,9 +16,6 @@
 
 package android.view;
 
-import static com.android.window.flags.Flags.FLAG_ENABLE_WM_EXTENSIONS_FOR_ALL_FLAG;
-
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assume.assumeTrue;
 
@@ -47,19 +44,8 @@
     public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
 
     @Test
-    public void testHasWindowExtensionsEnabled_flagDisabled() {
-        mSetFlagsRule.disableFlags(FLAG_ENABLE_WM_EXTENSIONS_FOR_ALL_FLAG);
-
-        // Before FLAG_ENABLE_WM_EXTENSIONS_FOR_ALL_FLAG, Extensions are always bundled with AE.
-        assertEquals(isActivityEmbeddingEnableForAll(),
-                WindowManager.hasWindowExtensionsEnabled());
-    }
-
-    @Test
-    public void testHasWindowExtensionsEnabled_flagEnabled() {
-        mSetFlagsRule.enableFlags(FLAG_ENABLE_WM_EXTENSIONS_FOR_ALL_FLAG);
-
-        // Extensions should be enabled on all devices.
+    public void testHasWindowExtensionsEnabled() {
+        // Extensions should be enabled on all phones/tablets.
         assertTrue(WindowManager.hasWindowExtensionsEnabled());
     }
 
diff --git a/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java b/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java
index 3b0eab4..cc5c6af 100644
--- a/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java
+++ b/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java
@@ -46,7 +46,7 @@
     // The number of fields tested in the corresponding CTS AccessibilityNodeInfoTest:
     // See fullyPopulateAccessibilityNodeInfo, assertEqualsAccessibilityNodeInfo,
     // and assertAccessibilityNodeInfoCleared in that class.
-    private static final int NUM_MARSHALLED_PROPERTIES = 47;
+    private static final int NUM_MARSHALLED_PROPERTIES = 48;
 
     /**
      * The number of properties that are purposely not marshalled
diff --git a/core/tests/coretests/src/android/view/contentcapture/MainContentCaptureSessionTest.java b/core/tests/coretests/src/android/view/contentcapture/MainContentCaptureSessionTest.java
index b42bcee..5f89f9c 100644
--- a/core/tests/coretests/src/android/view/contentcapture/MainContentCaptureSessionTest.java
+++ b/core/tests/coretests/src/android/view/contentcapture/MainContentCaptureSessionTest.java
@@ -36,11 +36,15 @@
 import android.graphics.Insets;
 import android.os.Handler;
 import android.os.RemoteException;
+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 android.util.SparseArray;
 import android.view.View;
 import android.view.autofill.AutofillId;
+import android.view.contentcapture.flags.Flags;
 import android.view.contentprotection.ContentProtectionEventProcessor;
 
 import androidx.test.core.app.ApplicationProvider;
@@ -90,6 +94,8 @@
 
     @Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule();
 
+    @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
     @Mock private IContentCaptureManager mMockSystemServerInterface;
 
     @Mock private ContentProtectionEventProcessor mMockContentProtectionEventProcessor;
@@ -407,6 +413,7 @@
     }
 
     @Test
+    @DisableFlags(Flags.FLAG_FLUSH_AFTER_EACH_FRAME)
     @SuppressWarnings("GuardedBy")
     public void notifyContentCaptureEvents_started_ContentCaptureEnabled_ProtectionEnabled()
             throws RemoteException {
@@ -434,6 +441,34 @@
     }
 
     @Test
+    @EnableFlags(Flags.FLAG_FLUSH_AFTER_EACH_FRAME)
+    @SuppressWarnings("GuardedBy")
+    public void notifyContentCaptureEvents_started_ContentCaptureEnabled_ProtectionEnabled_Flush()
+            throws RemoteException {
+        ContentCaptureOptions options =
+                createOptions(
+                        /* enableContentCaptureReceiver= */ true,
+                        /* enableContentProtectionReceiver= */ true);
+        MainContentCaptureSession session = createSession(options);
+        session.mDirectServiceInterface = mMockContentCaptureDirectManager;
+
+        session.onSessionStarted(0x2, null);
+        // Override the processor for interaction verification.
+        session.mContentProtectionEventProcessor = mMockContentProtectionEventProcessor;
+        notifyContentCaptureEvents(session);
+        mTestableLooper.processAllMessages();
+
+        // Force flush will happen twice.
+        verify(mMockContentCaptureDirectManager, times(1))
+                .sendEvents(any(), eq(FLUSH_REASON_VIEW_TREE_APPEARING), any());
+        verify(mMockContentCaptureDirectManager, times(1))
+                .sendEvents(any(), eq(FLUSH_REASON_VIEW_TREE_APPEARED), any());
+        // 5 view events + 2 view tree events + 1 flush event
+        verify(mMockContentProtectionEventProcessor, times(8)).processEvent(any());
+        assertThat(session.mEvents).isEmpty();
+    }
+
+    @Test
     public void notifyViewAppearedBelowMaximumBufferSize() throws RemoteException {
         ContentCaptureOptions options =
                 createOptions(
diff --git a/core/tests/coretests/src/android/window/ConfigurationDispatcherTest.kt b/core/tests/coretests/src/android/window/ConfigurationDispatcherTest.kt
new file mode 100644
index 0000000..e8e8a2e
--- /dev/null
+++ b/core/tests/coretests/src/android/window/ConfigurationDispatcherTest.kt
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.window
+
+import android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW
+import android.content.ContextWrapper
+import android.content.res.Configuration
+import android.content.res.Configuration.ORIENTATION_PORTRAIT
+import android.platform.test.annotations.Presubmit
+import android.view.Display.DEFAULT_DISPLAY
+import androidx.test.filters.SmallTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+/**
+ * Test to verify [ConfigurationDispatcher]
+ *
+ * Build/Install/Run:
+ * atest FrameworksCoreTests:ConfigurationDispatcherTest
+ */
+@SmallTest
+@Presubmit
+@RunWith(Parameterized::class)
+class ConfigurationDispatcherTest(private val shouldReportPrivateChanges: Boolean) {
+
+    /**
+     * Verifies [ConfigurationDispatcher.shouldReportPrivateChanges].
+     */
+    @Test
+    fun testConfigurationDispatcher() {
+        val receiver = TestConfigurationReceiver(shouldReportPrivateChanges)
+        val config = Configuration().apply {
+            orientation = ORIENTATION_PORTRAIT
+        }
+
+        // Verify public config field change
+        receiver.windowToken.onConfigurationChangedInner(receiver, config, DEFAULT_DISPLAY, true)
+
+        assertThat(receiver.receivedConfig).isEqualTo(config)
+
+        // Clear the config value
+        receiver.receivedConfig.unset()
+
+        // Verify private config field change
+        config.windowConfiguration.windowingMode = WINDOWING_MODE_MULTI_WINDOW
+
+        receiver.windowToken.onConfigurationChangedInner(receiver, config, DEFAULT_DISPLAY, true)
+
+        assertThat(receiver.receivedConfig).isEqualTo(
+            if (shouldReportPrivateChanges) {
+                config
+            } else {
+                Configuration.EMPTY
+            }
+        )
+    }
+
+    /**
+     * Test [android.content.Context] to implement [ConfigurationDispatcher] for testing.
+     *
+     * @param shouldReportPrivateChanges used to override
+     * [ConfigurationDispatcher.shouldReportPrivateChanges] for testing,
+     */
+    private class TestConfigurationReceiver(
+        private val shouldReportPrivateChanges: Boolean
+    ) : ContextWrapper(null), ConfigurationDispatcher {
+        val windowToken = WindowTokenClient()
+        val receivedConfig = Configuration()
+
+        init {
+            windowToken.attachContext(this)
+        }
+
+        override fun dispatchConfigurationChanged(configuration: Configuration) {
+            receivedConfig.setTo(configuration)
+        }
+
+        override fun shouldReportPrivateChanges(): Boolean {
+            return shouldReportPrivateChanges
+        }
+
+        override fun getDisplayId(): Int {
+            return DEFAULT_DISPLAY
+        }
+    }
+
+    companion object {
+        @Parameterized.Parameters(name = "shouldReportPrivateChange={0}")
+        @JvmStatic
+        fun data(): Collection<Any> {
+            return listOf(true, false)
+        }
+    }
+}
\ No newline at end of file
diff --git a/core/tests/coretests/src/android/window/WindowTokenClientControllerTest.java b/core/tests/coretests/src/android/window/WindowTokenClientControllerTest.java
index 84ff40f..116dc12 100644
--- a/core/tests/coretests/src/android/window/WindowTokenClientControllerTest.java
+++ b/core/tests/coretests/src/android/window/WindowTokenClientControllerTest.java
@@ -266,4 +266,25 @@
 
         verify(mWindowTokenClient).onWindowTokenRemoved();
     }
+
+    @Test
+    public void testOnWindowConfigurationChanged_propagatedToCorrectToken() throws RemoteException {
+        doReturn(mWindowContextInfo).when(mWindowManagerService)
+                .attachWindowContextToDisplayContent(any(), any(), anyInt());
+
+        mController.onWindowConfigurationChanged(mWindowTokenClient, mConfiguration,
+                DEFAULT_DISPLAY + 1);
+
+        // Not propagated before attaching
+        verify(mWindowTokenClient, never()).onConfigurationChanged(mConfiguration,
+                DEFAULT_DISPLAY + 1);
+
+        assertTrue(mController.attachToDisplayContent(mWindowTokenClient, DEFAULT_DISPLAY));
+
+        mController.onWindowConfigurationChanged(mWindowTokenClient, mConfiguration,
+                DEFAULT_DISPLAY + 1);
+
+        // Now that's attached, propagating it.
+        verify(mWindowTokenClient).postOnConfigurationChanged(mConfiguration, DEFAULT_DISPLAY + 1);
+    }
 }
diff --git a/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java b/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java
index 9f398ec..b7d6ab5 100644
--- a/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java
+++ b/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java
@@ -79,6 +79,7 @@
 import android.metrics.LogMaker;
 import android.net.Uri;
 import android.os.UserHandle;
+import android.os.UserManager;
 import android.provider.DeviceConfig;
 import android.service.chooser.ChooserTarget;
 import android.util.Pair;
@@ -3178,7 +3179,11 @@
     }
 
     private void markWorkProfileUserAvailable() {
-        ChooserActivityOverrideData.getInstance().workProfileUserHandle = UserHandle.of(10);
+        if (UserManager.isHeadlessSystemUserMode()) {
+            ChooserActivityOverrideData.getInstance().workProfileUserHandle = UserHandle.of(11);
+        } else {
+            ChooserActivityOverrideData.getInstance().workProfileUserHandle = UserHandle.of(10);
+        }
     }
 
     private void markCloneProfileUserAvailable() {
diff --git a/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java b/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java
index dcea912..be7f84e 100644
--- a/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java
+++ b/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java
@@ -155,12 +155,12 @@
 
     @Override
     protected ResolverListController createListController(UserHandle userHandle) {
-        if (userHandle == UserHandle.SYSTEM) {
-            when(sOverrides.resolverListController.getUserHandle()).thenReturn(UserHandle.SYSTEM);
-            return sOverrides.resolverListController;
+        if (userHandle.equals(sOverrides.workProfileUserHandle)) {
+            when(sOverrides.workResolverListController.getUserHandle()).thenReturn(userHandle);
+            return sOverrides.workResolverListController;
         }
-        when(sOverrides.workResolverListController.getUserHandle()).thenReturn(userHandle);
-        return sOverrides.workResolverListController;
+        when(sOverrides.resolverListController.getUserHandle()).thenReturn(userHandle);
+        return sOverrides.resolverListController;
     }
 
     @Override
diff --git a/core/tests/coretests/src/com/android/internal/util/RateLimitingCacheTest.java b/core/tests/coretests/src/com/android/internal/util/RateLimitingCacheTest.java
index 52ff79d..82d90fc 100644
--- a/core/tests/coretests/src/com/android/internal/util/RateLimitingCacheTest.java
+++ b/core/tests/coretests/src/com/android/internal/util/RateLimitingCacheTest.java
@@ -21,6 +21,7 @@
 import static org.junit.Assert.fail;
 
 import android.os.SystemClock;
+import android.platform.test.annotations.Presubmit;
 
 import androidx.test.runner.AndroidJUnit4;
 
@@ -34,6 +35,7 @@
 /**
  * Test the RateLimitingCache class.
  */
+@Presubmit
 @RunWith(AndroidJUnit4.class)
 public class RateLimitingCacheTest {
 
@@ -283,7 +285,8 @@
     }
 
     private static class TestRateLimitingCache<Value> extends RateLimitingCache<Value> {
-        private long mTime;
+        // Start at a non-zero time to avoid confusion with uninitialized state.
+        private long mTime = 1;
 
         public TestRateLimitingCache(long periodMillis) {
             super(periodMillis);
diff --git a/core/tests/coretests/src/com/android/internal/widget/NotificationProgressBarTest.java b/core/tests/coretests/src/com/android/internal/widget/NotificationProgressBarTest.java
index 9baa31f..282886a 100644
--- a/core/tests/coretests/src/com/android/internal/widget/NotificationProgressBarTest.java
+++ b/core/tests/coretests/src/com/android/internal/widget/NotificationProgressBarTest.java
@@ -121,18 +121,20 @@
 
         assertThat(parts).isEqualTo(expectedParts);
 
-        float drawableWidth = 300;
+        float drawableWidth = 320;
         float segSegGap = 4;
         float segPointGap = 4;
         float pointRadius = 6;
         boolean hasTrackerIcon = true;
+        int trackerDrawWidth = 20;
 
         List<DrawablePart> drawableParts =
                 NotificationProgressBar.processPartsAndConvertToDrawableParts(
-                        parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon);
+                        parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon,
+                        trackerDrawWidth);
 
         List<DrawablePart> expectedDrawableParts = new ArrayList<>(
-                List.of(new DrawableSegment(0, 300, Color.RED)));
+                List.of(new DrawableSegment(10, 310, Color.RED)));
 
         assertThat(drawableParts).isEqualTo(expectedDrawableParts);
 
@@ -141,14 +143,14 @@
 
         Pair<List<DrawablePart>, Float> p = NotificationProgressBar.maybeStretchAndRescaleSegments(
                 parts, drawableParts, segmentMinWidth, pointRadius, (float) progress / progressMax,
-                300, isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
+                isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
 
         // Colors with 50% opacity
         int fadedRed = 0x80FF0000;
         expectedDrawableParts = new ArrayList<>(
-                List.of(new DrawableSegment(0, 300, fadedRed, true)));
+                List.of(new DrawableSegment(10, 310, fadedRed, true)));
 
-        assertThat(p.second).isEqualTo(0);
+        assertThat(p.second).isEqualTo(10);
         assertThat(p.first).isEqualTo(expectedDrawableParts);
     }
 
@@ -168,18 +170,20 @@
 
         assertThat(parts).isEqualTo(expectedParts);
 
-        float drawableWidth = 300;
+        float drawableWidth = 320;
         float segSegGap = 4;
         float segPointGap = 4;
         float pointRadius = 6;
         boolean hasTrackerIcon = true;
+        int trackerDrawWidth = 20;
 
         List<DrawablePart> drawableParts =
                 NotificationProgressBar.processPartsAndConvertToDrawableParts(
-                        parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon);
+                        parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon,
+                        trackerDrawWidth);
 
         List<DrawablePart> expectedDrawableParts = new ArrayList<>(
-                List.of(new DrawableSegment(0, 300, Color.RED)));
+                List.of(new DrawableSegment(10, 310, Color.RED)));
 
         assertThat(drawableParts).isEqualTo(expectedDrawableParts);
 
@@ -188,9 +192,9 @@
 
         Pair<List<DrawablePart>, Float> p = NotificationProgressBar.maybeStretchAndRescaleSegments(
                 parts, drawableParts, segmentMinWidth, pointRadius, (float) progress / progressMax,
-                300, isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
+                isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
 
-        assertThat(p.second).isEqualTo(300);
+        assertThat(p.second).isEqualTo(310);
         assertThat(p.first).isEqualTo(expectedDrawableParts);
     }
 
@@ -219,6 +223,42 @@
                 progressMax);
     }
 
+    @Test
+    public void processAndConvertToParts_pointPositionIsZero() {
+        List<ProgressStyle.Segment> segments = new ArrayList<>();
+        segments.add(new ProgressStyle.Segment(100).setColor(Color.RED));
+        List<ProgressStyle.Point> points = new ArrayList<>();
+        points.add(new ProgressStyle.Point(0).setColor(Color.RED));
+        int progress = 50;
+        int progressMax = 100;
+
+        List<Part> parts = NotificationProgressBar.processModelAndConvertToViewParts(segments,
+                points, progress, progressMax);
+
+        // Point at the start is dropped.
+        List<Part> expectedParts = new ArrayList<>(List.of(new Segment(1f, Color.RED)));
+
+        assertThat(parts).isEqualTo(expectedParts);
+    }
+
+    @Test
+    public void processAndConvertToParts_pointPositionAtMax() {
+        List<ProgressStyle.Segment> segments = new ArrayList<>();
+        segments.add(new ProgressStyle.Segment(100).setColor(Color.RED));
+        List<ProgressStyle.Point> points = new ArrayList<>();
+        points.add(new ProgressStyle.Point(100).setColor(Color.RED));
+        int progress = 50;
+        int progressMax = 100;
+
+        List<Part> parts = NotificationProgressBar.processModelAndConvertToViewParts(segments,
+                points, progress, progressMax);
+
+        // Point at the end is dropped.
+        List<Part> expectedParts = new ArrayList<>(List.of(new Segment(1f, Color.RED)));
+
+        assertThat(parts).isEqualTo(expectedParts);
+    }
+
     @Test(expected = IllegalArgumentException.class)
     public void processAndConvertToParts_pointPositionAboveMax() {
         List<ProgressStyle.Segment> segments = new ArrayList<>();
@@ -249,18 +289,20 @@
 
         assertThat(parts).isEqualTo(expectedParts);
 
-        float drawableWidth = 300;
+        float drawableWidth = 320;
         float segSegGap = 4;
         float segPointGap = 4;
         float pointRadius = 6;
         boolean hasTrackerIcon = true;
+        int trackerDrawWidth = 20;
 
         List<DrawablePart> drawableParts =
                 NotificationProgressBar.processPartsAndConvertToDrawableParts(
-                        parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon);
+                        parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon,
+                        trackerDrawWidth);
 
         List<DrawablePart> expectedDrawableParts = new ArrayList<>(
-                List.of(new DrawableSegment(0, 300, Color.BLUE)));
+                List.of(new DrawableSegment(10, 310, Color.BLUE)));
 
         assertThat(drawableParts).isEqualTo(expectedDrawableParts);
 
@@ -269,15 +311,15 @@
 
         Pair<List<DrawablePart>, Float> p = NotificationProgressBar.maybeStretchAndRescaleSegments(
                 parts, drawableParts, segmentMinWidth, pointRadius, (float) progress / progressMax,
-                300, isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
+                isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
 
         // Colors with 50% opacity
         int fadedBlue = 0x800000FF;
         expectedDrawableParts = new ArrayList<>(
-                List.of(new DrawableSegment(0, 180, Color.BLUE),
-                        new DrawableSegment(180, 300, fadedBlue, true)));
+                List.of(new DrawableSegment(10, 190, Color.BLUE),
+                        new DrawableSegment(190, 310, fadedBlue, true)));
 
-        assertThat(p.second).isEqualTo(180);
+        assertThat(p.second).isEqualTo(190);
         assertThat(p.first).isEqualTo(expectedDrawableParts);
     }
 
@@ -299,19 +341,21 @@
 
         assertThat(parts).isEqualTo(expectedParts);
 
-        float drawableWidth = 300;
+        float drawableWidth = 320;
         float segSegGap = 4;
         float segPointGap = 4;
         float pointRadius = 6;
         boolean hasTrackerIcon = true;
+        int trackerDrawWidth = 20;
 
         List<DrawablePart> drawableParts =
                 NotificationProgressBar.processPartsAndConvertToDrawableParts(
-                        parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon);
+                        parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon,
+                        trackerDrawWidth);
 
         List<DrawablePart> expectedDrawableParts = new ArrayList<>(
-                List.of(new DrawableSegment(0, 146, Color.RED),
-                        new DrawableSegment(150, 300, Color.GREEN)));
+                List.of(new DrawableSegment(10, 156, Color.RED),
+                        new DrawableSegment(160, 310, Color.GREEN)));
 
         assertThat(drawableParts).isEqualTo(expectedDrawableParts);
 
@@ -319,15 +363,15 @@
         boolean isStyledByProgress = true;
         Pair<List<DrawablePart>, Float> p = NotificationProgressBar.maybeStretchAndRescaleSegments(
                 parts, drawableParts, segmentMinWidth, pointRadius, (float) progress / progressMax,
-                300, isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
+                isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
 
         // Colors with 50% opacity
         int fadedGreen = 0x8000FF00;
-        expectedDrawableParts = new ArrayList<>(List.of(new DrawableSegment(0, 146, Color.RED),
-                new DrawableSegment(150, 180, Color.GREEN),
-                new DrawableSegment(180, 300, fadedGreen, true)));
+        expectedDrawableParts = new ArrayList<>(List.of(new DrawableSegment(10, 156, Color.RED),
+                new DrawableSegment(160, 190, Color.GREEN),
+                new DrawableSegment(190, 310, fadedGreen, true)));
 
-        assertThat(p.second).isEqualTo(180);
+        assertThat(p.second).isEqualTo(190);
         assertThat(p.first).isEqualTo(expectedDrawableParts);
     }
 
@@ -353,10 +397,12 @@
         float segPointGap = 4;
         float pointRadius = 6;
         boolean hasTrackerIcon = false;
+        int trackerDrawWidth = 0;
 
         List<DrawablePart> drawableParts =
                 NotificationProgressBar.processPartsAndConvertToDrawableParts(
-                        parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon);
+                        parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon,
+                        trackerDrawWidth);
 
         List<DrawablePart> expectedDrawableParts = new ArrayList<>(
                 List.of(new DrawableSegment(0, 146, Color.RED),
@@ -368,7 +414,7 @@
         boolean isStyledByProgress = true;
         Pair<List<DrawablePart>, Float> p = NotificationProgressBar.maybeStretchAndRescaleSegments(
                 parts, drawableParts, segmentMinWidth, pointRadius, (float) progress / progressMax,
-                300, isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
+                isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
 
         // Colors with 50% opacity
         int fadedGreen = 0x8000FF00;
@@ -409,26 +455,28 @@
 
         assertThat(parts).isEqualTo(expectedParts);
 
-        float drawableWidth = 300;
+        float drawableWidth = 320;
         float segSegGap = 4;
         float segPointGap = 4;
         float pointRadius = 6;
         boolean hasTrackerIcon = true;
+        int trackerDrawWidth = 20;
 
         List<DrawablePart> drawableParts =
                 NotificationProgressBar.processPartsAndConvertToDrawableParts(
-                        parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon);
+                        parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon,
+                        trackerDrawWidth);
 
         List<DrawablePart> expectedDrawableParts = new ArrayList<>(
-                List.of(new DrawableSegment(0, 35, Color.BLUE),
-                        new DrawablePoint(39, 51, Color.RED),
-                        new DrawableSegment(55, 65, Color.BLUE),
-                        new DrawablePoint(69, 81, Color.BLUE),
-                        new DrawableSegment(85, 170, Color.BLUE),
-                        new DrawablePoint(174, 186, Color.BLUE),
-                        new DrawableSegment(190, 215, Color.BLUE),
-                        new DrawablePoint(219, 231, Color.YELLOW),
-                        new DrawableSegment(235, 300, Color.BLUE)));
+                List.of(new DrawableSegment(10, 45, Color.BLUE),
+                        new DrawablePoint(49, 61, Color.RED),
+                        new DrawableSegment(65, 75, Color.BLUE),
+                        new DrawablePoint(79, 91, Color.BLUE),
+                        new DrawableSegment(95, 180, Color.BLUE),
+                        new DrawablePoint(184, 196, Color.BLUE),
+                        new DrawableSegment(200, 225, Color.BLUE),
+                        new DrawablePoint(229, 241, Color.YELLOW),
+                        new DrawableSegment(245, 310, Color.BLUE)));
 
         assertThat(drawableParts).isEqualTo(expectedDrawableParts);
 
@@ -437,23 +485,23 @@
 
         Pair<List<DrawablePart>, Float> p = NotificationProgressBar.maybeStretchAndRescaleSegments(
                 parts, drawableParts, segmentMinWidth, pointRadius, (float) progress / progressMax,
-                300, isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
+                isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
 
         // Colors with 50% opacity
         int fadedBlue = 0x800000FF;
         int fadedYellow = 0x80FFFF00;
         expectedDrawableParts = new ArrayList<>(
-                List.of(new DrawableSegment(0, 34.219177F, Color.BLUE),
-                        new DrawablePoint(38.219177F, 50.219177F, Color.RED),
-                        new DrawableSegment(54.219177F, 70.21918F, Color.BLUE),
-                        new DrawablePoint(74.21918F, 86.21918F, Color.BLUE),
-                        new DrawableSegment(90.21918F, 172.38356F, Color.BLUE),
-                        new DrawablePoint(176.38356F, 188.38356F, Color.BLUE),
-                        new DrawableSegment(192.38356F, 217.0137F, fadedBlue, true),
-                        new DrawablePoint(221.0137F, 233.0137F, fadedYellow),
-                        new DrawableSegment(237.0137F, 300F, fadedBlue, true)));
+                List.of(new DrawableSegment(10, 44.219177F, Color.BLUE),
+                        new DrawablePoint(48.219177F, 60.219177F, Color.RED),
+                        new DrawableSegment(64.219177F, 80.21918F, Color.BLUE),
+                        new DrawablePoint(84.21918F, 96.21918F, Color.BLUE),
+                        new DrawableSegment(100.21918F, 182.38356F, Color.BLUE),
+                        new DrawablePoint(186.38356F, 198.38356F, Color.BLUE),
+                        new DrawableSegment(202.38356F, 227.0137F, fadedBlue, true),
+                        new DrawablePoint(231.0137F, 243.0137F, fadedYellow),
+                        new DrawableSegment(247.0137F, 310F, fadedBlue, true)));
 
-        assertThat(p.second).isEqualTo(182.38356F);
+        assertThat(p.second).isEqualTo(192.38356F);
         assertThat(p.first).isEqualTo(expectedDrawableParts);
     }
 
@@ -488,25 +536,29 @@
 
         assertThat(parts).isEqualTo(expectedParts);
 
-        float drawableWidth = 300;
+        float drawableWidth = 320;
         float segSegGap = 4;
         float segPointGap = 4;
         float pointRadius = 6;
         boolean hasTrackerIcon = true;
+        int trackerDrawWidth = 20;
+
         List<DrawablePart> drawableParts =
                 NotificationProgressBar.processPartsAndConvertToDrawableParts(
-                        parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon);
+                        parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon,
+                        trackerDrawWidth);
 
         List<DrawablePart> expectedDrawableParts = new ArrayList<>(
-                List.of(new DrawableSegment(0, 35, Color.RED), new DrawablePoint(39, 51, Color.RED),
-                        new DrawableSegment(55, 65, Color.RED),
-                        new DrawablePoint(69, 81, Color.BLUE),
-                        new DrawableSegment(85, 146, Color.RED),
-                        new DrawableSegment(150, 170, Color.GREEN),
-                        new DrawablePoint(174, 186, Color.BLUE),
-                        new DrawableSegment(190, 215, Color.GREEN),
-                        new DrawablePoint(219, 231, Color.YELLOW),
-                        new DrawableSegment(235, 300, Color.GREEN)));
+                List.of(new DrawableSegment(10, 45, Color.RED),
+                        new DrawablePoint(49, 61, Color.RED),
+                        new DrawableSegment(65, 75, Color.RED),
+                        new DrawablePoint(79, 91, Color.BLUE),
+                        new DrawableSegment(95, 156, Color.RED),
+                        new DrawableSegment(160, 180, Color.GREEN),
+                        new DrawablePoint(184, 196, Color.BLUE),
+                        new DrawableSegment(200, 225, Color.GREEN),
+                        new DrawablePoint(229, 241, Color.YELLOW),
+                        new DrawableSegment(245, 310, Color.GREEN)));
 
         assertThat(drawableParts).isEqualTo(expectedDrawableParts);
 
@@ -515,99 +567,24 @@
 
         Pair<List<DrawablePart>, Float> p = NotificationProgressBar.maybeStretchAndRescaleSegments(
                 parts, drawableParts, segmentMinWidth, pointRadius, (float) progress / progressMax,
-                300, isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
+                isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
 
         // Colors with 50% opacity
         int fadedGreen = 0x8000FF00;
         int fadedYellow = 0x80FFFF00;
         expectedDrawableParts = new ArrayList<>(
-                List.of(new DrawableSegment(0, 34.095238F, Color.RED),
-                        new DrawablePoint(38.095238F, 50.095238F, Color.RED),
-                        new DrawableSegment(54.095238F, 70.09524F, Color.RED),
-                        new DrawablePoint(74.09524F, 86.09524F, Color.BLUE),
-                        new DrawableSegment(90.09524F, 148.9524F, Color.RED),
-                        new DrawableSegment(152.95238F, 172.7619F, Color.GREEN),
-                        new DrawablePoint(176.7619F, 188.7619F, Color.BLUE),
-                        new DrawableSegment(192.7619F, 217.33333F, fadedGreen, true),
-                        new DrawablePoint(221.33333F, 233.33333F, fadedYellow),
-                        new DrawableSegment(237.33333F, 299.99997F, fadedGreen, true)));
+                List.of(new DrawableSegment(10, 44.095238F, Color.RED),
+                        new DrawablePoint(48.095238F, 60.095238F, Color.RED),
+                        new DrawableSegment(64.095238F, 80.09524F, Color.RED),
+                        new DrawablePoint(84.09524F, 96.09524F, Color.BLUE),
+                        new DrawableSegment(100.09524F, 158.9524F, Color.RED),
+                        new DrawableSegment(162.95238F, 182.7619F, Color.GREEN),
+                        new DrawablePoint(186.7619F, 198.7619F, Color.BLUE),
+                        new DrawableSegment(202.7619F, 227.33333F, fadedGreen, true),
+                        new DrawablePoint(231.33333F, 243.33333F, fadedYellow),
+                        new DrawableSegment(247.33333F, 309.99997F, fadedGreen, true)));
 
-        assertThat(p.second).isEqualTo(182.7619F);
-        assertThat(p.first).isEqualTo(expectedDrawableParts);
-    }
-
-    @Test
-    public void processAndConvertToParts_multipleSegmentsWithPointsAtStartAndEnd()
-            throws NotEnoughWidthToFitAllPartsException {
-        List<ProgressStyle.Segment> segments = new ArrayList<>();
-        segments.add(new ProgressStyle.Segment(50).setColor(Color.RED));
-        segments.add(new ProgressStyle.Segment(50).setColor(Color.GREEN));
-        List<ProgressStyle.Point> points = new ArrayList<>();
-        points.add(new ProgressStyle.Point(0).setColor(Color.RED));
-        points.add(new ProgressStyle.Point(25).setColor(Color.BLUE));
-        points.add(new ProgressStyle.Point(60).setColor(Color.BLUE));
-        points.add(new ProgressStyle.Point(100).setColor(Color.YELLOW));
-        int progress = 60;
-        int progressMax = 100;
-
-        List<Part> parts = NotificationProgressBar.processModelAndConvertToViewParts(segments,
-                points, progress, progressMax);
-
-        List<Part> expectedParts = new ArrayList<>(
-                List.of(new Point(Color.RED),
-                        new Segment(0.25f, Color.RED),
-                        new Point(Color.BLUE),
-                        new Segment(0.25f, Color.RED),
-                        new Segment(0.10f, Color.GREEN),
-                        new Point(Color.BLUE),
-                        new Segment(0.4f, Color.GREEN),
-                        new Point(Color.YELLOW)));
-
-        assertThat(parts).isEqualTo(expectedParts);
-
-        float drawableWidth = 300;
-        float segSegGap = 4;
-        float segPointGap = 4;
-        float pointRadius = 6;
-        boolean hasTrackerIcon = true;
-
-        List<DrawablePart> drawableParts =
-                NotificationProgressBar.processPartsAndConvertToDrawableParts(
-                        parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon);
-
-        List<DrawablePart> expectedDrawableParts = new ArrayList<>(
-                List.of(new DrawablePoint(0, 12, Color.RED),
-                        new DrawableSegment(16, 65, Color.RED),
-                        new DrawablePoint(69, 81, Color.BLUE),
-                        new DrawableSegment(85, 146, Color.RED),
-                        new DrawableSegment(150, 170, Color.GREEN),
-                        new DrawablePoint(174, 186, Color.BLUE),
-                        new DrawableSegment(190, 284, Color.GREEN),
-                        new DrawablePoint(288, 300, Color.YELLOW)));
-
-        assertThat(drawableParts).isEqualTo(expectedDrawableParts);
-
-        float segmentMinWidth = 16;
-        boolean isStyledByProgress = true;
-
-        Pair<List<DrawablePart>, Float> p = NotificationProgressBar.maybeStretchAndRescaleSegments(
-                parts, drawableParts, segmentMinWidth, pointRadius, (float) progress / progressMax,
-                300, isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
-
-        // Colors with 50% opacity
-        int fadedGreen = 0x8000FF00;
-        int fadedYellow = 0x80FFFF00;
-        expectedDrawableParts = new ArrayList<>(
-                List.of(new DrawablePoint(0, 12, Color.RED),
-                        new DrawableSegment(16, 65, Color.RED),
-                        new DrawablePoint(69, 81, Color.BLUE),
-                        new DrawableSegment(85, 146, Color.RED),
-                        new DrawableSegment(150, 170, Color.GREEN),
-                        new DrawablePoint(174, 186, Color.BLUE),
-                        new DrawableSegment(190, 284, fadedGreen, true),
-                        new DrawablePoint(288, 300, fadedYellow)));
-
-        assertThat(p.second).isEqualTo(180);
+        assertThat(p.second).isEqualTo(192.7619F);
         assertThat(p.first).isEqualTo(expectedDrawableParts);
     }
 
@@ -644,27 +621,29 @@
 
         assertThat(parts).isEqualTo(expectedParts);
 
-        float drawableWidth = 300;
+        float drawableWidth = 320;
         float segSegGap = 4;
         float segPointGap = 4;
         float pointRadius = 6;
         boolean hasTrackerIcon = true;
+        int trackerDrawWidth = 20;
 
         List<DrawablePart> drawableParts =
                 NotificationProgressBar.processPartsAndConvertToDrawableParts(
-                        parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon);
+                        parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon,
+                        trackerDrawWidth);
 
         List<DrawablePart> expectedDrawableParts = new ArrayList<>(
-                List.of(new DrawableSegment(0, -7, Color.RED),
-                        new DrawablePoint(-3, 9, Color.RED),
-                        new DrawableSegment(13, 65, Color.RED),
-                        new DrawablePoint(69, 81, Color.BLUE),
-                        new DrawableSegment(85, 146, Color.RED),
-                        new DrawableSegment(150, 170, Color.GREEN),
-                        new DrawablePoint(174, 186, Color.BLUE),
-                        new DrawableSegment(190, 287, Color.GREEN),
-                        new DrawablePoint(291, 303, Color.YELLOW),
-                        new DrawableSegment(307, 300, Color.GREEN)));
+                List.of(new DrawableSegment(10, 3, Color.RED),
+                        new DrawablePoint(7, 19, Color.RED),
+                        new DrawableSegment(23, 75, Color.RED),
+                        new DrawablePoint(79, 91, Color.BLUE),
+                        new DrawableSegment(95, 156, Color.RED),
+                        new DrawableSegment(160, 180, Color.GREEN),
+                        new DrawablePoint(184, 196, Color.BLUE),
+                        new DrawableSegment(200, 297, Color.GREEN),
+                        new DrawablePoint(301, 313, Color.YELLOW),
+                        new DrawableSegment(317, 310, Color.GREEN)));
 
         assertThat(drawableParts).isEqualTo(expectedDrawableParts);
 
@@ -673,24 +652,24 @@
 
         Pair<List<DrawablePart>, Float> p = NotificationProgressBar.maybeStretchAndRescaleSegments(
                 parts, drawableParts, segmentMinWidth, pointRadius, (float) progress / progressMax,
-                300, isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
+                isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
 
         // Colors with 50% opacity
         int fadedGreen = 0x8000FF00;
         int fadedYellow = 0x80FFFF00;
         expectedDrawableParts = new ArrayList<>(
-                List.of(new DrawableSegment(0, 16, Color.RED),
-                        new DrawablePoint(20, 32, Color.RED),
-                        new DrawableSegment(36, 78.02409F, Color.RED),
-                        new DrawablePoint(82.02409F, 94.02409F, Color.BLUE),
-                        new DrawableSegment(98.02409F, 146.55421F, Color.RED),
-                        new DrawableSegment(150.55421F, 169.44579F, Color.GREEN),
-                        new DrawablePoint(173.44579F, 185.44579F, Color.BLUE),
-                        new DrawableSegment(189.44579F, 264, fadedGreen, true),
-                        new DrawablePoint(268, 280, fadedYellow),
-                        new DrawableSegment(284, 300, fadedGreen, true)));
+                List.of(new DrawableSegment(10, 26, Color.RED),
+                        new DrawablePoint(30, 42, Color.RED),
+                        new DrawableSegment(46, 88.02409F, Color.RED),
+                        new DrawablePoint(92.02409F, 104.02409F, Color.BLUE),
+                        new DrawableSegment(108.02409F, 156.55421F, Color.RED),
+                        new DrawableSegment(160.55421F, 179.44579F, Color.GREEN),
+                        new DrawablePoint(183.44579F, 195.44579F, Color.BLUE),
+                        new DrawableSegment(199.44579F, 274, fadedGreen, true),
+                        new DrawablePoint(278, 290, fadedYellow),
+                        new DrawableSegment(294, 310, fadedGreen, true)));
 
-        assertThat(p.second).isEqualTo(179.44579F);
+        assertThat(p.second).isEqualTo(189.44579F);
         assertThat(p.first).isEqualTo(expectedDrawableParts);
     }
 
@@ -711,31 +690,38 @@
                 points, progress, progressMax);
 
         List<Part> expectedParts = new ArrayList<>(
-                List.of(new Segment(0.15f, Color.RED), new Point(Color.RED),
-                        new Segment(0.10f, Color.RED), new Point(Color.BLUE),
-                        new Segment(0.25f, Color.RED), new Segment(0.25f, Color.GREEN),
-                        new Point(Color.YELLOW), new Segment(0.25f, Color.GREEN)));
+                List.of(new Segment(0.15f, Color.RED),
+                        new Point(Color.RED),
+                        new Segment(0.10f, Color.RED),
+                        new Point(Color.BLUE),
+                        new Segment(0.25f, Color.RED),
+                        new Segment(0.25f, Color.GREEN),
+                        new Point(Color.YELLOW),
+                        new Segment(0.25f, Color.GREEN)));
 
         assertThat(parts).isEqualTo(expectedParts);
 
-        float drawableWidth = 300;
+        float drawableWidth = 320;
         float segSegGap = 4;
         float segPointGap = 4;
         float pointRadius = 6;
         boolean hasTrackerIcon = true;
+        int trackerDrawWidth = 20;
 
         List<DrawablePart> drawableParts =
                 NotificationProgressBar.processPartsAndConvertToDrawableParts(
-                        parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon);
+                        parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon,
+                        trackerDrawWidth);
 
         List<DrawablePart> expectedDrawableParts = new ArrayList<>(
-                List.of(new DrawableSegment(0, 35, Color.RED), new DrawablePoint(39, 51, Color.RED),
-                        new DrawableSegment(55, 65, Color.RED),
-                        new DrawablePoint(69, 81, Color.BLUE),
-                        new DrawableSegment(85, 146, Color.RED),
-                        new DrawableSegment(150, 215, Color.GREEN),
-                        new DrawablePoint(219, 231, Color.YELLOW),
-                        new DrawableSegment(235, 300, Color.GREEN)));
+                List.of(new DrawableSegment(10, 45, Color.RED),
+                        new DrawablePoint(49, 61, Color.RED),
+                        new DrawableSegment(65, 75, Color.RED),
+                        new DrawablePoint(79, 91, Color.BLUE),
+                        new DrawableSegment(95, 156, Color.RED),
+                        new DrawableSegment(160, 225, Color.GREEN),
+                        new DrawablePoint(229, 241, Color.YELLOW),
+                        new DrawableSegment(245, 310, Color.GREEN)));
 
         assertThat(drawableParts).isEqualTo(expectedDrawableParts);
 
@@ -744,34 +730,34 @@
 
         Pair<List<DrawablePart>, Float> p = NotificationProgressBar.maybeStretchAndRescaleSegments(
                 parts, drawableParts, segmentMinWidth, pointRadius, (float) progress / progressMax,
-                300, isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
+                isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
 
         expectedDrawableParts = new ArrayList<>(
-                List.of(new DrawableSegment(0, 34.296295F, Color.RED),
-                        new DrawablePoint(38.296295F, 50.296295F, Color.RED),
-                        new DrawableSegment(54.296295F, 70.296295F, Color.RED),
-                        new DrawablePoint(74.296295F, 86.296295F, Color.BLUE),
-                        new DrawableSegment(90.296295F, 149.62962F, Color.RED),
-                        new DrawableSegment(153.62962F, 216.8148F, Color.GREEN),
-                        new DrawablePoint(220.81482F, 232.81482F, Color.YELLOW),
-                        new DrawableSegment(236.81482F, 300, Color.GREEN)));
+                List.of(new DrawableSegment(10, 44.296295F, Color.RED),
+                        new DrawablePoint(48.296295F, 60.296295F, Color.RED),
+                        new DrawableSegment(64.296295F, 80.296295F, Color.RED),
+                        new DrawablePoint(84.296295F, 96.296295F, Color.BLUE),
+                        new DrawableSegment(100.296295F, 159.62962F, Color.RED),
+                        new DrawableSegment(163.62962F, 226.8148F, Color.GREEN),
+                        new DrawablePoint(230.81482F, 242.81482F, Color.YELLOW),
+                        new DrawableSegment(246.81482F, 310, Color.GREEN)));
 
-        assertThat(p.second).isEqualTo(182.9037F);
+        assertThat(p.second).isEqualTo(192.9037F);
         assertThat(p.first).isEqualTo(expectedDrawableParts);
     }
 
-    // The only difference from the `zeroWidthDrawableSegment` test below is the longer
+    // The only difference from the `segmentWidthAtMin` test below is the longer
     // segmentMinWidth (= 16dp).
     @Test
-    public void maybeStretchAndRescaleSegments_negativeWidthDrawableSegment()
+    public void maybeStretchAndRescaleSegments_segmentWidthBelowMin()
             throws NotEnoughWidthToFitAllPartsException {
         List<ProgressStyle.Segment> segments = new ArrayList<>();
-        segments.add(new ProgressStyle.Segment(100).setColor(Color.BLUE));
         segments.add(new ProgressStyle.Segment(200).setColor(Color.BLUE));
+        segments.add(new ProgressStyle.Segment(100).setColor(Color.BLUE));
         segments.add(new ProgressStyle.Segment(300).setColor(Color.BLUE));
         segments.add(new ProgressStyle.Segment(400).setColor(Color.BLUE));
         List<ProgressStyle.Point> points = new ArrayList<>();
-        points.add(new ProgressStyle.Point(0).setColor(Color.BLUE));
+        points.add(new ProgressStyle.Point(200).setColor(Color.BLUE));
         int progress = 1000;
         int progressMax = 1000;
 
@@ -779,28 +765,32 @@
                 points, progress, progressMax);
 
         List<Part> expectedParts = new ArrayList<>(
-                List.of(new Point(Color.BLUE), new Segment(0.1f, Color.BLUE),
-                        new Segment(0.2f, Color.BLUE), new Segment(0.3f, Color.BLUE),
+                List.of(new Segment(0.2f, Color.BLUE),
+                        new Point(Color.BLUE),
+                        new Segment(0.1f, Color.BLUE),
+                        new Segment(0.3f, Color.BLUE),
                         new Segment(0.4f, Color.BLUE)));
 
         assertThat(parts).isEqualTo(expectedParts);
 
-        float drawableWidth = 200;
+        float drawableWidth = 220;
         float segSegGap = 4;
         float segPointGap = 4;
         float pointRadius = 6;
         boolean hasTrackerIcon = true;
+        int trackerDrawWidth = 20;
 
         List<DrawablePart> drawableParts =
                 NotificationProgressBar.processPartsAndConvertToDrawableParts(
-                        parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon);
+                        parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon,
+                        trackerDrawWidth);
 
         List<DrawablePart> expectedDrawableParts = new ArrayList<>(
-                List.of(new DrawablePoint(0, 12, Color.BLUE),
-                        new DrawableSegment(16, 16, Color.BLUE),
-                        new DrawableSegment(20, 56, Color.BLUE),
-                        new DrawableSegment(60, 116, Color.BLUE),
-                        new DrawableSegment(120, 200, Color.BLUE)));
+                List.of(new DrawableSegment(10, 40, Color.BLUE),
+                        new DrawablePoint(44, 56, Color.BLUE),
+                        new DrawableSegment(60, 66, Color.BLUE),
+                        new DrawableSegment(70, 126, Color.BLUE),
+                        new DrawableSegment(130, 210, Color.BLUE)));
 
         assertThat(drawableParts).isEqualTo(expectedDrawableParts);
 
@@ -809,30 +799,31 @@
 
         Pair<List<DrawablePart>, Float> p = NotificationProgressBar.maybeStretchAndRescaleSegments(
                 parts, drawableParts, segmentMinWidth, pointRadius, (float) progress / progressMax,
-                200, isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
+                isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
 
-        expectedDrawableParts = new ArrayList<>(List.of(new DrawablePoint(0, 12, Color.BLUE),
-                new DrawableSegment(16, 32, Color.BLUE),
-                new DrawableSegment(36, 69.41936F, Color.BLUE),
-                new DrawableSegment(73.41936F, 124.25807F, Color.BLUE),
-                new DrawableSegment(128.25807F, 200, Color.BLUE)));
+        expectedDrawableParts = new ArrayList<>(
+                List.of(new DrawableSegment(10, 38.81356F, Color.BLUE),
+                        new DrawablePoint(42.81356F, 54.81356F, Color.BLUE),
+                        new DrawableSegment(58.81356F, 74.81356F, Color.BLUE),
+                        new DrawableSegment(78.81356F, 131.42374F, Color.BLUE),
+                        new DrawableSegment(135.42374F, 210, Color.BLUE)));
 
-        assertThat(p.second).isEqualTo(200);
+        assertThat(p.second).isEqualTo(210);
         assertThat(p.first).isEqualTo(expectedDrawableParts);
     }
 
-    // The only difference from the `negativeWidthDrawableSegment` test above is the shorter
+    // The only difference from the `segmentWidthBelowMin` test above is the shorter
     // segmentMinWidth (= 10dp).
     @Test
-    public void maybeStretchAndRescaleSegments_zeroWidthDrawableSegment()
+    public void maybeStretchAndRescaleSegments_segmentWidthAtMin()
             throws NotEnoughWidthToFitAllPartsException {
         List<ProgressStyle.Segment> segments = new ArrayList<>();
-        segments.add(new ProgressStyle.Segment(100).setColor(Color.BLUE));
         segments.add(new ProgressStyle.Segment(200).setColor(Color.BLUE));
+        segments.add(new ProgressStyle.Segment(100).setColor(Color.BLUE));
         segments.add(new ProgressStyle.Segment(300).setColor(Color.BLUE));
         segments.add(new ProgressStyle.Segment(400).setColor(Color.BLUE));
         List<ProgressStyle.Point> points = new ArrayList<>();
-        points.add(new ProgressStyle.Point(0).setColor(Color.BLUE));
+        points.add(new ProgressStyle.Point(200).setColor(Color.BLUE));
         int progress = 1000;
         int progressMax = 1000;
 
@@ -840,28 +831,32 @@
                 points, progress, progressMax);
 
         List<Part> expectedParts = new ArrayList<>(
-                List.of(new Point(Color.BLUE), new Segment(0.1f, Color.BLUE),
-                        new Segment(0.2f, Color.BLUE), new Segment(0.3f, Color.BLUE),
+                List.of(new Segment(0.2f, Color.BLUE),
+                        new Point(Color.BLUE),
+                        new Segment(0.1f, Color.BLUE),
+                        new Segment(0.3f, Color.BLUE),
                         new Segment(0.4f, Color.BLUE)));
 
         assertThat(parts).isEqualTo(expectedParts);
 
-        float drawableWidth = 200;
+        float drawableWidth = 220;
         float segSegGap = 4;
         float segPointGap = 4;
         float pointRadius = 6;
         boolean hasTrackerIcon = true;
+        int trackerDrawWidth = 20;
 
         List<DrawablePart> drawableParts =
                 NotificationProgressBar.processPartsAndConvertToDrawableParts(
-                        parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon);
+                        parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon,
+                        trackerDrawWidth);
 
         List<DrawablePart> expectedDrawableParts = new ArrayList<>(
-                List.of(new DrawablePoint(0, 12, Color.BLUE),
-                        new DrawableSegment(16, 16, Color.BLUE),
-                        new DrawableSegment(20, 56, Color.BLUE),
-                        new DrawableSegment(60, 116, Color.BLUE),
-                        new DrawableSegment(120, 200, Color.BLUE)));
+                List.of(new DrawableSegment(10, 40, Color.BLUE),
+                        new DrawablePoint(44, 56, Color.BLUE),
+                        new DrawableSegment(60, 66, Color.BLUE),
+                        new DrawableSegment(70, 126, Color.BLUE),
+                        new DrawableSegment(130, 210, Color.BLUE)));
 
         assertThat(drawableParts).isEqualTo(expectedDrawableParts);
 
@@ -870,15 +865,16 @@
 
         Pair<List<DrawablePart>, Float> p = NotificationProgressBar.maybeStretchAndRescaleSegments(
                 parts, drawableParts, segmentMinWidth, pointRadius, (float) progress / progressMax,
-                200, isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
+                isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
 
-        expectedDrawableParts = new ArrayList<>(List.of(new DrawablePoint(0, 12, Color.BLUE),
-                new DrawableSegment(16, 26, Color.BLUE),
-                new DrawableSegment(30, 64.169014F, Color.BLUE),
-                new DrawableSegment(68.169014F, 120.92958F, Color.BLUE),
-                new DrawableSegment(124.92958F, 200, Color.BLUE)));
+        expectedDrawableParts = new ArrayList<>(
+                List.of(new DrawableSegment(10, 39.411766F, Color.BLUE),
+                        new DrawablePoint(43.411766F, 55.411766F, Color.BLUE),
+                        new DrawableSegment(59.411766F, 69.411766F, Color.BLUE),
+                        new DrawableSegment(73.411766F, 128.05884F, Color.BLUE),
+                        new DrawableSegment(132.05882F, 210, Color.BLUE)));
 
-        assertThat(p.second).isEqualTo(200);
+        assertThat(p.second).isEqualTo(210);
         assertThat(p.first).isEqualTo(expectedDrawableParts);
     }
 
@@ -886,12 +882,12 @@
     public void maybeStretchAndRescaleSegments_noStretchingNecessary()
             throws NotEnoughWidthToFitAllPartsException {
         List<ProgressStyle.Segment> segments = new ArrayList<>();
-        segments.add(new ProgressStyle.Segment(200).setColor(Color.BLUE));
         segments.add(new ProgressStyle.Segment(100).setColor(Color.BLUE));
+        segments.add(new ProgressStyle.Segment(200).setColor(Color.BLUE));
         segments.add(new ProgressStyle.Segment(300).setColor(Color.BLUE));
         segments.add(new ProgressStyle.Segment(400).setColor(Color.BLUE));
         List<ProgressStyle.Point> points = new ArrayList<>();
-        points.add(new ProgressStyle.Point(0).setColor(Color.BLUE));
+        points.add(new ProgressStyle.Point(100).setColor(Color.BLUE));
         int progress = 1000;
         int progressMax = 1000;
 
@@ -899,28 +895,32 @@
                 points, progress, progressMax);
 
         List<Part> expectedParts = new ArrayList<>(
-                List.of(new Point(Color.BLUE), new Segment(0.2f, Color.BLUE),
-                        new Segment(0.1f, Color.BLUE), new Segment(0.3f, Color.BLUE),
+                List.of(new Segment(0.1f, Color.BLUE),
+                        new Point(Color.BLUE),
+                        new Segment(0.2f, Color.BLUE),
+                        new Segment(0.3f, Color.BLUE),
                         new Segment(0.4f, Color.BLUE)));
 
         assertThat(parts).isEqualTo(expectedParts);
 
-        float drawableWidth = 200;
+        float drawableWidth = 220;
         float segSegGap = 4;
         float segPointGap = 4;
         float pointRadius = 6;
         boolean hasTrackerIcon = true;
+        int trackerDrawWidth = 20;
 
         List<DrawablePart> drawableParts =
                 NotificationProgressBar.processPartsAndConvertToDrawableParts(
-                        parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon);
+                        parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon,
+                        trackerDrawWidth);
 
         List<DrawablePart> expectedDrawableParts = new ArrayList<>(
-                List.of(new DrawablePoint(0, 12, Color.BLUE),
-                        new DrawableSegment(16, 36, Color.BLUE),
-                        new DrawableSegment(40, 56, Color.BLUE),
-                        new DrawableSegment(60, 116, Color.BLUE),
-                        new DrawableSegment(120, 200, Color.BLUE)));
+                List.of(new DrawableSegment(10, 20, Color.BLUE),
+                        new DrawablePoint(24, 36, Color.BLUE),
+                        new DrawableSegment(40, 66, Color.BLUE),
+                        new DrawableSegment(70, 126, Color.BLUE),
+                        new DrawableSegment(130, 210, Color.BLUE)));
 
         assertThat(drawableParts).isEqualTo(expectedDrawableParts);
 
@@ -929,9 +929,9 @@
 
         Pair<List<DrawablePart>, Float> p = NotificationProgressBar.maybeStretchAndRescaleSegments(
                 parts, drawableParts, segmentMinWidth, pointRadius, (float) progress / progressMax,
-                200, isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
+                isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
 
-        assertThat(p.second).isEqualTo(200);
+        assertThat(p.second).isEqualTo(210);
         assertThat(p.first).isEqualTo(expectedDrawableParts);
     }
 
@@ -951,10 +951,10 @@
         segments.add(new ProgressStyle.Segment(10).setColor(Color.GREEN));
         segments.add(new ProgressStyle.Segment(10).setColor(Color.RED));
         List<ProgressStyle.Point> points = new ArrayList<>();
-        points.add(new ProgressStyle.Point(0).setColor(orange));
         points.add(new ProgressStyle.Point(1).setColor(Color.BLUE));
+        points.add(new ProgressStyle.Point(10).setColor(orange));
         points.add(new ProgressStyle.Point(55).setColor(Color.BLUE));
-        points.add(new ProgressStyle.Point(100).setColor(orange));
+        points.add(new ProgressStyle.Point(90).setColor(orange));
         int progress = 50;
         int progressMax = 100;
 
@@ -962,10 +962,10 @@
                 points, progress, progressMax);
 
         List<Part> expectedParts = new ArrayList<>(
-                List.of(new Point(orange),
-                        new Segment(0.01f, orange),
+                List.of(new Segment(0.01f, orange),
                         new Point(Color.BLUE),
                         new Segment(0.09f, orange),
+                        new Point(orange),
                         new Segment(0.1f, Color.YELLOW),
                         new Segment(0.1f, Color.BLUE),
                         new Segment(0.1f, Color.GREEN),
@@ -976,21 +976,23 @@
                         new Segment(0.1f, Color.YELLOW),
                         new Segment(0.1f, Color.BLUE),
                         new Segment(0.1f, Color.GREEN),
-                        new Segment(0.1f, Color.RED),
-                        new Point(orange)));
+                        new Point(orange),
+                        new Segment(0.1f, Color.RED)));
 
         assertThat(parts).isEqualTo(expectedParts);
 
         // For the list of ProgressStyle.Part used in this test, 300 is the minimum width.
-        float drawableWidth = 299;
+        float drawableWidth = 319;
         float segSegGap = 4;
         float segPointGap = 4;
         float pointRadius = 6;
         boolean hasTrackerIcon = true;
+        int trackerDrawWidth = 20;
 
         List<DrawablePart> drawableParts =
                 NotificationProgressBar.processPartsAndConvertToDrawableParts(
-                        parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon);
+                        parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon,
+                        trackerDrawWidth);
 
         // Skips the validation of the intermediate list of DrawableParts.
 
@@ -999,7 +1001,7 @@
 
         NotificationProgressBar.maybeStretchAndRescaleSegments(
                 parts, drawableParts, segmentMinWidth, pointRadius, (float) progress / progressMax,
-                300, isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
+                isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
     }
 
     @Test
@@ -1015,11 +1017,12 @@
         int progress = 60;
         int progressMax = 100;
 
-        float drawableWidth = 300;
+        float drawableWidth = 320;
         float segSegGap = 4;
         float segPointGap = 4;
         float pointRadius = 6;
         boolean hasTrackerIcon = true;
+        int trackerDrawWidth = 20;
 
         float segmentMinWidth = 16;
         boolean isStyledByProgress = true;
@@ -1036,24 +1039,24 @@
                         pointRadius,
                         hasTrackerIcon,
                         segmentMinWidth,
-                        isStyledByProgress
-                );
+                        isStyledByProgress,
+                        trackerDrawWidth);
 
         // Colors with 50% opacity
         int fadedBlue = 0x800000FF;
         int fadedYellow = 0x80FFFF00;
         List<DrawablePart> expectedDrawableParts = new ArrayList<>(
-                List.of(new DrawableSegment(0, 34.219177F, Color.BLUE),
-                        new DrawablePoint(38.219177F, 50.219177F, Color.RED),
-                        new DrawableSegment(54.219177F, 70.21918F, Color.BLUE),
-                        new DrawablePoint(74.21918F, 86.21918F, Color.BLUE),
-                        new DrawableSegment(90.21918F, 172.38356F, Color.BLUE),
-                        new DrawablePoint(176.38356F, 188.38356F, Color.BLUE),
-                        new DrawableSegment(192.38356F, 217.0137F, fadedBlue, true),
-                        new DrawablePoint(221.0137F, 233.0137F, fadedYellow),
-                        new DrawableSegment(237.0137F, 300F, fadedBlue, true)));
+                List.of(new DrawableSegment(10, 44.219177F, Color.BLUE),
+                        new DrawablePoint(48.219177F, 60.219177F, Color.RED),
+                        new DrawableSegment(64.219177F, 80.21918F, Color.BLUE),
+                        new DrawablePoint(84.21918F, 96.21918F, Color.BLUE),
+                        new DrawableSegment(100.21918F, 182.38356F, Color.BLUE),
+                        new DrawablePoint(186.38356F, 198.38356F, Color.BLUE),
+                        new DrawableSegment(202.38356F, 227.0137F, fadedBlue, true),
+                        new DrawablePoint(231.0137F, 243.0137F, fadedYellow),
+                        new DrawableSegment(247.0137F, 310F, fadedBlue, true)));
 
-        assertThat(p.second).isEqualTo(182.38356F);
+        assertThat(p.second).isEqualTo(192.38356F);
         assertThat(p.first).isEqualTo(expectedDrawableParts);
     }
 
@@ -1065,11 +1068,12 @@
         int progress = 60;
         int progressMax = 100;
 
-        float drawableWidth = 100;
+        float drawableWidth = 120;
         float segSegGap = 4;
         float segPointGap = 4;
         float pointRadius = 6;
         boolean hasTrackerIcon = true;
+        int trackerDrawWidth = 20;
 
         float segmentMinWidth = 16;
         boolean isStyledByProgress = true;
@@ -1086,16 +1090,16 @@
                         pointRadius,
                         hasTrackerIcon,
                         segmentMinWidth,
-                        isStyledByProgress
-                );
+                        isStyledByProgress,
+                        trackerDrawWidth);
 
-        // Colors with 50%f opacity
+        // Colors with 50% opacity
         int fadedBlue = 0x800000FF;
         List<DrawablePart> expectedDrawableParts = new ArrayList<>(
-                List.of(new DrawableSegment(0, 60.000004F, Color.BLUE),
-                        new DrawableSegment(60.000004F, 100, fadedBlue, true)));
+                List.of(new DrawableSegment(10, 70F, Color.BLUE),
+                        new DrawableSegment(70F, 110, fadedBlue, true)));
 
-        assertThat(p.second).isWithin(1e-5f).of(60);
+        assertThat(p.second).isEqualTo(70);
         assertThat(p.first).isEqualTo(expectedDrawableParts);
     }
 }
diff --git a/core/tests/coretests/src/com/android/internal/widget/NotificationProgressModelTest.java b/core/tests/coretests/src/com/android/internal/widget/NotificationProgressModelTest.java
index e1f5b1c..140d268 100644
--- a/core/tests/coretests/src/com/android/internal/widget/NotificationProgressModelTest.java
+++ b/core/tests/coretests/src/com/android/internal/widget/NotificationProgressModelTest.java
@@ -90,7 +90,7 @@
                 new Notification.ProgressStyle.Segment(50).setColor(Color.YELLOW),
                 new Notification.ProgressStyle.Segment(50).setColor(Color.LTGRAY));
         final List<Notification.ProgressStyle.Point> points = List.of(
-                new Notification.ProgressStyle.Point(0).setColor(Color.RED),
+                new Notification.ProgressStyle.Point(1).setColor(Color.RED),
                 new Notification.ProgressStyle.Point(20).setColor(Color.BLUE));
         final NotificationProgressModel savedModel = new NotificationProgressModel(segments,
                 points,
@@ -121,7 +121,7 @@
                 new Notification.ProgressStyle.Segment(50).setColor(Color.YELLOW),
                 new Notification.ProgressStyle.Segment(50).setColor(Color.YELLOW));
         final List<Notification.ProgressStyle.Point> points = List.of(
-                new Notification.ProgressStyle.Point(0).setColor(Color.RED),
+                new Notification.ProgressStyle.Point(1).setColor(Color.RED),
                 new Notification.ProgressStyle.Point(20).setColor(Color.BLUE));
         final NotificationProgressModel savedModel = new NotificationProgressModel(segments,
                 points,
diff --git a/data/etc/platform.xml b/data/etc/platform.xml
index baaec86..ca20aeb 100644
--- a/data/etc/platform.xml
+++ b/data/etc/platform.xml
@@ -210,6 +210,7 @@
     <assign-permission name="android.permission.STATSCOMPANION" uid="statsd" />
     <assign-permission name="android.permission.UPDATE_APP_OPS_STATS" uid="statsd" />
 
+    <assign-permission name="android.permission.REGISTER_STATS_PULL_ATOM" uid="mmd" />
     <assign-permission name="android.permission.REGISTER_STATS_PULL_ATOM" uid="gpu_service" />
     <assign-permission name="android.permission.REGISTER_STATS_PULL_ATOM" uid="keystore" />
 
diff --git a/data/fonts/script/test/test_commandline.py b/data/fonts/script/test/test_commandline.py
index 75318cc..dbcba41 100755
--- a/data/fonts/script/test/test_commandline.py
+++ b/data/fonts/script/test/test_commandline.py
@@ -75,20 +75,20 @@
         functools.partial(CommandlineTest.fileread, filemap),
     )
 
-    self.assertEquals("output.xml", args.outfile)
+    self.assertEqual("output.xml", args.outfile)
 
-    self.assertEquals(1, len(args.aliases))
-    self.assertEquals("sans-serif-thin", args.aliases[0].name)
-    self.assertEquals("sans-serif", args.aliases[0].to)
-    self.assertEquals(100, args.aliases[0].weight)
+    self.assertEqual(1, len(args.aliases))
+    self.assertEqual("sans-serif-thin", args.aliases[0].name)
+    self.assertEqual("sans-serif", args.aliases[0].to)
+    self.assertEqual(100, args.aliases[0].weight)
 
-    self.assertEquals(2, len(args.fallback))
+    self.assertEqual(2, len(args.fallback))
     # Order is not a part of expectation. Check the expected lang is included.
     langs = set(["und-Arab", "und-Ethi"])
     self.assertTrue(args.fallback[0].lang in langs)
     self.assertTrue(args.fallback[1].lang in langs)
 
-    self.assertEquals(3, len(args.families))
+    self.assertEqual(3, len(args.families))
     # Order is not a part of expectation. Check the expected name is included.
     names = set(["sans-serif", "sans-serif-condensed", "roboto-flex"])
     self.assertTrue(args.families[0].name in names)
diff --git a/data/fonts/script/test/test_xml_builder.py b/data/fonts/script/test/test_xml_builder.py
index 24a033b..f15c513 100755
--- a/data/fonts/script/test/test_xml_builder.py
+++ b/data/fonts/script/test/test_xml_builder.py
@@ -328,16 +328,16 @@
       self.expect_xml(xml)
 
   def expect_xml(self, xml):
-    self.assertEquals("sans-serif", xml.families[0].name)  # _SANS_SERIF
-    self.assertEquals("serif", xml.families[1].name)  # _SERIF
-    self.assertEquals("und-Arab", xml.families[2].lang)  # __ARABIC
-    self.assertEquals("elegant", xml.families[2].variant)
-    self.assertEquals("und-Arab", xml.families[3].lang)  # _ARABIC_UI
-    self.assertEquals("zh-Hans", xml.families[4].lang)  # _HANS (_HANS_SERIF)
-    self.assertEquals(2, len(xml.families[4].fonts))
-    self.assertEquals("serif", xml.families[4].fonts[1].fallback_for)
-    self.assertEquals("ja", xml.families[5].lang)  # _HANS (_HANS_SERIF)
-    self.assertEquals("serif", xml.families[5].fonts[1].fallback_for)
+    self.assertEqual("sans-serif", xml.families[0].name)  # _SANS_SERIF
+    self.assertEqual("serif", xml.families[1].name)  # _SERIF
+    self.assertEqual("und-Arab", xml.families[2].lang)  # __ARABIC
+    self.assertEqual("elegant", xml.families[2].variant)
+    self.assertEqual("und-Arab", xml.families[3].lang)  # _ARABIC_UI
+    self.assertEqual("zh-Hans", xml.families[4].lang)  # _HANS (_HANS_SERIF)
+    self.assertEqual(2, len(xml.families[4].fonts))
+    self.assertEqual("serif", xml.families[4].fonts[1].fallback_for)
+    self.assertEqual("ja", xml.families[5].lang)  # _HANS (_HANS_SERIF)
+    self.assertEqual("serif", xml.families[5].fonts[1].fallback_for)
 
 
 if __name__ == "__main__":
diff --git a/graphics/java/android/graphics/FrameInfo.java b/graphics/java/android/graphics/FrameInfo.java
index 8f12828..7d236d2 100644
--- a/graphics/java/android/graphics/FrameInfo.java
+++ b/graphics/java/android/graphics/FrameInfo.java
@@ -95,7 +95,8 @@
 
     // Must be the last one
     // This value must be in sync with `UI_THREAD_FRAME_INFO_SIZE` in FrameInfo.h
-    private static final int FRAME_INFO_SIZE = FRAME_INTERVAL + 1;
+    // In calculating size, + 1 for Flags, and + 1 for WorkloadTarget from FrameInfo.h
+    private static final int FRAME_INFO_SIZE = FRAME_INTERVAL + 2;
 
     /** checkstyle */
     public void setVsync(long intendedVsync, long usedVsync, long frameTimelineVsyncId,
diff --git a/graphics/java/android/graphics/HardwareRenderer.java b/graphics/java/android/graphics/HardwareRenderer.java
index 940cd93..65854dd 100644
--- a/graphics/java/android/graphics/HardwareRenderer.java
+++ b/graphics/java/android/graphics/HardwareRenderer.java
@@ -1467,6 +1467,18 @@
     public static native void preload();
 
     /**
+     * Initialize the Buffer Allocator singleton
+     *
+     * This takes 10-20ms on low-resourced devices, so doing it on-demand when an app
+     * tries to render its first frame causes drawFrames to be blocked for buffer
+     * allocation due to just initializing the allocator.
+     *
+     * Should only be called when a buffer is expected to be used.
+     * @hide
+     */
+    public static native void preInitBufferAllocator();
+
+    /**
      * @hide
      */
     protected static native boolean isWebViewOverlaysEnabled();
diff --git a/graphics/java/android/graphics/RuntimeShader.java b/graphics/java/android/graphics/RuntimeShader.java
index 3543e99..9016724 100644
--- a/graphics/java/android/graphics/RuntimeShader.java
+++ b/graphics/java/android/graphics/RuntimeShader.java
@@ -20,6 +20,7 @@
 import android.annotation.ColorLong;
 import android.annotation.FlaggedApi;
 import android.annotation.NonNull;
+import android.annotation.Nullable;
 import android.util.ArrayMap;
 import android.view.Window;
 
@@ -76,6 +77,7 @@
  * Additionally, if the shader is invoked by another using {@link #setInputShader(String, Shader)},
  * then that parent shader may modify the input coordinates arbitrarily.</p>
  *
+ * <a id="agsl-and-color-spaces"/>
  * <h3>AGSL and Color Spaces</h3>
  * <p>Android Graphics and by extension {@link RuntimeShader} are color managed.  The working
  * {@link ColorSpace} for an AGSL shader is defined to be the color space of the destination, which
@@ -267,6 +269,8 @@
     private ArrayMap<String, ColorFilter> mColorFilterUniforms = new ArrayMap<>();
     private ArrayMap<String, RuntimeXfermode> mXfermodeUniforms = new ArrayMap<>();
 
+    private ColorSpace mWorkingColorSpace = null;
+
 
     /**
      * Creates a new RuntimeShader.
@@ -286,6 +290,35 @@
     }
 
     /**
+     * Sets the working color space for this shader. That is, the shader will be evaluated
+     * in the given colorspace before being converted to the output destination's colorspace.
+     *
+     * <p>By default the RuntimeShader is evaluated in the context of the
+     * <a href="#agsl-and-color-spaces">destination colorspace</a>. By calling this method
+     * that can be overridden to force the shader to be evaluated in the given colorspace first
+     * before then being color converted to the destination colorspace.</p>
+     *
+     * @param colorSpace The ColorSpace to evaluate in. Must be an {@link ColorSpace#getModel() RGB}
+     *                   ColorSpace. Passing null restores default behavior of working in the
+     *                   destination colorspace.
+     * @throws IllegalArgumentException If the colorspace is not RGB
+     */
+    @FlaggedApi(Flags.FLAG_SHADER_COLOR_SPACE)
+    public void setWorkingColorSpace(@Nullable ColorSpace colorSpace) {
+        if (colorSpace != null && colorSpace.getModel() != ColorSpace.Model.RGB) {
+            throw new IllegalArgumentException("ColorSpace must be RGB, given " + colorSpace);
+        }
+        if (mWorkingColorSpace != colorSpace) {
+            mWorkingColorSpace = colorSpace;
+            if (mWorkingColorSpace != null) {
+                // Just to enforce this can be resolved instead of erroring out later
+                mWorkingColorSpace.getNativeInstance();
+            }
+            discardNativeInstance();
+        }
+    }
+
+    /**
      * Sets the uniform color value corresponding to this shader.  If the shader does not have a
      * uniform with that name or if the uniform is declared with a type other than vec3 or vec4 and
      * corresponding layout(color) annotation then an IllegalArgumentException is thrown.
@@ -578,7 +611,8 @@
     /** @hide */
     @Override
     protected long createNativeInstance(long nativeMatrix, boolean filterFromPaint) {
-        return nativeCreateShader(mNativeInstanceRuntimeShaderBuilder, nativeMatrix);
+        return nativeCreateShader(mNativeInstanceRuntimeShaderBuilder, nativeMatrix,
+                mWorkingColorSpace != null ? mWorkingColorSpace.getNativeInstance() : 0);
     }
 
     /** @hide */
@@ -588,7 +622,8 @@
 
     private static native long nativeGetFinalizer();
     private static native long nativeCreateBuilder(String agsl);
-    private static native long nativeCreateShader(long shaderBuilder, long matrix);
+    private static native long nativeCreateShader(long shaderBuilder, long matrix,
+            long colorSpacePtr);
     private static native void nativeUpdateUniforms(
             long shaderBuilder, String uniformName, float[] uniforms, boolean isColor);
     private static native void nativeUpdateUniforms(
diff --git a/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/BubbleControllerBubbleBarTest.kt b/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/BubbleControllerBubbleBarTest.kt
index bce6c59..a32ec22 100644
--- a/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/BubbleControllerBubbleBarTest.kt
+++ b/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/BubbleControllerBubbleBarTest.kt
@@ -61,7 +61,6 @@
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
-import org.mockito.Mockito
 import org.mockito.kotlin.mock
 import org.mockito.kotlin.whenever
 import java.util.Optional
@@ -133,7 +132,7 @@
                 mainExecutor,
                 bgExecutor,
             )
-        bubbleController.asBubbles().setSysuiProxy(Mockito.mock(SysuiProxy::class.java))
+        bubbleController.asBubbles().setSysuiProxy(mock<SysuiProxy>())
 
         shellInit.init()
 
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 88bfeb2..e865111 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
@@ -50,10 +50,10 @@
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
-import org.mockito.Mockito
 import org.mockito.kotlin.any
 import org.mockito.kotlin.mock
 import org.mockito.kotlin.never
+import org.mockito.kotlin.spy
 import org.mockito.kotlin.verify
 import java.util.concurrent.Semaphore
 import java.util.concurrent.TimeUnit
@@ -635,7 +635,7 @@
 
     @Test
     fun removeFromWindow_stopMonitoringSwipeUpGesture() {
-        bubbleStackView = Mockito.spy(bubbleStackView)
+        bubbleStackView = spy(bubbleStackView)
         InstrumentationRegistry.getInstrumentation().runOnMainSync {
             // No way to add to window in the test environment right now so just pretend
             bubbleStackView.onDetachedFromWindow()
diff --git a/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/BubbleTaskViewListenerTest.kt b/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/BubbleTaskViewListenerTest.kt
new file mode 100644
index 0000000..9ebc3d7
--- /dev/null
+++ b/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/BubbleTaskViewListenerTest.kt
@@ -0,0 +1,491 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.bubbles
+
+import android.app.Notification
+import android.app.PendingIntent
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import android.content.pm.ShortcutInfo
+import android.graphics.drawable.Icon
+import android.os.UserHandle
+import android.service.notification.NotificationListenerService.Ranking
+import android.service.notification.StatusBarNotification
+import android.view.View
+import android.widget.FrameLayout
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
+import com.android.internal.protolog.ProtoLog
+import com.android.wm.shell.R
+import com.android.wm.shell.bubbles.Bubbles.BubbleMetadataFlagListener
+import com.android.wm.shell.common.TestShellExecutor
+import com.android.wm.shell.taskview.TaskView
+import com.android.wm.shell.taskview.TaskViewController
+import com.android.wm.shell.taskview.TaskViewTaskController
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mockito
+import org.mockito.Mockito.never
+import org.mockito.Mockito.reset
+import org.mockito.kotlin.any
+import org.mockito.kotlin.anyOrNull
+import org.mockito.kotlin.doReturn
+import org.mockito.kotlin.eq
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
+
+/**
+ * Tests for [BubbleTaskViewListener].
+ */
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class BubbleTaskViewListenerTest {
+
+    private val context = ApplicationProvider.getApplicationContext<Context>()
+
+    private var taskViewController = mock<TaskViewController>()
+    private var listenerCallback = mock<BubbleTaskViewListener.Callback>()
+    private var expandedViewManager = mock<BubbleExpandedViewManager>()
+
+    private lateinit var bubbleTaskViewListener: BubbleTaskViewListener
+    private lateinit var taskView: TaskView
+    private lateinit var bubbleTaskView: BubbleTaskView
+    private lateinit var parentView: ViewPoster
+    private lateinit var mainExecutor: TestShellExecutor
+    private lateinit var bgExecutor: TestShellExecutor
+
+    @Before
+    fun setUp() {
+        ProtoLog.REQUIRE_PROTOLOGTOOL = false
+        ProtoLog.init()
+
+        parentView = ViewPoster(context)
+        mainExecutor = TestShellExecutor()
+        bgExecutor = TestShellExecutor()
+
+        taskView = TaskView(context, taskViewController, mock<TaskViewTaskController>())
+        bubbleTaskView = BubbleTaskView(taskView, mainExecutor)
+
+        bubbleTaskViewListener =
+            BubbleTaskViewListener(
+                context,
+                bubbleTaskView,
+                parentView,
+                expandedViewManager,
+                listenerCallback
+            )
+    }
+
+    @Test
+    fun createBubbleTaskViewListener_withCreatedTaskView() {
+        // Make the bubbleTaskView look like it's been created
+        val taskId = 123
+        bubbleTaskView.listener.onTaskCreated(taskId, mock<ComponentName>())
+        reset(listenerCallback)
+
+        bubbleTaskViewListener =
+            BubbleTaskViewListener(
+                context,
+                bubbleTaskView,
+                parentView,
+                expandedViewManager,
+                listenerCallback
+            )
+
+        assertThat(bubbleTaskView.delegateListener).isEqualTo(bubbleTaskViewListener)
+        assertThat(bubbleTaskViewListener.taskView).isEqualTo(bubbleTaskView.taskView)
+
+        verify(listenerCallback).onTaskCreated()
+        assertThat(bubbleTaskViewListener.taskId).isEqualTo(taskId)
+    }
+
+    @Test
+    fun createBubbleTaskViewListener() {
+        bubbleTaskViewListener =
+            BubbleTaskViewListener(
+                context,
+                bubbleTaskView,
+                parentView,
+                expandedViewManager,
+                listenerCallback
+            )
+
+        assertThat(bubbleTaskView.delegateListener).isEqualTo(bubbleTaskViewListener)
+        assertThat(bubbleTaskViewListener.taskView).isEqualTo(bubbleTaskView.taskView)
+        verify(listenerCallback, never()).onTaskCreated()
+    }
+
+    @Test
+    fun onInitialized_pendingIntentChatBubble() {
+        val target = Intent(context, TestActivity::class.java)
+        val pendingIntent = PendingIntent.getActivity(context, 0, target,
+            PendingIntent.FLAG_MUTABLE)
+
+        val b = createChatBubble("key", pendingIntent)
+        bubbleTaskViewListener.setBubble(b)
+
+        assertThat(b.isChat).isTrue()
+        // Has shortcut info
+        assertThat(b.shortcutInfo).isNotNull()
+        // But it didn't use that on bubble metadata
+        assertThat(b.metadataShortcutId).isNull()
+
+        getInstrumentation().runOnMainSync {
+            bubbleTaskViewListener.onInitialized()
+        }
+        getInstrumentation().waitForIdleSync()
+
+        // ..so it's pending intent-based, and launches that
+        assertThat(b.isPendingIntentActive).isTrue()
+        verify(taskViewController).startActivity(any(), eq(pendingIntent), any(), any(), any())
+    }
+
+    @Test
+    fun onInitialized_shortcutChatBubble() {
+        val shortcutInfo = ShortcutInfo.Builder(context)
+            .setId("mockShortcutId")
+            .build()
+        val b = createChatBubble("key", shortcutInfo)
+        bubbleTaskViewListener.setBubble(b)
+
+        assertThat(b.isChat).isTrue()
+        assertThat(b.shortcutInfo).isNotNull()
+        // Chat bubble using a shortcut
+        assertThat(b.metadataShortcutId).isNotNull()
+
+        getInstrumentation().runOnMainSync {
+            bubbleTaskViewListener.onInitialized()
+        }
+        getInstrumentation().waitForIdleSync()
+
+        assertThat(b.isPendingIntentActive).isFalse()
+        verify(taskViewController).startShortcutActivity(any(), eq(shortcutInfo), any(), any())
+    }
+
+    @Test
+    fun onInitialized_appBubble() {
+        val b = createAppBubble()
+        bubbleTaskViewListener.setBubble(b)
+
+        assertThat(b.isApp).isTrue()
+
+        getInstrumentation().runOnMainSync {
+            bubbleTaskViewListener.onInitialized()
+        }
+        getInstrumentation().waitForIdleSync()
+
+        assertThat(b.isPendingIntentActive).isFalse()
+        verify(taskViewController).startActivity(any(), any(), anyOrNull(), any(), any())
+    }
+
+    @Test
+    fun onInitialized_preparingTransition() {
+        val b = createAppBubble()
+        bubbleTaskViewListener.setBubble(b)
+        taskView = Mockito.spy(taskView)
+        val preparingTransition = mock<BubbleTransitions.BubbleTransition>()
+        b.preparingTransition = preparingTransition
+
+        getInstrumentation().runOnMainSync {
+            bubbleTaskViewListener.onInitialized()
+        }
+        getInstrumentation().waitForIdleSync()
+
+        verify(preparingTransition).surfaceCreated()
+    }
+
+    @Test
+    fun onInitialized_destroyed() {
+        val b = createAppBubble()
+        bubbleTaskViewListener.setBubble(b)
+
+        assertThat(b.isApp).isTrue()
+
+        getInstrumentation().runOnMainSync {
+            bubbleTaskViewListener.onReleased()
+            bubbleTaskViewListener.onInitialized()
+        }
+        getInstrumentation().waitForIdleSync()
+
+        verify(taskViewController, never()).startActivity(any(), any(), anyOrNull(), any(), any())
+    }
+
+    @Test
+    fun onInitialized_initialized() {
+        val b = createAppBubble()
+        bubbleTaskViewListener.setBubble(b)
+
+        assertThat(b.isApp).isTrue()
+
+        getInstrumentation().runOnMainSync {
+            bubbleTaskViewListener.onInitialized()
+        }
+        getInstrumentation().waitForIdleSync()
+
+        reset(taskViewController)
+
+        getInstrumentation().runOnMainSync {
+            bubbleTaskViewListener.onInitialized()
+        }
+        // Already initialized, so no activity should be started.
+        verify(taskViewController, never()).startActivity(any(), any(), anyOrNull(), any(), any())
+    }
+
+    @Test
+    fun onTaskCreated() {
+        val b = createAppBubble()
+        bubbleTaskViewListener.setBubble(b)
+
+        getInstrumentation().runOnMainSync {
+            bubbleTaskViewListener.onInitialized()
+        }
+        getInstrumentation().waitForIdleSync()
+        verify(taskViewController).startActivity(any(), any(), anyOrNull(), any(), any())
+
+        val taskId = 123
+        getInstrumentation().runOnMainSync {
+            bubbleTaskViewListener.onTaskCreated(taskId, mock<ComponentName>())
+        }
+        getInstrumentation().waitForIdleSync()
+
+        verify(listenerCallback).onTaskCreated()
+        verify(expandedViewManager, never()).setNoteBubbleTaskId(any(), any())
+        assertThat(bubbleTaskViewListener.taskId).isEqualTo(taskId)
+    }
+
+    @Test
+    fun onTaskCreated_noteBubble() {
+        val b = createNoteBubble()
+        bubbleTaskViewListener.setBubble(b)
+        assertThat(b.isNote).isTrue()
+
+        getInstrumentation().runOnMainSync {
+            bubbleTaskViewListener.onInitialized()
+        }
+        getInstrumentation().waitForIdleSync()
+        verify(taskViewController).startActivity(any(), any(), anyOrNull(), any(), any())
+
+        val taskId = 123
+        getInstrumentation().runOnMainSync {
+            bubbleTaskViewListener.onTaskCreated(taskId, mock<ComponentName>())
+        }
+        getInstrumentation().waitForIdleSync()
+
+        verify(listenerCallback).onTaskCreated()
+        verify(expandedViewManager).setNoteBubbleTaskId(eq(b.key), eq(taskId))
+        assertThat(bubbleTaskViewListener.taskId).isEqualTo(taskId)
+    }
+
+    @Test
+    fun onTaskVisibilityChanged_true() {
+        getInstrumentation().runOnMainSync {
+            bubbleTaskViewListener.onTaskVisibilityChanged(1, true)
+        }
+        verify(listenerCallback).onContentVisibilityChanged(eq(true))
+    }
+
+    @Test
+    fun onTaskVisibilityChanged_false() {
+        getInstrumentation().runOnMainSync {
+            bubbleTaskViewListener.onTaskVisibilityChanged(1, false)
+        }
+        verify(listenerCallback).onContentVisibilityChanged(eq(false))
+    }
+
+    @Test
+    fun onTaskRemovalStarted() {
+        val mockTaskView = mock<TaskView>()
+        bubbleTaskView = BubbleTaskView(mockTaskView, mainExecutor)
+
+        bubbleTaskViewListener =
+            BubbleTaskViewListener(
+                context,
+                bubbleTaskView,
+                parentView,
+                expandedViewManager,
+                listenerCallback
+            )
+
+        val b = createAppBubble()
+        bubbleTaskViewListener.setBubble(b)
+
+        getInstrumentation().runOnMainSync {
+            bubbleTaskViewListener.onInitialized()
+        }
+        getInstrumentation().waitForIdleSync()
+        verify(mockTaskView).startActivity(any(), anyOrNull(), any(), any())
+
+        getInstrumentation().runOnMainSync {
+            bubbleTaskViewListener.onTaskRemovalStarted(1)
+        }
+
+        verify(expandedViewManager).removeBubble(eq(b.key), eq(Bubbles.DISMISS_TASK_FINISHED))
+        verify(mockTaskView).release()
+        assertThat(parentView.lastRemovedView).isEqualTo(mockTaskView)
+        assertThat(bubbleTaskViewListener.taskView).isNull()
+        verify(listenerCallback).onTaskRemovalStarted()
+    }
+
+    @Test
+    fun onBackPressedOnTaskRoot_expanded() {
+        val taskId = 123
+        whenever(expandedViewManager.isStackExpanded()).doReturn(true)
+
+        getInstrumentation().runOnMainSync {
+            bubbleTaskViewListener.onTaskCreated(taskId, mock<ComponentName>())
+            bubbleTaskViewListener.onBackPressedOnTaskRoot(taskId)
+        }
+        verify(listenerCallback).onBackPressed()
+    }
+
+    @Test
+    fun onBackPressedOnTaskRoot_notExpanded() {
+        val taskId = 123
+        whenever(expandedViewManager.isStackExpanded()).doReturn(false)
+
+        getInstrumentation().runOnMainSync {
+            bubbleTaskViewListener.onTaskCreated(taskId, mock<ComponentName>())
+            bubbleTaskViewListener.onBackPressedOnTaskRoot(taskId)
+        }
+        verify(listenerCallback, never()).onBackPressed()
+    }
+
+    @Test
+    fun onBackPressedOnTaskRoot_taskIdMissMatch() {
+        val taskId = 123
+        whenever(expandedViewManager.isStackExpanded()).doReturn(true)
+
+        getInstrumentation().runOnMainSync {
+            bubbleTaskViewListener.onTaskCreated(taskId, mock<ComponentName>())
+            bubbleTaskViewListener.onBackPressedOnTaskRoot(42)
+        }
+        verify(listenerCallback, never()).onBackPressed()
+    }
+
+    @Test
+    fun setBubble_isNew() {
+        val b = createAppBubble()
+        val isNew = bubbleTaskViewListener.setBubble(b)
+        assertThat(isNew).isTrue()
+    }
+
+    @Test
+    fun setBubble_launchContentChanged() {
+        val target = Intent(context, TestActivity::class.java)
+        val pendingIntent = PendingIntent.getActivity(
+            context, 0, target,
+            PendingIntent.FLAG_MUTABLE
+        )
+
+        val b = createChatBubble("key", pendingIntent)
+        var isNew = bubbleTaskViewListener.setBubble(b)
+        // First time bubble is set, so it is "new"
+        assertThat(isNew).isTrue()
+
+        val b2 = createChatBubble("key", pendingIntent)
+        isNew = bubbleTaskViewListener.setBubble(b2)
+        // Second time bubble is set & it uses same type of launch content, not "new"
+        assertThat(isNew).isFalse()
+
+        val shortcutInfo = ShortcutInfo.Builder(context)
+            .setId("mockShortcutId")
+            .build()
+        val b3 = createChatBubble("key", shortcutInfo)
+        // bubble is using different content, so it is "new"
+        isNew = bubbleTaskViewListener.setBubble(b3)
+        assertThat(isNew).isTrue()
+    }
+
+    private fun createAppBubble(): Bubble {
+        val target = Intent(context, TestActivity::class.java)
+        target.setPackage(context.packageName)
+        return Bubble.createAppBubble(target, mock<UserHandle>(), mock<Icon>(),
+            mainExecutor, bgExecutor)
+    }
+
+    private fun createNoteBubble(): Bubble {
+        val target = Intent(context, TestActivity::class.java)
+        target.setPackage(context.packageName)
+        return Bubble.createNotesBubble(target, mock<UserHandle>(), mock<Icon>(),
+            mainExecutor, bgExecutor)
+    }
+
+    private fun createChatBubble(key: String, shortcutInfo: ShortcutInfo): Bubble {
+        return Bubble(
+            key,
+            shortcutInfo,
+            0 /* desiredHeight */,
+            0 /* desiredHeightResId */,
+            "title",
+            -1 /*taskId */,
+            null /* locusId */, true /* isdismissabel */,
+            mainExecutor, bgExecutor, mock<BubbleMetadataFlagListener>()
+        )
+    }
+
+    private fun createChatBubble(key: String, pendingIntent: PendingIntent): Bubble {
+        val metadata = Notification.BubbleMetadata.Builder(
+            pendingIntent,
+            Icon.createWithResource(context, R.drawable.bubble_ic_create_bubble)
+        ).build()
+        val shortcutInfo = ShortcutInfo.Builder(context)
+            .setId("shortcutId")
+            .build()
+        val notification: Notification =
+            Notification.Builder(context, key)
+                .setSmallIcon(mock<Icon>())
+                .setWhen(System.currentTimeMillis())
+                .setContentTitle("title")
+                .setContentText("content")
+                .setBubbleMetadata(metadata)
+                .build()
+        val sbn = mock<StatusBarNotification>()
+        val ranking = mock<Ranking>()
+        whenever(sbn.getNotification()).thenReturn(notification)
+        whenever(sbn.getKey()).thenReturn(key)
+        whenever(ranking.getConversationShortcutInfo()).thenReturn(shortcutInfo)
+        val entry = BubbleEntry(sbn, ranking, true, false, false, false)
+        return Bubble(
+            entry, mock<BubbleMetadataFlagListener>(), null, mainExecutor,
+            bgExecutor
+        )
+    }
+
+    /**
+     * FrameLayout that immediately runs any runnables posted to it and tracks view removals.
+     */
+    class ViewPoster(context: Context) : FrameLayout(context) {
+
+        lateinit var lastRemovedView: View
+
+        override fun post(r: Runnable): Boolean {
+            r.run()
+            return true
+        }
+
+        override fun removeView(v: View) {
+            super.removeView(v)
+            lastRemovedView = v
+        }
+    }
+}
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/UiEventSubjectTest.kt b/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/UiEventSubjectTest.kt
index af238d0..3499ee3 100644
--- a/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/UiEventSubjectTest.kt
+++ b/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/UiEventSubjectTest.kt
@@ -29,7 +29,8 @@
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
-import org.mockito.Mockito.mock
+import org.mockito.kotlin.doReturn
+import org.mockito.kotlin.mock
 import org.mockito.kotlin.whenever
 
 /** Test for [UiEventSubject] */
@@ -130,10 +131,10 @@
     }
 
     private fun createBubble(appUid: Int, packageName: String, instanceId: InstanceId): Bubble {
-        return mock(Bubble::class.java).apply {
-            whenever(getAppUid()).thenReturn(appUid)
-            whenever(getPackageName()).thenReturn(packageName)
-            whenever(getInstanceId()).thenReturn(instanceId)
+        return mock<Bubble>() {
+            on { getAppUid() } doReturn appUid
+            on { getPackageName() } doReturn packageName
+            on { getInstanceId() } doReturn instanceId
         }
     }
 
diff --git a/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/bar/BubbleBarLayerViewTest.kt b/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/bar/BubbleBarLayerViewTest.kt
index c022a29..7b583137 100644
--- a/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/bar/BubbleBarLayerViewTest.kt
+++ b/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/bar/BubbleBarLayerViewTest.kt
@@ -73,7 +73,6 @@
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
-import org.mockito.Mockito.mock
 import org.mockito.kotlin.mock
 import org.mockito.kotlin.whenever
 
@@ -127,7 +126,7 @@
                 mainExecutor,
                 bgExecutor,
             )
-        bubbleController.asBubbles().setSysuiProxy(mock(SysuiProxy::class.java))
+        bubbleController.asBubbles().setSysuiProxy(mock<SysuiProxy>())
         // Flush so that proxy gets set
         mainExecutor.flushAll()
 
diff --git a/libs/WindowManager/Shell/res/drawable/decor_handle_dark.xml b/libs/WindowManager/Shell/res/drawable/decor_handle_dark.xml
index ce24275..05c1e09 100644
--- a/libs/WindowManager/Shell/res/drawable/decor_handle_dark.xml
+++ b/libs/WindowManager/Shell/res/drawable/decor_handle_dark.xml
@@ -13,20 +13,10 @@
   ~ 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="128dp"
-    android:height="4dp"
-    android:viewportWidth="128"
-    android:viewportHeight="4"
-    >
-    <group>
-        <clip-path
-            android:pathData="M2 0H126C127.105 0 128 0.895431 128 2C128 3.10457 127.105 4 126 4H2C0.895431 4 0 3.10457 0 2C0 0.895431 0.895431 0 2 0Z"
-            />
-        <path
-            android:pathData="M0 0V4H128V0"
-            android:fillColor="@android:color/black"
-            />
-    </group>
-</vector>
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="@android:color/black"/>
+    <corners android:radius="2dp"/>
+    <size android:height="4dp"/>
+</shape>
diff --git a/libs/WindowManager/Shell/res/layout/desktop_mode_app_handle.xml b/libs/WindowManager/Shell/res/layout/desktop_mode_app_handle.xml
index 1d1cdfa..9451fd4 100644
--- a/libs/WindowManager/Shell/res/layout/desktop_mode_app_handle.xml
+++ b/libs/WindowManager/Shell/res/layout/desktop_mode_app_handle.xml
@@ -20,7 +20,7 @@
     android:id="@+id/desktop_mode_caption"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
-    android:gravity="center_horizontal">
+    android:gravity="center">
 
     <com.android.wm.shell.windowdecor.HandleImageButton
         android:id="@+id/caption_handle"
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 50c0873..477d207 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
@@ -41,7 +41,7 @@
             android:id="@+id/application_icon"
             android:layout_width="@dimen/desktop_mode_caption_icon_radius"
             android:layout_height="@dimen/desktop_mode_caption_icon_radius"
-            android:layout_marginStart="12dp"
+            android:layout_marginStart="10dp"
             android:layout_marginEnd="12dp"
             android:contentDescription="@string/app_icon_text"
             android:importantForAccessibility="no"/>
@@ -53,10 +53,9 @@
 
         <com.android.wm.shell.windowdecor.HandleMenuImageButton
             android:id="@+id/collapse_menu_button"
-            android:layout_width="32dp"
-            android:layout_height="32dp"
-            android:padding="4dp"
-            android:layout_marginEnd="14dp"
+            android:layout_width="16dp"
+            android:layout_height="16dp"
+            android:layout_marginEnd="16dp"
             android:layout_marginStart="14dp"
             android:contentDescription="@string/collapse_menu_text"
             android:src="@drawable/ic_baseline_expand_more_24"
@@ -78,40 +77,55 @@
 
         <ImageButton
             android:id="@+id/fullscreen_button"
-            android:layout_marginEnd="4dp"
+            android:paddingStart="16dp"
+            android:paddingEnd="12dp"
             android:contentDescription="@string/fullscreen_text"
             android:src="@drawable/desktop_mode_ic_handle_menu_fullscreen"
             android:tint="@androidprv:color/materialColorOnSurface"
-            android:layout_weight="1"
             style="@style/DesktopModeHandleMenuWindowingButton"/>
 
+        <Space
+            android:layout_width="0dp"
+            android:layout_height="0dp"
+            android:layout_weight="1"/>
+
         <ImageButton
             android:id="@+id/split_screen_button"
-            android:layout_marginStart="4dp"
-            android:layout_marginEnd="4dp"
+            android:paddingStart="14dp"
+            android:paddingEnd="14dp"
             android:contentDescription="@string/split_screen_text"
             android:src="@drawable/desktop_mode_ic_handle_menu_splitscreen"
             android:tint="@androidprv:color/materialColorOnSurface"
-            android:layout_weight="1"
             style="@style/DesktopModeHandleMenuWindowingButton"/>
 
+        <Space
+            android:id="@+id/floating_button_space"
+            android:layout_width="0dp"
+            android:layout_height="0dp"
+            android:layout_weight="1"/>
+
         <ImageButton
             android:id="@+id/floating_button"
-            android:layout_marginStart="4dp"
-            android:layout_marginEnd="4dp"
+            android:paddingStart="14dp"
+            android:paddingEnd="14dp"
             android:contentDescription="@string/float_button_text"
             android:src="@drawable/desktop_mode_ic_handle_menu_floating"
             android:tint="@androidprv:color/materialColorOnSurface"
-            android:layout_weight="1"
             style="@style/DesktopModeHandleMenuWindowingButton"/>
 
+        <Space
+            android:id="@+id/desktop_button_space"
+            android:layout_width="0dp"
+            android:layout_height="0dp"
+            android:layout_weight="1"/>
+
         <ImageButton
             android:id="@+id/desktop_button"
-            android:layout_marginStart="4dp"
+            android:paddingStart="12dp"
+            android:paddingEnd="16dp"
             android:contentDescription="@string/desktop_text"
             android:src="@drawable/desktop_mode_ic_handle_menu_desktop"
             android:tint="@androidprv:color/materialColorOnSurface"
-            android:layout_weight="1"
             style="@style/DesktopModeHandleMenuWindowingButton"/>
 
     </LinearLayout>
@@ -126,77 +140,33 @@
         android:elevation="@dimen/desktop_mode_handle_menu_pill_elevation"
         android:background="@drawable/desktop_mode_decor_handle_menu_background">
 
-        <LinearLayout
+        <com.android.wm.shell.windowdecor.HandleMenuActionButton
             android:id="@+id/screenshot_button"
             android:contentDescription="@string/screenshot_text"
-            style="@style/DesktopModeHandleMenuActionButtonLayout">
+            android:text="@string/screenshot_text"
+            android:src="@drawable/desktop_mode_ic_handle_menu_screenshot"
+            style="@style/DesktopModeHandleMenuActionButton"/>
 
-            <ImageView
-                android:id="@+id/image"
-                android:src="@drawable/desktop_mode_ic_handle_menu_screenshot"
-                android:importantForAccessibility="no"
-                style="@style/DesktopModeHandleMenuActionButtonImage"/>
-
-            <com.android.wm.shell.windowdecor.MarqueedTextView
-                android:id="@+id/label"
-                android:text="@string/screenshot_text"
-                style="@style/DesktopModeHandleMenuActionButtonTextView"/>
-
-        </LinearLayout>
-
-        <LinearLayout
+        <com.android.wm.shell.windowdecor.HandleMenuActionButton
             android:id="@+id/new_window_button"
             android:contentDescription="@string/new_window_text"
-            style="@style/DesktopModeHandleMenuActionButtonLayout">
+            android:text="@string/new_window_text"
+            android:src="@drawable/desktop_mode_ic_handle_menu_new_window"
+            style="@style/DesktopModeHandleMenuActionButton"/>
 
-            <ImageView
-                android:id="@+id/image"
-                android:src="@drawable/desktop_mode_ic_handle_menu_new_window"
-                android:importantForAccessibility="no"
-                style="@style/DesktopModeHandleMenuActionButtonImage"/>
-
-            <com.android.wm.shell.windowdecor.MarqueedTextView
-                android:id="@+id/label"
-                android:text="@string/new_window_text"
-                style="@style/DesktopModeHandleMenuActionButtonTextView"/>
-
-        </LinearLayout>
-
-        <LinearLayout
+        <com.android.wm.shell.windowdecor.HandleMenuActionButton
             android:id="@+id/manage_windows_button"
             android:contentDescription="@string/manage_windows_text"
-            style="@style/DesktopModeHandleMenuActionButtonLayout">
+            android:text="@string/manage_windows_text"
+            android:src="@drawable/desktop_mode_ic_handle_menu_manage_windows"
+            style="@style/DesktopModeHandleMenuActionButton"/>
 
-            <ImageView
-                android:id="@+id/image"
-                android:src="@drawable/desktop_mode_ic_handle_menu_manage_windows"
-                android:importantForAccessibility="no"
-                style="@style/DesktopModeHandleMenuActionButtonImage"/>
-
-            <com.android.wm.shell.windowdecor.MarqueedTextView
-                android:id="@+id/label"
-                android:text="@string/manage_windows_text"
-                style="@style/DesktopModeHandleMenuActionButtonTextView"/>
-
-        </LinearLayout>
-
-        <LinearLayout
+        <com.android.wm.shell.windowdecor.HandleMenuActionButton
             android:id="@+id/change_aspect_ratio_button"
             android:contentDescription="@string/change_aspect_ratio_text"
-            style="@style/DesktopModeHandleMenuActionButtonLayout">
-
-            <ImageView
-                android:id="@+id/image"
-                android:src="@drawable/desktop_mode_ic_handle_menu_change_aspect_ratio"
-                android:importantForAccessibility="no"
-                style="@style/DesktopModeHandleMenuActionButtonImage"/>
-
-            <com.android.wm.shell.windowdecor.MarqueedTextView
-                android:id="@+id/label"
-                android:text="@string/change_aspect_ratio_text"
-                style="@style/DesktopModeHandleMenuActionButtonTextView"/>
-
-        </LinearLayout>
+            android:text="@string/change_aspect_ratio_text"
+            android:src="@drawable/desktop_mode_ic_handle_menu_change_aspect_ratio"
+            style="@style/DesktopModeHandleMenuActionButton"/>
     </LinearLayout>
 
     <LinearLayout
@@ -209,29 +179,14 @@
         android:elevation="@dimen/desktop_mode_handle_menu_pill_elevation"
         android:background="@drawable/desktop_mode_decor_handle_menu_background">
 
-        <LinearLayout
+        <com.android.wm.shell.windowdecor.HandleMenuActionButton
             android:id="@+id/open_in_app_or_browser_button"
-            android:layout_width="0dp"
-            android:layout_height="match_parent"
-            android:layout_weight="1"
-            android:layout_marginEnd="8dp"
-            android:gravity="start|center_vertical"
-            android:paddingStart="16dp"
             android:contentDescription="@string/open_in_browser_text"
-            android:background="?android:selectableItemBackground">
-
-            <ImageView
-                android:id="@+id/image"
-                android:src="@drawable/desktop_mode_ic_handle_menu_open_in_browser"
-                android:importantForAccessibility="no"
-                style="@style/DesktopModeHandleMenuActionButtonImage"/>
-
-            <com.android.wm.shell.windowdecor.MarqueedTextView
-                android:id="@+id/label"
-                android:text="@string/open_in_browser_text"
-                style="@style/DesktopModeHandleMenuActionButtonTextView"/>
-
-        </LinearLayout>
+            android:text="@string/open_in_browser_text"
+            android:src="@drawable/desktop_mode_ic_handle_menu_open_in_browser"
+            style="@style/DesktopModeHandleMenuActionButton"
+            android:layout_width="0dp"
+            android:layout_weight="1"/>
 
         <ImageButton
             android:id="@+id/open_by_default_button"
diff --git a/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu_action_button.xml b/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu_action_button.xml
new file mode 100644
index 0000000..379f4e9
--- /dev/null
+++ b/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu_action_button.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2025 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/action_button"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:gravity="start|center_vertical"
+    android:paddingHorizontal="16dp"
+    android:clickable="true"
+    android:focusable="true"
+    android:orientation="horizontal"
+    android:background="?android:attr/selectableItemBackground">
+
+    <ImageView
+        android:id="@+id/image"
+        android:contentDescription="@+id/label"
+        style="@style/DesktopModeHandleMenuActionButtonImage"/>
+
+    <com.android.wm.shell.windowdecor.MarqueedTextView
+        android:id="@+id/label"
+        style="@style/DesktopModeHandleMenuActionButtonTextView"/>
+</LinearLayout>
diff --git a/libs/WindowManager/Shell/res/values-af/strings.xml b/libs/WindowManager/Shell/res/values-af/strings.xml
index 13e5f34..5444c26 100644
--- a/libs/WindowManager/Shell/res/values-af/strings.xml
+++ b/libs/WindowManager/Shell/res/values-af/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Links 50%"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Links 30%"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Volskerm regs"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Ruil apps om"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Volskerm bo"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Bo 70%"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Bo 50%"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Stel terug"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Spring na links"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Spring na regs"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Verander grootte van linkerkantse venster"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Verander grootte van regterkantse venster"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maksimeer of stel venstergrootte terug"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Gaan na deelskermmodus"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Gaan na werkskermvenstermodus"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Verander grootte van linkerkantse venster"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Verander grootte van regterkantse venster"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maksimeer of stel venstergrootte terug"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maksimeer of stel venstergrootte terug"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimeer appvenster"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"Maak By Verstek Oop-instellings"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Kies hoe om webskakels vir hierdie app oop te maak"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"In die app"</string>
diff --git a/libs/WindowManager/Shell/res/values-am/strings.xml b/libs/WindowManager/Shell/res/values-am/strings.xml
index 14a79aa..f3bc29d 100644
--- a/libs/WindowManager/Shell/res/values-am/strings.xml
+++ b/libs/WindowManager/Shell/res/values-am/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ግራ 50%"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"ግራ 30%"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"የቀኝ ሙሉ ማያ ገፅ"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"መተግበሪያዎችን ይቀያይሩ"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"የላይ ሙሉ ማያ ገፅ"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"ከላይ 70%"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"ከላይ 50%"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"ወደነበረበት መልስ"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ወደ ግራ አሳድግ"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"ወደ ቀኝ አሳድግ"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"የመተግበሪያ መስኮትን ወደ ግራ መጠን ቀይር"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"የመተግበሪያ መስኮትን ወደ ቀኝ መጠን ቀይር"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"የመስኮት መጠንን አሳድግ ወይም ወደነበረበት መልስ"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"ወደ የተከፈለ ማያ ገፅ ሁነታ ግባ"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"ወደ የዴስክቶፕ መስኮት ሁነታ ግባ"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"መስኮትን ወደ ግራ መጠን ቀይር"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"መስኮትን ወደ ቀኝ መጠን ቀይር"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"የመስኮት መጠንን አሳድግ ወይም ወደነበረበት መልስ"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"የመስኮት መጠንን አሳድግ ወይም ወደነበረበት መልስ"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"የመተግበሪያ መስኮትን አሳንስ"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"በነባሪ ቅንብሮች ክፈት"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"ለዚህ የድር መተግበሪያ አገናኙን እንዴት እንደሚከፍቱ ይምረጡ"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"በመተግበሪያው ውስጥ"</string>
diff --git a/libs/WindowManager/Shell/res/values-ar/strings.xml b/libs/WindowManager/Shell/res/values-ar/strings.xml
index 9a6869a..60f27cf 100644
--- a/libs/WindowManager/Shell/res/values-ar/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ar/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ضبط حجم النافذة اليسرى ليكون ٥٠%"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"ضبط حجم النافذة اليسرى ليكون ٣٠%"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"عرض النافذة اليمنى بملء الشاشة"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"تبديل التطبيقات"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"عرض النافذة العلوية بملء الشاشة"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"ضبط حجم النافذة العلوية ليكون ٧٠%"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"ضبط حجم النافذة العلوية ليكون ٥٠%"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"استعادة"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"المحاذاة إلى اليسار"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"المحاذاة إلى اليمين"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"تغيير حجم نافذة التطبيق بمحاذاتها إلى اليمين"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"تغيير حجم نافذة التطبيق بمحاذاتها إلى اليسار"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"تكبير حجم النافذة أو استعادته"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"تفعيل \"وضع تقسيم الشاشة\""</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"تفعيل وضع عرض المحتوى في النافذة الحالية على سطح المكتب"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"تغيير حجم النافذة بمحاذاتها إلى اليمين"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"تغيير حجم النافذة بمحاذاتها إلى اليسار"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"تكبير حجم النافذة أو استعادته"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"تكبير حجم النافذة أو استعادته"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"تصغير نافذة التطبيق"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"إعدادات الفتح تلقائيًا"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"اختيار طريقة فتح روابط الويب لهذا التطبيق"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"في التطبيق"</string>
diff --git a/libs/WindowManager/Shell/res/values-az/strings.xml b/libs/WindowManager/Shell/res/values-az/strings.xml
index 5181930..aced354 100644
--- a/libs/WindowManager/Shell/res/values-az/strings.xml
+++ b/libs/WindowManager/Shell/res/values-az/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Sol 50%"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Sol 30%"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Sağ tam ekran"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Tətbiqləri dəyişin"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Yuxarı tam ekran"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Yuxarı 70%"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Yuxarı 50%"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Bərpa edin"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Sola tərəf çəkin"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Sağa tərəf çəkin"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Tətbiq pəncərəsinin ölçüsünü sola dəyişin"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Tətbiq pəncərəsinin ölçüsünü sağa dəyişin"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Pəncərə ölçüsünü artırın və ya bərpa edin"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Bölünmüş ekran rejiminə daxil olun"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Masaüstü pəncərə rejiminə daxil olun"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Pəncərə ölçüsünü sola dəyişin"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Pəncərə ölçüsünü sağa dəyişin"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Pəncərə ölçüsünü artırın və ya bərpa edin"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Pəncərə ölçüsünü artırın və ya bərpa edin"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Tətbiq pəncərəsini kiçildin"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"Defolt ayarlarla açın"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Bu tətbiq üçün veb-linklərin necə açılacağını seçin"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Tətbiqdə"</string>
diff --git a/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml b/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml
index 92580d3..b07c612 100644
--- a/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml
+++ b/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml
@@ -125,11 +125,11 @@
     <string name="float_button_text" msgid="9221657008391364581">"Plutajuće"</string>
     <string name="select_text" msgid="5139083974039906583">"Izaberite"</string>
     <string name="screenshot_text" msgid="1477704010087786671">"Snimak ekrana"</string>
-    <string name="open_in_browser_text" msgid="9181692926376072904">"Otvorite u pregledaču"</string>
+    <string name="open_in_browser_text" msgid="9181692926376072904">"Otvori u pregledaču"</string>
     <string name="open_in_app_text" msgid="2874590745116268525">"Otvorite u aplikaciji"</string>
     <string name="new_window_text" msgid="6318648868380652280">"Novi prozor"</string>
     <string name="manage_windows_text" msgid="5567366688493093920">"Upravljajte prozorima"</string>
-    <string name="change_aspect_ratio_text" msgid="9104456064548212806">"Promenite razmeru"</string>
+    <string name="change_aspect_ratio_text" msgid="9104456064548212806">"Promeni razmeru"</string>
     <string name="close_text" msgid="4986518933445178928">"Zatvorite"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Zatvorite meni"</string>
     <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Otvorite meni"</string>
@@ -138,7 +138,7 @@
     <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Aplikacija ne može da se premesti ovde"</string>
     <string name="desktop_mode_maximize_menu_immersive_button_text" msgid="559492223133829481">"Imerzivne"</string>
     <string name="desktop_mode_maximize_menu_immersive_restore_button_text" msgid="4900114367354709257">"Vrati"</string>
-    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Uvećajte"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Uvećaj"</string>
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Vratite"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Prikačite levo"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Prikačite desno"</string>
diff --git a/libs/WindowManager/Shell/res/values-bg/strings.xml b/libs/WindowManager/Shell/res/values-bg/strings.xml
index e7feb5b..fcc4d83 100644
--- a/libs/WindowManager/Shell/res/values-bg/strings.xml
+++ b/libs/WindowManager/Shell/res/values-bg/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Ляв екран: 50%"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Ляв екран: 30%"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Десен екран: Показване на цял екран"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Размяна на приложенията"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Горен екран: Показване на цял екран"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Горен екран: 70%"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Горен екран: 50%"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Възстановяване"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Прилепване наляво"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Прилепване надясно"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Преоразмеряване на прозореца на приложението наляво"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Преоразмеряване на прозореца на приложението надясно"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Увеличаване или възстановяване на размера на прозореца"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Активиране на режима за разделен екран"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Активиране на режима за настолни компютри"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Преоразмеряване на прозореца наляво"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Преоразмеряване на прозореца надясно"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Увеличаване или възстановяване на размера на прозореца"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Увеличаване или възстановяване на размера на прозореца"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Намаляване на прозореца на приложението"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"Отваряне на настройките по подразбиране"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Изберете как да се отварят уеб връзките за това приложение"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"В приложението"</string>
diff --git a/libs/WindowManager/Shell/res/values-bn/strings.xml b/libs/WindowManager/Shell/res/values-bn/strings.xml
index f4f8877..b2c435e 100644
--- a/libs/WindowManager/Shell/res/values-bn/strings.xml
+++ b/libs/WindowManager/Shell/res/values-bn/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"৫০% বাকি আছে"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"৩০% বাকি আছে"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"ডান দিকের অংশ নিয়ে পূর্ণ স্ক্রিন"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"অ্যাপ পাল্টান"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"উপর দিকের অংশ নিয়ে পূর্ণ স্ক্রিন"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"শীর্ষ ৭০%"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"শীর্ষ ৫০%"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"ফিরিয়ে আনুন"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"বাঁদিকে স্ন্যাপ করুন"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"ডানদিকে স্ন্যাপ করুন"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"বাঁদিকে অ্যাপ উইন্ডো রিসাইজ করুন"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"ডানদিকে অ্যাপ উইন্ডো রিসাইজ করুন"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"উইন্ডো সাইজ বড় বা রিস্টোর করুন"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"স্প্লিট স্ক্রিন মোডে প্রবেশ করুন"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"ডেস্কটপ উইন্ডোইং মোডে প্রবেশ করুন"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"বাঁদিকে উইন্ডো রিসাইজ করুন"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"ডানদিকে উইন্ডো রিসাইজ করুন"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"উইন্ডো সাইজ বড় বা রিস্টোর করুন"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"উইন্ডো সাইজ বড় বা রিস্টোর করুন"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"অ্যাপ উইন্ডো ছোট করুন"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"ডিফল্ট হিসেবে থাকা সেটিংস খুলুন"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"এই অ্যাপের জন্য কীভাবে ওয়েব লিঙ্ক খুলবেন তা বেছে নিন"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"অ্যাপের মধ্যে"</string>
diff --git a/libs/WindowManager/Shell/res/values-bs/strings.xml b/libs/WindowManager/Shell/res/values-bs/strings.xml
index 12e4fc2..8c1619c 100644
--- a/libs/WindowManager/Shell/res/values-bs/strings.xml
+++ b/libs/WindowManager/Shell/res/values-bs/strings.xml
@@ -43,7 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Lijevo 50%"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Lijevo 30%"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Desno cijeli ekran"</string>
-    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Zamijeni aplikacije"</string>
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Zamjena aplikacija"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Gore cijeli ekran"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Gore 70%"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Gore 50%"</string>
@@ -138,20 +138,20 @@
     <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Ne možete premjestiti aplikaciju ovdje"</string>
     <string name="desktop_mode_maximize_menu_immersive_button_text" msgid="559492223133829481">"Uvjerljivo"</string>
     <string name="desktop_mode_maximize_menu_immersive_restore_button_text" msgid="4900114367354709257">"Vraćanje"</string>
-    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maksimiziranje"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maksimiziraj"</string>
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Vraćanje"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Pomicanje ulijevo"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Pomicanje udesno"</string>
-    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Promijeni veličinu prozora aplikacije ulijevo"</string>
-    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Promijeni veličinu prozora aplikacije udesno"</string>
-    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maksimiziraj ili vrati veličinu prozora"</string>
-    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Pokreni način podijeljenog zaslona"</string>
-    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Pokreni način prikaza u prozorima na računalu"</string>
-    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Promijeni veličinu prozora ulijevo"</string>
-    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Promijeni veličinu prozora udesno"</string>
-    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maksimiziraj ili vrati veličinu prozora"</string>
-    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maksimiziraj ili vrati veličinu prozora"</string>
-    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimiziraj prozor aplikacije"</string>
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Promjena veličine prozora aplikacije lijevo"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Promjena veličine prozora aplikacije desno"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maksimiziranje ili vraćanje veličine prozora"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Pokretanje načina rada podijeljenog ekrana"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Pokretanje načina rada s prozorima na radnoj površini"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Promjena veličine prozora i poravnanje lijevo"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Promjena veličine prozora i poravnanje desno"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maksimiziranje ili vraćanje veličine prozora"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maksimiziranje ili vraćanje veličine prozora"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimiziranje prozora aplikacije"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"Otvaranje prema zadanim postavkama"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Odaberite način otvaranja web linkova za ovu aplikaciju"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"U aplikaciji"</string>
diff --git a/libs/WindowManager/Shell/res/values-ca/strings.xml b/libs/WindowManager/Shell/res/values-ca/strings.xml
index 1623954..37802f4 100644
--- a/libs/WindowManager/Shell/res/values-ca/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ca/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Pantalla esquerra al 50%"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Pantalla esquerra al 30%"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Pantalla dreta completa"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Canvia les aplicacions"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Pantalla superior completa"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Pantalla superior al 70%"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Pantalla superior al 50%"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Restaura"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Ajusta a l\'esquerra"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Ajusta a la dreta"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Canvia la mida de la finestra de l\'aplicació a l\'esquerra"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Canvia la mida de la finestra de l\'aplicació a la dreta"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maximitza o restaura la mida de la finestra"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Entra al mode de pantalla dividida"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Entra al mode d\'enfinestrament a l\'escriptori"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Canvia la mida de la finestra a l\'esquerra"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Canvia la mida de la finestra a la dreta"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maximitza o restaura la mida de la finestra"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maximitza o restaura la mida de la finestra"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimitza la finestra de l\'aplicació"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"Configuració d\'obertura predeterminada"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Tria com vols obrir els enllaços web per a aquesta aplicació"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"A l\'aplicació"</string>
diff --git a/libs/WindowManager/Shell/res/values-cs/strings.xml b/libs/WindowManager/Shell/res/values-cs/strings.xml
index f6ac59c..c4514eb 100644
--- a/libs/WindowManager/Shell/res/values-cs/strings.xml
+++ b/libs/WindowManager/Shell/res/values-cs/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"50 % vlevo"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"30 % vlevo"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Pravá část na celou obrazovku"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Zaměnit aplikace"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Horní část na celou obrazovku"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"70 % nahoře"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"50 % nahoře"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Obnovit"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Přichytit vlevo"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Přichytit vpravo"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Změnit velikost okna aplikace vlevo"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Změnit velikost okna aplikace vpravo"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maximalizovat nebo obnovit velikost okna"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Přechod do režimu rozdělené obrazovky"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Přejít do režimu okenního systému pro počítače"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Přichytit okno vlevo"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Přichytit okno vpravo"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maximalizovat nebo obnovit velikost okna"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maximalizovat nebo obnovit velikost okna"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimalizovat okno aplikace"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"Otevírat podle výchozího nastavení"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Určete, jak se v této aplikaci mají otevírat webové odkazy"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"V aplikaci"</string>
diff --git a/libs/WindowManager/Shell/res/values-de/strings.xml b/libs/WindowManager/Shell/res/values-de/strings.xml
index d7ee8a0..7b21719 100644
--- a/libs/WindowManager/Shell/res/values-de/strings.xml
+++ b/libs/WindowManager/Shell/res/values-de/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"50 % links"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"30 % links"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Vollbild rechts"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Apps austauschen"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Vollbild oben"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"70 % oben"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"50 % oben"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Wiederherstellen"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Links andocken"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Rechts andocken"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Größe des linken App-Fensters anpassen"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Größe des rechten App-Fensters anpassen"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Fenstergröße maximieren oder wiederherstellen"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Splitscreen-Modus aktivieren"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Desktop-Fenstermodus aktivieren"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Fenstergröße links anpassen"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Fenstergröße rechts anpassen"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Fenstergröße maximieren oder wiederherstellen"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Fenstergröße maximieren oder wiederherstellen"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"App-Fenster minimieren"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"Einstellungen für die Option „Standardmäßig öffnen“"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Festlegen, wie Weblinks für diese App geöffnet werden"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"In der App"</string>
diff --git a/libs/WindowManager/Shell/res/values-el/strings.xml b/libs/WindowManager/Shell/res/values-el/strings.xml
index 4ba68b4..eb45a31 100644
--- a/libs/WindowManager/Shell/res/values-el/strings.xml
+++ b/libs/WindowManager/Shell/res/values-el/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Αριστερή 50%"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Αριστερή 30%"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Δεξιά πλήρης οθόνη"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Εναλλαγή εφαρμογών"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Πάνω πλήρης οθόνη"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Πάνω 70%"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Πάνω 50%"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Επαναφορά"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Κούμπωμα αριστερά"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Κούμπωμα δεξιά"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Αλλαγή μεγέθους παραθύρου εφαρμογής αριστερά"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Αλλαγή μεγέθους παραθύρου εφαρμογής δεξιά"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Μεγιστοποίηση ή επαναφορά μεγέθους παραθύρου"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Είσοδος στη λειτουργία διαχωρισμού οθόνης"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Είσοδος στη λειτουργία προσαρμογής σε παράθυρο υπολογιστή"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Αλλαγή μεγέθους παραθύρου προς τα αριστερά"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Αλλαγή μεγέθους παραθύρου προς τα δεξιά"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Μεγιστοποίηση ή επαναφορά μεγέθους παραθύρου"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Μεγιστοποίηση ή επαναφορά μεγέθους παραθύρου"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Ελαχιστοποίηση παραθύρου εφαρμογής"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"Άνοιγμα ρυθμίσεων από προεπιλογή"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Επιλογή τρόπου ανοίγματος συνδέσμων ιστού για την εφαρμογή"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Στην εφαρμογή"</string>
diff --git a/libs/WindowManager/Shell/res/values-en-rAU/strings.xml b/libs/WindowManager/Shell/res/values-en-rAU/strings.xml
index 8b1a14f..8dc27da 100644
--- a/libs/WindowManager/Shell/res/values-en-rAU/strings.xml
+++ b/libs/WindowManager/Shell/res/values-en-rAU/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Left 50%"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Left 30%"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Right full screen"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Swap apps"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Top full screen"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Top 70%"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Top 50%"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Restore"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Snap left"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Snap right"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Resize app window left"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Resize app window right"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maximise or restore window size"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Enter split-screen mode"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Enter desktop windowing mode"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Resize window to left"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Resize window to right"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maximise or restore window size"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maximise or restore window size"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimise app window"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"Open by default settings"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Choose how to open web links for this app"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"In the app"</string>
diff --git a/libs/WindowManager/Shell/res/values-en-rGB/strings.xml b/libs/WindowManager/Shell/res/values-en-rGB/strings.xml
index 8b1a14f..8dc27da 100644
--- a/libs/WindowManager/Shell/res/values-en-rGB/strings.xml
+++ b/libs/WindowManager/Shell/res/values-en-rGB/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Left 50%"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Left 30%"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Right full screen"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Swap apps"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Top full screen"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Top 70%"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Top 50%"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Restore"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Snap left"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Snap right"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Resize app window left"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Resize app window right"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maximise or restore window size"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Enter split-screen mode"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Enter desktop windowing mode"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Resize window to left"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Resize window to right"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maximise or restore window size"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maximise or restore window size"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimise app window"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"Open by default settings"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Choose how to open web links for this app"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"In the app"</string>
diff --git a/libs/WindowManager/Shell/res/values-en-rIN/strings.xml b/libs/WindowManager/Shell/res/values-en-rIN/strings.xml
index 8b1a14f..8dc27da 100644
--- a/libs/WindowManager/Shell/res/values-en-rIN/strings.xml
+++ b/libs/WindowManager/Shell/res/values-en-rIN/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Left 50%"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Left 30%"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Right full screen"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Swap apps"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Top full screen"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Top 70%"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Top 50%"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Restore"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Snap left"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Snap right"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Resize app window left"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Resize app window right"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maximise or restore window size"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Enter split-screen mode"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Enter desktop windowing mode"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Resize window to left"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Resize window to right"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maximise or restore window size"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maximise or restore window size"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimise app window"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"Open by default settings"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Choose how to open web links for this app"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"In the app"</string>
diff --git a/libs/WindowManager/Shell/res/values-es/strings.xml b/libs/WindowManager/Shell/res/values-es/strings.xml
index f36135e..dd9635d 100644
--- a/libs/WindowManager/Shell/res/values-es/strings.xml
+++ b/libs/WindowManager/Shell/res/values-es/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Izquierda 50%"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Izquierda 30%"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Pantalla derecha completa"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Cambiar aplicaciones"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Pantalla superior completa"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Superior 70%"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Superior 50%"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Restaurar"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Acoplar a la izquierda"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Acoplar a la derecha"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Cambiar tamaño de la ventana de la aplicación izquierda"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Cambiar tamaño de la ventana de la aplicación derecha"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maximizar o restaurar tamaño de la ventana"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Activar modo Pantalla dividida"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Activar modo Escritorio basado en ventanas"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Cambiar tamaño de la ventana a la izquierda"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Cambiar tamaño de la ventana a la derecha"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maximizar o restaurar tamaño de la ventana"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maximizar o restaurar tamaño de la ventana"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimizar ventana de la aplicación"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"Abrir con los ajustes predeterminados"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Elige cómo quieres abrir los enlaces web de esta aplicación"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"En la aplicación"</string>
diff --git a/libs/WindowManager/Shell/res/values-eu/strings.xml b/libs/WindowManager/Shell/res/values-eu/strings.xml
index b77d0eb..9898af0 100644
--- a/libs/WindowManager/Shell/res/values-eu/strings.xml
+++ b/libs/WindowManager/Shell/res/values-eu/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Ezarri ezkerraldea % 50en"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Ezarri ezkerraldea % 30en"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Ezarri eskuinaldea pantaila osoan"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Aldatu aplikazioz"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Ezarri goialdea pantaila osoan"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Ezarri goialdea % 70en"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Ezarri goialdea % 50en"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Leheneratu"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Ezarri ezkerrean"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Ezarri eskuinean"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Aldatu aplikazioaren leihoaren tamaina eta eraman ezkerrera"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Aldatu aplikazioaren leihoaren tamaina eta eraman eskuinera"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maximizatu edo leheneratu leihoaren tamaina"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Sartu pantaila zatituaren moduan"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Sartu ordenagailuan leihoak erabiltzeko moduan"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Aldatu leihoaren tamaina eta eraman ezkerrera"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Aldatu leihoaren tamaina eta eraman eskuinera"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maximizatu edo leheneratu leihoaren tamaina"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maximizatu edo leheneratu leihoaren tamaina"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimizatu aplikazioaren leihoa"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"Modu lehenetsian irekitzearen ezarpenak"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Aukeratu nola ireki sareko estekak aplikazio honetan"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Aplikazioan"</string>
diff --git a/libs/WindowManager/Shell/res/values-fi/strings.xml b/libs/WindowManager/Shell/res/values-fi/strings.xml
index 06ff6e7..b23c833 100644
--- a/libs/WindowManager/Shell/res/values-fi/strings.xml
+++ b/libs/WindowManager/Shell/res/values-fi/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Vasen 50 %"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Vasen 30 %"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Oikea koko näytölle"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Vaihda sovellusta"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Yläosa koko näytölle"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Yläosa 70 %"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Yläosa 50 %"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Palauta"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Siirrä vasemmalle"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Siirrä oikealle"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Muuta vasemmanpuoleisen sovellusikkunan kokoa"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Muuta oikeanpuoleisen sovellusikkunan kokoa"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Suurenna ikkuna tai palauta ikkunan koko"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Avaa kahtia jaettu näyttö"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Siirry työpöydän ikkunointitilaan"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Muuta vasemmanpuoleisen ikkunan kokoa"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Muuta vasemmanpuoleisen ikkunan kokoa"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Suurenna ikkuna tai palauta ikkunan koko"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Suurenna ikkuna tai palauta ikkunan koko"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Pienennä sovellusikkuna"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"Avaa oletusasetusten mukaan"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Valitse, miten verkkolinkit avataan tässä sovelluksessa"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Sovelluksessa"</string>
diff --git a/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml b/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml
index 08ff1d3..34b5b0a 100644
--- a/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml
+++ b/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"50 % à la gauche"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"30 % à la gauche"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Plein écran à la droite"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Permuter des applis"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Plein écran dans le haut"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"70 % dans le haut"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"50 % dans le haut"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Restaurer"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Épingler à gauche"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Épingler à droite"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Redimensionner la fenêtre de l\'appli à gauche"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Redimensionner la fenêtre de l\'appli à droite"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Agrandir ou restaurer la taille de la fenêtre"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Entrer en mode Écran divisé"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Entrer en mode Fenêtrage bureau"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Redimensionner la fenêtre vers la gauche"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Redimensionner la fenêtre vers la droite"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Agrandir ou restaurer la taille de la fenêtre"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Agrandir ou restaurer la taille de la fenêtre"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Réduire la fenêtre de l\'appli"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"Ouvrir les paramètres par défaut"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Choisissez comment ouvrir les liens Web pour cette appli"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Dans l\'appli"</string>
diff --git a/libs/WindowManager/Shell/res/values-fr/strings.xml b/libs/WindowManager/Shell/res/values-fr/strings.xml
index 9ced5c7..be41bba 100644
--- a/libs/WindowManager/Shell/res/values-fr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-fr/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Écran de gauche à 50 %"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Écran de gauche à 30 %"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Écran de droite en plein écran"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Échanger les applis"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Écran du haut en plein écran"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Écran du haut à 70 %"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Écran du haut à 50 %"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Restaurer"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Ancrer à gauche"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Ancrer à droite"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Redimensionner la fenêtre de l\'appli vers la gauche"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Redimensionner la fenêtre de l\'appli vers la droite"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Agrandir ou restaurer la taille de la fenêtre"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Passer en mode Écran partagé"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Activer le mode fenêtrage du bureau"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Redimensionner la fenêtre vers la gauche"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Redimensionner la fenêtre vers la droite"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Agrandir ou restaurer la taille de la fenêtre"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Agrandir ou restaurer la taille de la fenêtre"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Réduire la fenêtre de l\'application"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"Ouvrir les paramètres par défaut"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Choisir comment ouvrir les liens Web pour cette appli"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Dans l\'application"</string>
diff --git a/libs/WindowManager/Shell/res/values-gu/strings.xml b/libs/WindowManager/Shell/res/values-gu/strings.xml
index d8c422f..dcd5738 100644
--- a/libs/WindowManager/Shell/res/values-gu/strings.xml
+++ b/libs/WindowManager/Shell/res/values-gu/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ડાબે 50%"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"ડાબે 30%"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"જમણી સ્ક્રીન સ્ક્રીન"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"ઍપને સ્વૉપ કરો"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"શીર્ષ પૂર્ણ સ્ક્રીન"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"શીર્ષ 70%"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"શીર્ષ 50%"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"રિસ્ટોર કરો"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ડાબે સ્નૅપ કરો"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"જમણે સ્નૅપ કરો"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"ડાબી બાજુથી ઍપની વિન્ડોનું કદ બદલો"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"જમણી બાજુથી ઍપની વિન્ડોનું કદ બદલો"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"વિન્ડોનું કદ મહત્તમ કરો અથવા રિસ્ટોર કરો"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"સ્ક્રીન-વિભાજન મોડ દાખલ કરો"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"ડેસ્કટૉપ વિન્ડો મોડ દાખલ કરો"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"ડાબી બાજુ વિન્ડોનું કદ બદલો"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"જમણી બાજુ વિન્ડોનું કદ બદલો"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"વિન્ડોનું કદ મહત્તમ કરો અથવા રિસ્ટોર કરો"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"વિન્ડોનું કદ મહત્તમ કરો અથવા રિસ્ટોર કરો"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"ઍપની વિન્ડોને નાની કરો"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"\'ડિફૉલ્ટ તરીકે ખોલો\' સેટિંગ"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"આ ઍપ માટે વેબ લિંક ખોલવાની રીત પસંદ કરો"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"ઍપમાં"</string>
diff --git a/libs/WindowManager/Shell/res/values-hi/strings.xml b/libs/WindowManager/Shell/res/values-hi/strings.xml
index f8215af..4bf2d92 100644
--- a/libs/WindowManager/Shell/res/values-hi/strings.xml
+++ b/libs/WindowManager/Shell/res/values-hi/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"बाईं स्क्रीन को 50% बनाएं"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"बाईं स्क्रीन को 30% बनाएं"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"दाईं स्क्रीन को फ़ुल स्क्रीन बनाएं"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"ऐप्लिकेशन स्वैप करें"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"ऊपर की स्क्रीन को फ़ुल स्क्रीन बनाएं"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"ऊपर की स्क्रीन को 70% बनाएं"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"ऊपर की स्क्रीन को 50% बनाएं"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"पहले जैसा करें"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"बाईं ओर स्नैप करें"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"दाईं ओर स्नैप करें"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"ऐप्लिकेशन विंडो का साइज़ बाईं ओर से बदलें"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"ऐप्लिकेशन विंडो का साइज़ दाईं ओर से बदलें"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"विंडो को बड़ा करें या उसका साइज़ पहले जैसा करें"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"स्प्लिट स्क्रीन मोड में चालू करें"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"डेस्कटॉप विंडो मोड में जाएं"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"विंडो का साइज़ बाईं ओर से बदलें"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"विंडो का साइज़ दाईं ओर से बढ़ाएं"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"विंडो को बड़ा करें या उसका साइज़ पहले जैसा करें"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"विंडो को बड़ा करें या उसका साइज़ पहले जैसा करें"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"ऐप्लिकेशन की विंडो को छोटा करें"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"डिफ़ॉल्ट सेटिंग के हिसाब से खोलें"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"इस ऐप्लिकेशन के लिए वेब लिंक खोलने का तरीका चुनें"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"ऐप्लिकेशन में"</string>
diff --git a/libs/WindowManager/Shell/res/values-hu/strings.xml b/libs/WindowManager/Shell/res/values-hu/strings.xml
index 76e7579..546a465 100644
--- a/libs/WindowManager/Shell/res/values-hu/strings.xml
+++ b/libs/WindowManager/Shell/res/values-hu/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Bal oldali 50%-ra"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Bal oldali 30%-ra"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Jobb oldali teljes képernyőre"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Váltás az alkalmazások között"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Felső teljes képernyőre"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Felső 70%-ra"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Felső 50%-ra"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Visszaállítás"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Balra igazítás"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Jobbra igazítás"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Alkalmazásablak átméretezése balra"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Alkalmazásablak átméretezése jobbra"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Ablak teljes méretre állítása vagy visszaállítása"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Belépés osztott képernyős módba"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Asztali ablakkezelési mód indítása"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Ablak átméretezése balra"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Ablak átméretezése jobbra"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Ablak teljes méretre állítása vagy visszaállítása"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Ablak teljes méretre állítása vagy visszaállítása"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Alkalmazásablak kis méretre állítása"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"Alapértelmezett beállítások megnyitása"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Az app webes linkjeinek megnyitásához használt módszer"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Az alkalmazásban"</string>
diff --git a/libs/WindowManager/Shell/res/values-hy/strings.xml b/libs/WindowManager/Shell/res/values-hy/strings.xml
index 0eb75c7..39a395f 100644
--- a/libs/WindowManager/Shell/res/values-hy/strings.xml
+++ b/libs/WindowManager/Shell/res/values-hy/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Ձախ էկրանը՝ 50%"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Ձախ էկրանը՝ 30%"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Աջ էկրանը՝ լիաէկրան"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Հավելվածները տեղերով փոխել"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Վերևի էկրանը՝ լիաէկրան"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Վերևի էկրանը՝ 70%"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Վերևի էկրանը՝ 50%"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Վերականգնել"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Ամրացնել ձախ կողմում"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Ամրացնել աջ կողմում"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Ձգել հավելվածի պատուհանը դեպի ձախ"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Ձգել հավելվածի պատուհանը դեպի աջ"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Ծավալել կամ վերականգնել պատուհանի չափսը"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Մտնել էկրանի տրոհման ռեժիմ"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Մտնել համակարգչի ռեժիմ"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Ձգել պատուհանը դեպի ձախ"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Ձգել պատուհանը դեպի աջ"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Ծավալել կամ վերականգնել պատուհանի չափսը"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Ծավալել կամ վերականգնել պատուհանի չափսը"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Ծալել հավելվածի պատուհանը"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"Բացել կարգավորումներն ըստ կանխադրման"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Ընտրեք՝ ինչպես բացել այս հավելվածի վեբ հղումները"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Հավելվածում"</string>
diff --git a/libs/WindowManager/Shell/res/values-in/strings.xml b/libs/WindowManager/Shell/res/values-in/strings.xml
index 813e978..09ce525 100644
--- a/libs/WindowManager/Shell/res/values-in/strings.xml
+++ b/libs/WindowManager/Shell/res/values-in/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Kiri 50%"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Kiri 30%"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Layar penuh di kanan"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Ganti Aplikasi"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Layar penuh di atas"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Atas 70%"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Atas 50%"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Pulihkan"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Maksimalkan ke kiri"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Maksimalkan ke kanan"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Ubah ukuran jendela aplikasi ke kiri"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Ubah ukuran jendela aplikasi ke kanan"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maksimalkan atau pulihkan ukuran jendela"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Masuk ke mode layar terpisah"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Masuk ke mode windowing desktop"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Ubah ukuran jendela ke kiri"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Ubah ukuran jendela ke kanan"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maksimalkan atau pulihkan ukuran jendela"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maksimalkan atau pulihkan ukuran jendela"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimalkan jendela aplikasi"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"Buka dengan setelan default"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Pilih cara membuka link web untuk aplikasi ini"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Di aplikasi"</string>
diff --git a/libs/WindowManager/Shell/res/values-iw/strings.xml b/libs/WindowManager/Shell/res/values-iw/strings.xml
index 1cd89a6..b164b11 100644
--- a/libs/WindowManager/Shell/res/values-iw/strings.xml
+++ b/libs/WindowManager/Shell/res/values-iw/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"שמאלה 50%"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"שמאלה 30%"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"מסך ימני מלא"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"מעבר בין אפליקציות"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"מסך עליון מלא"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"עליון 70%"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"עליון 50%"</string>
@@ -130,7 +129,7 @@
     <string name="open_in_app_text" msgid="2874590745116268525">"פתיחה באפליקציה"</string>
     <string name="new_window_text" msgid="6318648868380652280">"חלון חדש"</string>
     <string name="manage_windows_text" msgid="5567366688493093920">"ניהול החלונות"</string>
-    <string name="change_aspect_ratio_text" msgid="9104456064548212806">"שינוי של יחס גובה-רוחב"</string>
+    <string name="change_aspect_ratio_text" msgid="9104456064548212806">"שינוי יחס הגובה-רוחב"</string>
     <string name="close_text" msgid="4986518933445178928">"סגירה"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"סגירת התפריט"</string>
     <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"פתיחת התפריט"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"שחזור"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"הצמדה לשמאל"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"הצמדה לימין"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"שינוי הגודל של חלון האפליקציה שמשמאל"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"שינוי הגודל של חלון האפליקציה שמימין"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"שחזור של גודל החלון או הגדלת החלון"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"כניסה למצב מסך מפוצל"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"כניסה למצב שינוי הגודל של החלונות בממשק המחשב"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"שינוי גודל החלון שמשמאל"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"שינוי גודל החלון שמימין"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"שחזור של גודל החלון או הגדלת החלון"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"שחזור של גודל החלון או הגדלת החלון"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"מזעור החלון של האפליקציה"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"הגדרות לפתיחה כברירת מחדל"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"כאן בוחרים איך לפתוח באפליקציה הזו קישורים לדפי אינטרנט"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"באפליקציה"</string>
diff --git a/libs/WindowManager/Shell/res/values-ka/strings.xml b/libs/WindowManager/Shell/res/values-ka/strings.xml
index 02e0f32..1be19af 100644
--- a/libs/WindowManager/Shell/res/values-ka/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ka/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"მარცხენა ეკრანი — 50%"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"მარცხენა ეკრანი — 30%"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"მარჯვენა ნაწილის სრულ ეკრანზე გაშლა"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"აპების გადართვა"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"ზედა ნაწილის სრულ ეკრანზე გაშლა"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"ზედა ეკრანი — 70%"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"ზედა ეკრანი — 50%"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"აღდგენა"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"მარცხნივ გადატანა"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"მარჯვნივ გადატანა"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"აპის მარცხენა ფანჯრის ზომის შეცვლა"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"აპის მარჯვენა ფანჯრის ზომის შეცვლა"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"ფანჯრის მაქსიმალურ ზომამდე გაზრდა ან აღდგენა"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"გაყოფილი ეკრანის რეჟიმში შესვლა"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"დესკტოპის ფანჯრის რეჟიმში შესვლა"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"ფანჯრის ზომის შეცვლა მარცხნივ"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"ფანჯრის ზომის შეცვლა მარჯვნივ"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"ფანჯრის მაქსიმალურ ზომამდე გაზრდა ან აღდგენა"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"ფანჯრის მაქსიმალურ ზომამდე გაზრდა ან აღდგენა"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"აპის ფანჯრის ზომის შემცირება"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"პარამეტრების ნაგულისხმევად გახსნა"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"ამ აპისთვის ვებ ბმულების გახსნის წესის არჩევა"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"აპში"</string>
diff --git a/libs/WindowManager/Shell/res/values-kk/strings.xml b/libs/WindowManager/Shell/res/values-kk/strings.xml
index 61c331d..5bd8519 100644
--- a/libs/WindowManager/Shell/res/values-kk/strings.xml
+++ b/libs/WindowManager/Shell/res/values-kk/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"50% сол жақта"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"30% сол жақта"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Оң жағын толық экранға шығару"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Қолданбаларды ауыстыру"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Жоғарғы жағын толық экранға шығару"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"70% жоғарғы жақта"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"50% жоғарғы жақта"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Қалпына келтіру"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Солға тіркеу"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Оңға тіркеу"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Қолданба терезесінің өлшемін сол жақтан өзгерту"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Қолданба терезесінің өлшемін оң жақтан өзгерту"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Терезе өлшемін ұлғайту не қалпына келтіру"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Экранды бөлу режиміне өту"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Жұмыс үстелінің терезе режиміне өту"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Терезе өлшемін сол жаққа өзгерту"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Терезе өлшемін оң жаққа өзгерту"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Терезе өлшемін ұлғайту не қалпына келтіру"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Терезе өлшемін ұлғайту не қалпына келтіру"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Қолданба терезесін кішірейту"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"Әдепкісінше ашу параметрлері"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Осы қолданбадағы веб-сілтемелерді ашу жолын таңдаңыз"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Қолданбада"</string>
diff --git a/libs/WindowManager/Shell/res/values-ko/strings.xml b/libs/WindowManager/Shell/res/values-ko/strings.xml
index 13c7009..65add57 100644
--- a/libs/WindowManager/Shell/res/values-ko/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ko/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"왼쪽 화면 50%"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"왼쪽 화면 30%"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"오른쪽 화면 전체화면"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"앱 전환"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"위쪽 화면 전체화면"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"위쪽 화면 70%"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"위쪽 화면 50%"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"복원"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"왼쪽으로 맞추기"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"오른쪽으로 맞추기"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"앱 창 크기 왼쪽으로 조절"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"앱 창 크기 오른쪽으로 조절"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"창 최대화 또는 크기 복원"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"화면 분할 모드 시작"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"데스크톱 창 모드 시작"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"창 크기 왼쪽으로 조절"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"창 크기 오른쪽으로 조절"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"창 최대화 또는 크기 복원"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"창 최대화 또는 크기 복원"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"앱 창 최소화"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"기본값으로 열기 설정"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"이 앱에서 웹 링크를 여는 방법을 선택하세요"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"앱에서"</string>
diff --git a/libs/WindowManager/Shell/res/values-ky/strings.xml b/libs/WindowManager/Shell/res/values-ky/strings.xml
index eb990f1..96c2226 100644
--- a/libs/WindowManager/Shell/res/values-ky/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ky/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Сол жактагы экранды 50%"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Сол жактагы экранды 30%"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Оң жактагы экранды толук экран режимине өткөрүү"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Колдонмолорду алмаштыруу"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Үстүнкү экранды толук экран режимине өткөрүү"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Үстүнкү экранды 70%"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Үстүнкү экранды 50%"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Калыбына келтирүү"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Солго жылдыруу"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Оңго жылдыруу"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Колдонмонун терезесинин өлчөмүн солго өзгөртүү"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Колдонмонун терезесинин өлчөмүн оңго өзгөртүү"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Терезенин өлчөмүн чоңойтуу же калыбына келтирүү"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Экранды бөлүү режимине өтүү"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Иш тактанын терезелери режимине өтүү"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Терезенин өлчөмүн солго өзгөртүү"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Терезенин өлчөмүн оңго өзгөртүү"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Терезенин өлчөмүн чоңойтуу же калыбына келтирүү"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Терезенин өлчөмүн чоңойтуу же калыбына келтирүү"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Колдонмонун терезесин кичирейтүү"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"Демейки шартта ачылуучу шилтемелердин параметрлери"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Колдонмодо шилтемелер кантип ачыларын тандаңыз"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Колдонмодо"</string>
diff --git a/libs/WindowManager/Shell/res/values-lo/strings.xml b/libs/WindowManager/Shell/res/values-lo/strings.xml
index 50164c0..9337efc 100644
--- a/libs/WindowManager/Shell/res/values-lo/strings.xml
+++ b/libs/WindowManager/Shell/res/values-lo/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ຊ້າຍ 50%"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"ຊ້າຍ 30%"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"ເຕັມໜ້າຈໍຂວາ"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"ສະຫຼັບແອັບ"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"ເຕັມໜ້າຈໍເທິງສຸດ"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"ເທິງສຸດ 70%"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"ເທິງສຸດ 50%"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"ກູ້ຄືນ"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ແນບຊ້າຍ"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"ແນບຂວາ"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"ປັບຂະໜາດໜ້າຈໍແອັບໄປທາງຊ້າຍ"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"ປັບຂະໜາດໜ້າຈໍແອັບໄປທາງຂວາ"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"ຂະຫຍາຍ ຫຼື ຄືນຄ່າຂະໜາດໜ້າຈໍ"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"ເຂົ້າສູ່ໂໝດແບ່ງໜ້າຈໍ"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"ເຂົ້າສູ່ໂໝດໜ້າຈໍເດັສທັອບ"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"ປັບຂະໜາດໜ້າຈໍໄປທາງຊ້າຍ"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"ປັບຂະໜາດໜ້າຈໍໄປທາງຂວາ"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"ຂະຫຍາຍ ຫຼື ຄືນຄ່າຂະໜາດໜ້າຈໍ"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"ຂະຫຍາຍ ຫຼື ຄືນຄ່າຂະໜາດໜ້າຈໍ"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"ຫຍໍ້ໜ້າຈໍແອັບ"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"ເປີດຕາມການຕັ້ງຄ່າເລີ່ມຕົ້ນ"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"ເລືອກວິທີເປີດລິ້ງເວັບສຳລັບແອັບນີ້"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"ໃນແອັບ"</string>
diff --git a/libs/WindowManager/Shell/res/values-lv/strings.xml b/libs/WindowManager/Shell/res/values-lv/strings.xml
index a5547b0..24a969b 100644
--- a/libs/WindowManager/Shell/res/values-lv/strings.xml
+++ b/libs/WindowManager/Shell/res/values-lv/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Pa kreisi 50%"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Pa kreisi 30%"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Labā daļa pa visu ekrānu"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Apmainīt lietotnes"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Augšdaļa pa visu ekrānu"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Augšdaļa 70%"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Augšdaļa 50%"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Atjaunot"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Piestiprināt pa kreisi"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Piestiprināt pa labi"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Mainīt lietotnes loga lielumu uz kreiso pusi"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Mainīt lietotnes loga lielumu uz labo pusi"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maksimizēt vai atjaunot loga lielumu"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Ieslēgt ekrāna sadalīšanas režīmu"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Ieslēgt darbvirsmas logu režīmu"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Mainīt loga lielumu uz kreiso pusi"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Mainīt loga lielumu uz labo pusi"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maksimizēt vai atjaunot loga lielumu"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maksimizēt vai atjaunot loga lielumu"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimizēt lietotnes logu"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"Atvērt pēc noklusējuma iestatījumiem"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Izvēlieties, kā atvērt šajā lietotnē norādītās saites"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Lietotnē"</string>
diff --git a/libs/WindowManager/Shell/res/values-mk/strings.xml b/libs/WindowManager/Shell/res/values-mk/strings.xml
index 6593e2d..f7177ac 100644
--- a/libs/WindowManager/Shell/res/values-mk/strings.xml
+++ b/libs/WindowManager/Shell/res/values-mk/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Левиот 50%"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Левиот 30%"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Десниот на цел екран"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Менувајте апликации"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Горниот на цел екран"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Горниот 70%"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Горниот 50%"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Врати"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Фотографирај лево"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Фотографирај десно"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Променете ја големината на прозорецот на апликацијата одлево"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Променете ја големината на прозорецот на апликацијата оддесно"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Максимизирајте или вратете ја големината на прозорецот"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Влезете во „Режим на поделен екран“"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Влезете во „Режим со прозорци на работната површина“"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Променете ја големината на прозорецот налево"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Променете ја големината на прозорецот надесно"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Максимизирајте или вратете ја големината на прозорецот"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Максимизирајте или вратете ја големината на прозорецот"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Минимизирајте го прозорецот на апликацијата"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"Отвори според стандардните поставки"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Изберете како да се отвораат линковите за апликацијава"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Во апликацијата"</string>
diff --git a/libs/WindowManager/Shell/res/values-mn/strings.xml b/libs/WindowManager/Shell/res/values-mn/strings.xml
index 8914e1f..b38026c 100644
--- a/libs/WindowManager/Shell/res/values-mn/strings.xml
+++ b/libs/WindowManager/Shell/res/values-mn/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Зүүн 50%"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Зүүн 30%"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Баруун талын бүтэн дэлгэц"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Аппуудыг солих"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Дээд талын бүтэн дэлгэц"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Дээд 70%"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Дээд 50%"</string>
@@ -130,7 +129,7 @@
     <string name="open_in_app_text" msgid="2874590745116268525">"Аппад нээх"</string>
     <string name="new_window_text" msgid="6318648868380652280">"Шинэ цонх"</string>
     <string name="manage_windows_text" msgid="5567366688493093920">"Windows-г удирдах"</string>
-    <string name="change_aspect_ratio_text" msgid="9104456064548212806">"Харьцааг өөрчлөх"</string>
+    <string name="change_aspect_ratio_text" msgid="9104456064548212806">"Аспектын харьцааг өөрчлөх"</string>
     <string name="close_text" msgid="4986518933445178928">"Хаах"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Цэсийг хаах"</string>
     <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Цэсийг нээх"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Сэргээх"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Зүүн тийш зэрэгцүүлэх"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Баруун тийш зэрэгцүүлэх"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Аппын цонхны хэмжээг зүүн тал руу өөрчлөх"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Аппын цонхны хэмжээг баруун тал руу өөрчлөх"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Цонхны хэмжээг томруулах эсвэл сэргээх"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Дэлгэц хуваах горимд орох"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Дэлгэцийн цонхны горимд орох"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Цонхны хэмжээг зүүн тал руу өөрчлөх"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Цонхны хэмжээг баруун тал руу өөрчлөх"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Цонхны хэмжээг томруулах эсвэл сэргээх"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Цонхны хэмжээг томруулах эсвэл сэргээх"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Аппын цонхыг жижгэрүүлэх"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"Өгөгдмөл тохиргоогоор нээх"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Энэ аппад веб холбоосыг хэрхэн нээхийг сонгоно уу"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Аппад"</string>
diff --git a/libs/WindowManager/Shell/res/values-mr/strings.xml b/libs/WindowManager/Shell/res/values-mr/strings.xml
index 8159479..d9c1d1f 100644
--- a/libs/WindowManager/Shell/res/values-mr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-mr/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"डावी 50%"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"डावी 30%"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"उजवी फुल स्क्रीन"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"अ‍ॅप्स स्वॅप करा"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"शीर्ष फुल स्क्रीन"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"शीर्ष 70%"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"शीर्ष 50%"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"रिस्टोअर करा"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"डावीकडे स्नॅप करा"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"उजवीकडे स्नॅप करा"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"अ‍ॅप विंडोचा डावीकडून आकार बदला"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"अ‍ॅप विंडोचा उजवीकडून आकार बदला"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"विंडोचा आकार मोठा करा किंवा रिस्टोअर करा"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"स्प्लिट स्क्रीन मोड एंटर करा"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"डेस्कटॉप विंडोइंग मोड एंटर करा"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"अ‍ॅप विंडोचा डावीकडे आकार बदला"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"अ‍ॅप विंडोचा उजवीकडे आकार बदला"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"विंडोचा आकार मोठा करा किंवा रिस्टोअर करा"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"विंडोचा आकार मोठा करा किंवा रिस्टोअर करा"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"अ‍ॅप विंडो लहान करा"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"बाय डीफॉल्ट सेटिंग्ज उघडा"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"या अ‍ॅपसाठीच्या वेब लिंक कशा उघडाव्यात हे निवडा"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"ॲपमध्ये"</string>
diff --git a/libs/WindowManager/Shell/res/values-my/strings.xml b/libs/WindowManager/Shell/res/values-my/strings.xml
index b749b67..1f4db6d 100644
--- a/libs/WindowManager/Shell/res/values-my/strings.xml
+++ b/libs/WindowManager/Shell/res/values-my/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ဘယ်ဘက် မျက်နှာပြင် ၅၀%"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"ဘယ်ဘက် မျက်နှာပြင် ၃၀%"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"ညာဘက် မျက်နှာပြင်အပြည့်"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"အက်ပ်ပြောင်းရန်"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"အပေါ်ဘက် မျက်နှာပြင်အပြည့်"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"အပေါ်ဘက် မျက်နှာပြင် ၇၀%"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"အပေါ်ဘက် မျက်နှာပြင် ၅၀%"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"ပြန်ပြောင်းရန်"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ဘယ်တွင် ချဲ့ရန်"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"ညာတွင် ချဲ့ရန်"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"အက်ပ်ဝင်းဒိုး ဘယ်ဘက်ကို အရွယ်ပြင်ရန်"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"အက်ပ်ဝင်းဒိုး ညာဘက်ကို အရွယ်ပြင်ရန်"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"ဝင်းဒိုးအရွယ်အစားကို ချဲ့ရန် (သို့) ပြန်ပြောင်းရန်"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"မျက်နှာပြင်ခွဲပြခြင်းမုဒ်သို့ ဝင်ရန်"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"ဒက်စ်တော့ ဝင်းဒိုးမုဒ်သို့ ဝင်ရန်"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"ဝင်းဒိုးကို ဘယ်ဘက်သို့ အရွယ်ပြင်ရန်"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"ဝင်းဒိုးကို ညာဘက်သို့ အရွယ်ပြင်ရန်"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"ဝင်းဒိုးအရွယ်အစားကို ချဲ့ရန် (သို့) ပြန်ပြောင်းရန်"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"ဝင်းဒိုးအရွယ်အစားကို ချဲ့ရန် (သို့) ပြန်ပြောင်းရန်"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"အက်ပ်ဝင်းဒိုးကို ချုံ့ရန်"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"မူရင်းဆက်တင်ဖြင့် ဖွင့်ရန်"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"ဤအက်ပ်အတွက် ဝဘ်လင့်ခ်များ မည်သို့ဖွင့်မည်ကို ရွေးပါ"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"အက်ပ်တွင်"</string>
diff --git a/libs/WindowManager/Shell/res/values-nb/strings.xml b/libs/WindowManager/Shell/res/values-nb/strings.xml
index 86aa196..586a50f 100644
--- a/libs/WindowManager/Shell/res/values-nb/strings.xml
+++ b/libs/WindowManager/Shell/res/values-nb/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Sett størrelsen på den venstre delen av skjermen til 50 %"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Sett størrelsen på den venstre delen av skjermen til 30 %"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Utvid den høyre delen av skjermen til hele skjermen"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Bytt apper"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Utvid den øverste delen av skjermen til hele skjermen"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Sett størrelsen på den øverste delen av skjermen til 70 %"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Sett størrelsen på den øverste delen av skjermen til 50 %"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Gjenopprett"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Fest til venstre"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Fest til høyre"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Endre størrelsen på appvinduet til venstre"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Endre størrelsen på appvinduet til høyre"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maksimer eller gjenopprett størrelsen på vinduet"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Start modusen for delt skjerm"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Start vindusmodus for skrivebordet"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Endre størrelsen på vinduet til venstre"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Endre størrelsen på vinduet til høyre"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maksimer eller gjenopprett størrelsen på vinduet"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maksimer eller gjenopprett størrelsen på vinduet"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimer appvinduet"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"Innstillinger for åpning som standard"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Velg hvordan nettlinker skal åpnes for denne appen"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"I appen"</string>
diff --git a/libs/WindowManager/Shell/res/values-ne/strings.xml b/libs/WindowManager/Shell/res/values-ne/strings.xml
index bc45b0f..f66fb1d 100644
--- a/libs/WindowManager/Shell/res/values-ne/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ne/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"बायाँ भाग ५०%"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"बायाँ भाग ३०%"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"दायाँ भाग फुल स्क्रिन"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"एपहरू अदलबदल गर्नुहोस्"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"माथिल्लो भाग फुल स्क्रिन"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"माथिल्लो भाग ७०%"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"माथिल्लो भाग ५०%"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"रिस्टोर गर्नुहोस्"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"बायाँतिर स्न्याप गर्नुहोस्"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"दायाँतिर स्न्याप गर्नुहोस्"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"एपको विन्डोको आकार बदलेर बायाँतिर लैजानुहोस्"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"एपको विन्डोको आकार बदलेर दायाँतिर लैजानुहोस्"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"विन्डोको आकार म्याक्सिमाइज गर्नुहोस् वा रिस्टोर गर्नुहोस्"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"स्प्लिट स्क्रिन मोड प्रयोग गर्नुहोस्"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"डेस्कटप विन्डोइङ मोड प्रयोग गर्नुहोस्"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"विन्डोको आकार बदलेर बायाँतिर लैजानुहोस्"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"विन्डोको आकार बदलेर दायाँतिर लैजानुहोस्"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"विन्डोको आकार म्याक्सिमाइज गर्नुहोस् वा रिस्टोर गर्नुहोस्"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"विन्डोको आकार म्याक्सिमाइज गर्नुहोस् वा रिस्टोर गर्नुहोस्"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"एपको विन्डो मिनिमाइज गर्नुहोस्"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"डिफल्ट सेटिङअनुसार खोल्नुहोस्"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"यो एपका वेब लिंकहरू खोल्ने तरिका छनौट गर्नुहोस्"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"एपमा"</string>
diff --git a/libs/WindowManager/Shell/res/values-or/strings.xml b/libs/WindowManager/Shell/res/values-or/strings.xml
index b16092e..edb5208 100644
--- a/libs/WindowManager/Shell/res/values-or/strings.xml
+++ b/libs/WindowManager/Shell/res/values-or/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ବାମ ପଟକୁ 50% କରନ୍ତୁ"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"ବାମ ପଟେ 30%"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"ଡାହାଣ ପଟକୁ ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନ୍‍ କରନ୍ତୁ"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"ଆପ୍ସ ସ୍ୱାପ କରନ୍ତୁ"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"ଉପର ଆଡ଼କୁ ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନ୍‍ କରନ୍ତୁ"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"ଉପର ଆଡ଼କୁ 70% କରନ୍ତୁ"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"ଉପର ଆଡ଼କୁ 50% କରନ୍ତୁ"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"ରିଷ୍ଟୋର କରନ୍ତୁ"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ବାମରେ ସ୍ନାପ କରନ୍ତୁ"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"ଡାହାଣରେ ସ୍ନାପ କରନ୍ତୁ"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"ଆପ ୱିଣ୍ଡୋ ରିସାଇଜ କରିବା ପାଇଁ ବାମ ବଟନ"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"ଆପ ୱିଣ୍ଡୋ ରିସାଇଜ କରିବା ପାଇଁ ଡାହାଣ ବଟନ"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"ୱିଣ୍ଡୋ ସାଇଜକୁ ମେକ୍ସିମାଇଜ କିମ୍ବା ରିଷ୍ଟୋର କରନ୍ତୁ"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନ ମୋଡରେ ପ୍ରବେଶ କରନ୍ତୁ"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"ଡେସ୍କଟପ ୱିଣ୍ଡୋଇଂ ମୋଡରେ ପ୍ରବେଶ କରନ୍ତୁ"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"ବାମପଟକୁ ୱିଣ୍ଡୋ ରିସାଇଜ କରନ୍ତୁ"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"ଡାହାଣପଟକୁ ୱିଣ୍ଡୋ ରିସାଇଜ କରନ୍ତୁ"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"ୱିଣ୍ଡୋ ସାଇଜକୁ ମେକ୍ସିମାଇଜ କିମ୍ବା ରିଷ୍ଟୋର କରନ୍ତୁ"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"ୱିଣ୍ଡୋ ସାଇଜକୁ ମେକ୍ସିମାଇଜ କିମ୍ବା ରିଷ୍ଟୋର କରନ୍ତୁ"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"ଆପ ୱିଣ୍ଡୋକୁ ମିନିମାଇଜ କରନ୍ତୁ"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"ଡିଫଲ୍ଟ ସେଟିଂସକୁ ଖୋଲନ୍ତୁ"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"ଏହି ଆପ ପାଇଁ ୱେବ ଲିଙ୍କଗୁଡ଼ିକୁ କିପରି ଖୋଲିବେ, ତାହା ବାଛନ୍ତୁ"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"ଆପରେ"</string>
diff --git a/libs/WindowManager/Shell/res/values-pl/strings.xml b/libs/WindowManager/Shell/res/values-pl/strings.xml
index d06603f..47ee80e 100644
--- a/libs/WindowManager/Shell/res/values-pl/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pl/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"50% lewej części ekranu"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"30% lewej części ekranu"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Prawa część ekranu na pełnym ekranie"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Zamień aplikacje"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Górna część ekranu na pełnym ekranie"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"70% górnej części ekranu"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"50% górnej części ekranu"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Przywróć"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Przyciągnij do lewej"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Przyciągnij do prawej"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Zmień rozmiar okna aplikacji po lewej"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Zmień rozmiar okna aplikacji po prawej"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Zmaksymalizuj lub przywróć rozmiar okna"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Włącz tryb podzielonego ekranu"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Włącz tryb okien na pulpicie"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Zmień rozmiar okna do lewej"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Zmień rozmiar okna do prawej"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Zmaksymalizuj lub przywróć rozmiar okna"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Zmaksymalizuj lub przywróć rozmiar okna"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Zminimalizuj okno aplikacji"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"Ustawienia domyślnego otwierania"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Wybierz, gdzie chcesz otwierać linki z tej aplikacji"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"W aplikacji"</string>
diff --git a/libs/WindowManager/Shell/res/values-ro/strings.xml b/libs/WindowManager/Shell/res/values-ro/strings.xml
index 3039950..a3313b6 100644
--- a/libs/WindowManager/Shell/res/values-ro/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ro/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Partea stângă: 50%"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Partea stângă: 30%"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Partea dreaptă pe ecran complet"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Comută între aplicații"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Partea de sus pe ecran complet"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Partea de sus: 70%"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Partea de sus: 50%"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Restabilește"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Trage la stânga"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Trage la dreapta"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Redimensionează fereastra aplicației la stânga"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Redimensionează fereastra aplicației la dreapta"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maximizează sau restabilește dimensiunea ferestrei"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Accesează modul ecran împărțit"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Accesează modul de windowing pe desktop"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Redimensionează fereastra la stânga"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Redimensionează fereastra la dreapta"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maximizează sau restabilește dimensiunea ferestrei"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maximizează sau restabilește dimensiunea ferestrei"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimizează fereastra aplicației"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"Setări de deschidere în mod prestabilit"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Alege modul de deschidere a linkurilor web pentru aplicație"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"În aplicație"</string>
diff --git a/libs/WindowManager/Shell/res/values-sq/strings.xml b/libs/WindowManager/Shell/res/values-sq/strings.xml
index fe03feb..fcb0aa6 100644
--- a/libs/WindowManager/Shell/res/values-sq/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sq/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Majtas 50%"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Majtas 30%"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Ekrani i plotë djathtas"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Ndërro aplikacionet"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Ekrani i plotë lart"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Lart 70%"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Lart 50%"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Restauro"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Zhvendos majtas"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Zhvendos djathtas"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Ndrysho përmasat e dritares së aplikacionit majtas"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Ndrysho përmasat e dritares së aplikacionit djathtas"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maksimizo ose restauro madhësinë e dritares"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Hyr në modalitetin e ekranit të ndarë"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Hyr në modalitetin e dritareve në desktop"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Ndrysho përmasat e dritares në të majtë"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Ndrysho përmasat e dritares në të djathtë"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maksimizo ose restauro madhësinë e dritares"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maksimizo ose restauro madhësinë e dritares"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimizo dritaren e aplikacionit"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"Hap sipas cilësimeve të parazgjedhura"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Zgjidh si do t\'i hapësh lidhjet e uebit për këtë aplikacion"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Në aplikacion"</string>
diff --git a/libs/WindowManager/Shell/res/values-sr/strings.xml b/libs/WindowManager/Shell/res/values-sr/strings.xml
index 5163fc6..6a2ffcd 100644
--- a/libs/WindowManager/Shell/res/values-sr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sr/strings.xml
@@ -125,11 +125,11 @@
     <string name="float_button_text" msgid="9221657008391364581">"Плутајуће"</string>
     <string name="select_text" msgid="5139083974039906583">"Изаберите"</string>
     <string name="screenshot_text" msgid="1477704010087786671">"Снимак екрана"</string>
-    <string name="open_in_browser_text" msgid="9181692926376072904">"Отворите у прегледачу"</string>
+    <string name="open_in_browser_text" msgid="9181692926376072904">"Отвори у прегледачу"</string>
     <string name="open_in_app_text" msgid="2874590745116268525">"Отворите у апликацији"</string>
     <string name="new_window_text" msgid="6318648868380652280">"Нови прозор"</string>
     <string name="manage_windows_text" msgid="5567366688493093920">"Управљајте прозорима"</string>
-    <string name="change_aspect_ratio_text" msgid="9104456064548212806">"Промените размеру"</string>
+    <string name="change_aspect_ratio_text" msgid="9104456064548212806">"Промени размеру"</string>
     <string name="close_text" msgid="4986518933445178928">"Затворите"</string>
     <string name="collapse_menu_text" msgid="7515008122450342029">"Затворите мени"</string>
     <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Отворите мени"</string>
@@ -138,7 +138,7 @@
     <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Апликација не може да се премести овде"</string>
     <string name="desktop_mode_maximize_menu_immersive_button_text" msgid="559492223133829481">"Имерзивне"</string>
     <string name="desktop_mode_maximize_menu_immersive_restore_button_text" msgid="4900114367354709257">"Врати"</string>
-    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Увећајте"</string>
+    <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Увећај"</string>
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Вратите"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Прикачите лево"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Прикачите десно"</string>
diff --git a/libs/WindowManager/Shell/res/values-sv/strings.xml b/libs/WindowManager/Shell/res/values-sv/strings.xml
index 29f4aab..a9df476 100644
--- a/libs/WindowManager/Shell/res/values-sv/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sv/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Vänster 50 %"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Vänster 30 %"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Helskärm på höger skärm"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Byt appar"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Helskärm på övre skärm"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Övre 70 %"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Övre 50 %"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Återställ"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Fäst till vänster"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Fäst till höger"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Ändra storlek på appfönstret åt vänster"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Ändra storlek på appfönstret åt höger"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maximera eller återställ fönsterstorleken"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Starta läget för delad skärm"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Starta datorläget"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Ändra storlek på fönstret åt vänster"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Ändra storlek på fönstret åt höger"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maximera eller återställ fönsterstorleken"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maximera eller återställ fönsterstorleken"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimera appfönstret"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"Inställningar för Öppna som standard"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Välj hur webblänkar ska öppnas för den här appen"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"I appen"</string>
diff --git a/libs/WindowManager/Shell/res/values-sw/strings.xml b/libs/WindowManager/Shell/res/values-sw/strings.xml
index 6471e3b..a3c9a0d 100644
--- a/libs/WindowManager/Shell/res/values-sw/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sw/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Kushoto 50%"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Kushoto 30%"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Skrini nzima ya kulia"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Badilisha Programu"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Skrini nzima ya juu"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Juu 70%"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Juu 50%"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Rejesha"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Telezesha kushoto"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Telezesha kulia"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Badilisha ukubwa wa dirisha la programu kushoto"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Badilisha ukubwa wa dirisha la programu kulia"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Panua au urejeshe ukubwa wa dirisha"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Ingia katika hali ya skrini iliyogawanywa"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Ingia katika hali ya madirisha ya kompyuta ya mezani"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Badilisha ukubwa wa dirisha kushoto"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Badilisha ukubwa wa dirisha kulia"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Panua au urejeshe ukubwa wa dirisha"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Panua au urejeshe ukubwa wa dirisha"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Punguza dirisha la programu"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"Fungua kwa mipangilio chaguomsingi"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Chagua jinsi ya kufungua viungo vya wavuti vya programu hii"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Kwenye programu"</string>
diff --git a/libs/WindowManager/Shell/res/values-ta/strings.xml b/libs/WindowManager/Shell/res/values-ta/strings.xml
index 03e55c8..b1b8c7f 100644
--- a/libs/WindowManager/Shell/res/values-ta/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ta/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"இடது புறம் 50%"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"இடது புறம் 30%"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"வலது புறம் முழுத் திரை"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"ஆப்ஸை மாற்றும்"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"மேற்புறம் முழுத் திரை"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"மேலே 70%"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"மேலே 50%"</string>
@@ -126,7 +125,7 @@
     <string name="float_button_text" msgid="9221657008391364581">"மிதக்கும் சாளரம்"</string>
     <string name="select_text" msgid="5139083974039906583">"தேர்ந்தெடுக்கும்"</string>
     <string name="screenshot_text" msgid="1477704010087786671">"ஸ்கிரீன்ஷாட்"</string>
-    <string name="open_in_browser_text" msgid="9181692926376072904">"உலாவியில் திறக்கும்"</string>
+    <string name="open_in_browser_text" msgid="9181692926376072904">"பிரவுசரில் திற"</string>
     <string name="open_in_app_text" msgid="2874590745116268525">"ஆப்ஸில் திறக்கும்"</string>
     <string name="new_window_text" msgid="6318648868380652280">"புதிய சாளரம்"</string>
     <string name="manage_windows_text" msgid="5567366688493093920">"சாளரங்களை நிர்வகிக்கலாம்"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"மீட்டெடுக்கும்"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"இடதுபுறம் நகர்த்தும்"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"வலதுபுறம் நகர்த்தும்"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"ஆப்ஸ் சாளரத்தின் இடதுபுறத்தில் அளவை மாற்றும்"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"ஆப்ஸ் சாளரத்தின் வலதுபுறத்தில் அளவை மாற்றும்"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"சாளரத்தின் அளவைப் பெரிதாக்கும்/மீட்டெடுக்கும்"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"திரைப் பிரிப்புப் பயன்முறையில் உள்நுழையும்"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"டெஸ்க்டாப் சாளரப் பயன்முறையில் உள்நுழையும்"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"சாளரத்தை இடதுபுறமாக அளவு மாற்றும்"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"சாளரத்தை வலதுபுறமாக அளவு மாற்றும்"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"சாளரத்தின் அளவைப் பெரிதாக்கும்/மீட்டெடுக்கும்"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"சாளரத்தின் அளவைப் பெரிதாக்கும்/மீட்டெடுக்கும்"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"ஆப்ஸ் சாளரத்தைச் சிறிதாக்கும்"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"இயல்பாக அமைப்புகளைத் திறக்கும்"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"இந்த ஆப்ஸில் வலை இணைப்புகளைத் திறக்கும் வழிமுறையைத் தேர்வுசெய்யுங்கள்"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"ஆப்ஸில்"</string>
diff --git a/libs/WindowManager/Shell/res/values-tr/strings.xml b/libs/WindowManager/Shell/res/values-tr/strings.xml
index 8d12e54..6a5d1ab 100644
--- a/libs/WindowManager/Shell/res/values-tr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-tr/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Solda %50"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Solda %30"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Sağda tam ekran"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Uygulamaların Yerini Değiştir"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Üstte tam ekran"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Üstte %70"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Üstte %50"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Geri yükle"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Sola tuttur"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Sağa tuttur"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Uygulama penceresini sola yeniden boyutlandır"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Uygulama penceresini sağa yeniden boyutlandır"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Pencereyi ekranı kaplayacak şekilde büyüt veya önceki boyutuna döndür"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Bölünmüş ekran moduna gir"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Masaüstü pencereleme moduna gir"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Pencereyi sola yeniden boyutlandır"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Pencereyi sağa yeniden boyutlandır"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Pencereyi ekranı kaplayacak şekilde büyüt veya önceki boyutuna döndür"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Pencereyi ekranı kaplayacak şekilde büyüt veya önceki boyutuna döndür"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Uygulama penceresini küçült"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"Varsayılan olarak açma ayarları"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Bu uygulama için web bağlantılarının nasıl açılacağını seçin"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Uygulamada"</string>
diff --git a/libs/WindowManager/Shell/res/values-uk/strings.xml b/libs/WindowManager/Shell/res/values-uk/strings.xml
index 66d8a62..7f4e91d 100644
--- a/libs/WindowManager/Shell/res/values-uk/strings.xml
+++ b/libs/WindowManager/Shell/res/values-uk/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Ліве вікно на 50%"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Ліве вікно на 30%"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Праве вікно на весь екран"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Поміняти додатки місцями"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Верхнє вікно на весь екран"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Верхнє вікно на 70%"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Верхнє вікно на 50%"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Відновити"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Закріпити ліворуч"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Закріпити праворуч"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Змінити розмір вікна додатка ліворуч"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Змінити розмір вікна додатка праворуч"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Розгорнути вікно або відновити його розмір"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Увімкнути режим розділення екрана"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Увімкнути режим вікон для комп’ютера"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Змінити розмір вікна ліворуч"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Змінити розмір вікна праворуч"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Розгорнути вікно або відновити його розмір"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Розгорнути вікно або відновити його розмір"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Згорнути вікно додатка"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"Налаштування \"Відкривати за умовчанням\""</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Виберіть, як відкривати вебпосилання в цьому додатку"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"У додатку"</string>
diff --git a/libs/WindowManager/Shell/res/values-ur/strings.xml b/libs/WindowManager/Shell/res/values-ur/strings.xml
index 653ba0e6..f461d40 100644
--- a/libs/WindowManager/Shell/res/values-ur/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ur/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"بائیں %50"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"بائیں %30"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"دائیں فل اسکرین"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"ایپس سویپ کریں"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"بالائی فل اسکرین"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"اوپر %70"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"اوپر %50"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"بحال کریں"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"دائیں منتقل کریں"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"بائیں منتقل کریں"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"دائیں طرف ایپ ونڈو کا سائز تبدیل کریں"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"ایپ ونڈو کا سائز بائیں طرف تبدیل کریں"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"ونڈو کا سائز زیادہ سے زیادہ یا بحال کریں"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"سپلٹ اسکرین موڈ میں داخل ہوں"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"ڈیسک ٹاپ ونڈو وضع میں داخل ہوں"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"دائیں طرف ونڈو کا سائز تبدیل کریں"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"ونڈو کا سائز بائیں طرف تبدیل کریں"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"ونڈو کا سائز زیادہ سے زیادہ یا بحال کریں"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"ونڈو کا سائز زیادہ سے زیادہ یا بحال کریں"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"ایپ ونڈو کو چھوٹا کریں"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"بطور ڈیفالٹ ترتیبات کھولیں"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"اس ایپ کے لیے ویب لنکس کھولنے کا طریقہ منتخب کریں"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"ایپ میں"</string>
diff --git a/libs/WindowManager/Shell/res/values-vi/strings.xml b/libs/WindowManager/Shell/res/values-vi/strings.xml
index f1b728b..e7cacc3 100644
--- a/libs/WindowManager/Shell/res/values-vi/strings.xml
+++ b/libs/WindowManager/Shell/res/values-vi/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Trái 50%"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Trái 30%"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Toàn màn hình bên phải"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Hoán đổi ứng dụng"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Toàn màn hình phía trên"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Trên 70%"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Trên 50%"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Khôi phục"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Di chuyển nhanh sang trái"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Di chuyển nhanh sang phải"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Đổi kích thước và chuyển cửa sổ ứng dụng sang trái"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Đổi kích thước và chuyển cửa sổ ứng dụng sang phải"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Phóng to hoặc khôi phục kích thước cửa sổ"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Mở chế độ chia đôi màn hình"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Mở chế độ cửa sổ trên máy tính"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Đổi kích thước và chuyển cửa sổ sang trái"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Đổi kích thước và chuyển cửa sổ sang phải"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Phóng to hoặc khôi phục kích thước cửa sổ"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Phóng to hoặc khôi phục kích thước cửa sổ"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Thu nhỏ cửa sổ ứng dụng"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"Mở các chế độ cài đặt theo mặc định"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Chọn cách mở đường liên kết trang web cho ứng dụng này"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Trong ứng dụng"</string>
diff --git a/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml b/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml
index 5437808..562a0ee0 100644
--- a/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml
+++ b/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"左侧 50%"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"左侧 30%"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"右侧全屏"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"交换应用位置"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"顶部全屏"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"顶部 70%"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"顶部 50%"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"恢复"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"贴靠左侧"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"贴靠右侧"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"调整应用窗口大小并贴靠左侧"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"调整应用窗口大小并贴靠右侧"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"将窗口最大化或恢复大小"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"进入分屏模式"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"进入桌面设备窗口化模式"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"调整窗口大小并贴靠左侧"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"调整窗口大小并贴靠右侧"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"将窗口最大化或恢复大小"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"将窗口最大化或恢复大小"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"将应用窗口最小化"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"默认打开设置"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"选择如何打开此应用中的网页链接"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"在此应用内"</string>
diff --git a/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml b/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml
index 938024d..eecd9f2 100644
--- a/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml
+++ b/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"左邊 50%"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"左邊 30%"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"右邊全螢幕"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"切換應用程式"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"頂部全螢幕"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"頂部 70%"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"頂部 50%"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"還原"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"貼齊左邊"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"貼齊右邊"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"調整左邊應用程式視窗大小"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"調整右邊應用程式視窗大小"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"將視窗放到最大或者還原視窗大小"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"進入分割螢幕模式"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"進入桌面視窗模式"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"將視窗移去左邊調整大小"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"將視窗移去右邊調整大小"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"將視窗放到最大或者還原視窗大小"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"將視窗放到最大或者還原視窗大小"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"將應用程式視窗縮到最細"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"採用預設設定打開"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"選擇此應用程式開啟網絡連結的方式"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"在應用程式內"</string>
diff --git a/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml b/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml
index 3a5a87d..c157c193 100644
--- a/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml
+++ b/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"以 50% 的螢幕空間顯示左側畫面"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"以 30% 的螢幕空間顯示左側畫面"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"以全螢幕顯示右側畫面"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"切換應用程式"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"以全螢幕顯示頂端畫面"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"以 70% 的螢幕空間顯示頂端畫面"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"以 50% 的螢幕空間顯示頂端畫面"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"還原"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"靠左對齊"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"靠右對齊"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"調整應用程式視窗大小並向左貼齊"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"調整應用程式視窗大小並向右貼齊"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"將視窗最大化或還原大小"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"進入分割畫面模式"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"進入電腦視窗化模式"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"調整應用程式視窗大小並向左貼齊"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"調整應用程式視窗大小並向右貼齊"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"將視窗最大化或還原大小"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"將視窗最大化或還原大小"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"將應用程式視窗最小化"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"開啟連結的預設設定"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"選擇如何開啟這個應用程式的網頁連結"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"使用應用程式"</string>
diff --git a/libs/WindowManager/Shell/res/values-zu/strings.xml b/libs/WindowManager/Shell/res/values-zu/strings.xml
index cba8e04..a7ba6d2 100644
--- a/libs/WindowManager/Shell/res/values-zu/strings.xml
+++ b/libs/WindowManager/Shell/res/values-zu/strings.xml
@@ -43,8 +43,7 @@
     <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Kwesokunxele ngo-50%"</string>
     <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Kwesokunxele ngo-30%"</string>
     <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Isikrini esigcwele esingakwesokudla"</string>
-    <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
-    <skip />
+    <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Shintsha ama-app"</string>
     <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Isikrini esigcwele esiphezulu"</string>
     <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Okuphezulu okungu-70%"</string>
     <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Okuphezulu okungu-50%"</string>
@@ -143,26 +142,16 @@
     <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Buyisela"</string>
     <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Chofoza kwesobunxele"</string>
     <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Chofoza kwesokudla"</string>
-    <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
-    <skip />
-    <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
-    <skip />
-    <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
-    <skip />
-    <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
-    <skip />
-    <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
-    <skip />
-    <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
-    <skip />
+    <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Shintsha usayizi we-app yewindi ngakwesokunxele"</string>
+    <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Shintsha usayizi we-app yewindi ngakwesokudla"</string>
+    <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Khulisa noma buyisela usayizi wewindi"</string>
+    <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Faka imodi yokuhlukanisa isikrini"</string>
+    <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Faka imodi yokwenza iwindi yedeskithophu"</string>
+    <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Shintsha usayizi wewindi ngakwesokunxele"</string>
+    <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Shintsha usayizi wewindi ngakwesokudla"</string>
+    <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Khulisa noma buyisela usayizi wewindi"</string>
+    <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Khulisa noma buyisela usayizi wewindi"</string>
+    <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Nciphisa iwindi le-app"</string>
     <string name="open_by_default_settings_text" msgid="2526548548598185500">"Vula amasethingi ngokuzenzakalela"</string>
     <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Khetha indlela yokuvula amalinki ewebhu ale app"</string>
     <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Ku-app"</string>
diff --git a/libs/WindowManager/Shell/res/values/attrs.xml b/libs/WindowManager/Shell/res/values/attrs.xml
index fbb5caa..4ba0468 100644
--- a/libs/WindowManager/Shell/res/values/attrs.xml
+++ b/libs/WindowManager/Shell/res/values/attrs.xml
@@ -23,4 +23,11 @@
     <declare-styleable name="MessageState">
         <attr name="state_task_focused" format="boolean"/>
     </declare-styleable>
+
+    <declare-styleable name="HandleMenuActionButton">
+        <attr name="android:text" format="string" />
+        <attr name="android:textColor" format="color" />
+        <attr name="android:src" format="reference" />
+        <attr name="android:drawableTint" format="color" />
+    </declare-styleable>
 </resources>
diff --git a/libs/WindowManager/Shell/res/values/dimen.xml b/libs/WindowManager/Shell/res/values/dimen.xml
index e23d572..e395341 100644
--- a/libs/WindowManager/Shell/res/values/dimen.xml
+++ b/libs/WindowManager/Shell/res/values/dimen.xml
@@ -447,6 +447,17 @@
         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>
 
+    <!-- Horizontal padding for desktop mode caption in default unhovered untouched state. -->
+    <dimen name="desktop_mode_fullscreen_decor_caption_horizontal_padding_default">10dp</dimen>
+
+    <!-- Horizontal padding for desktop mode caption when hovered.
+        1/2 * (100 dp of total width - 80 dp for handle * 1.2 scaling factor). -->
+    <dimen name="desktop_mode_fullscreen_decor_caption_horizontal_padding_hovered">2dp</dimen>
+
+    <!-- Horizontal padding for desktop mode caption when touched.
+        1/2 * (100 dp of total width - 80 dp for handle * 0.85 scaling factor). -->
+    <dimen name="desktop_mode_fullscreen_decor_caption_horizontal_padding_touched">16dp</dimen>
+
     <!-- Required empty space to be visible for partially offscreen tasks. -->
     <dimen name="freeform_required_visible_empty_space_in_header">48dp</dimen>
 
@@ -570,7 +581,7 @@
     <dimen name="desktop_mode_handle_menu_corner_radius">26dp</dimen>
 
     <!-- The radius of the caption menu icon. -->
-    <dimen name="desktop_mode_caption_icon_radius">24dp</dimen>
+    <dimen name="desktop_mode_caption_icon_radius">32dp</dimen>
 
     <!-- The radius of the caption menu shadow. -->
     <dimen name="desktop_mode_handle_menu_shadow_radius">2dp</dimen>
diff --git a/libs/WindowManager/Shell/res/values/strings.xml b/libs/WindowManager/Shell/res/values/strings.xml
index a2231dd..1b7daa8 100644
--- a/libs/WindowManager/Shell/res/values/strings.xml
+++ b/libs/WindowManager/Shell/res/values/strings.xml
@@ -290,7 +290,7 @@
     <!-- Accessibility text for the handle fullscreen button [CHAR LIMIT=NONE] -->
     <string name="fullscreen_text">Fullscreen</string>
     <!-- Accessibility text for the handle desktop button [CHAR LIMIT=NONE] -->
-    <string name="desktop_text">Desktop Mode</string>
+    <string name="desktop_text">Desktop View</string>
     <!-- Accessibility text for the handle split screen button [CHAR LIMIT=NONE] -->
     <string name="split_screen_text">Split Screen</string>
     <!-- Accessibility text for the handle more options button [CHAR LIMIT=NONE] -->
@@ -316,7 +316,7 @@
     <!-- Accessibility text for the handle menu close menu button [CHAR LIMIT=NONE] -->
     <string name="collapse_menu_text">Close Menu</string>
     <!-- Accessibility text for the App Header's App Chip [CHAR LIMIT=NONE] -->
-    <string name="desktop_mode_app_header_chip_text">Open Menu</string>
+    <string name="desktop_mode_app_header_chip_text"><xliff:g id="app_name" example="Chrome">%1$s</xliff:g> (Desktop View)</string>
     <!-- Maximize menu maximize button string. -->
     <string name="desktop_mode_maximize_menu_maximize_text">Maximize Screen</string>
     <!-- Maximize menu snap buttons string. -->
@@ -342,10 +342,10 @@
     <!-- Accessibility text for the Maximize Menu's snap maximize/restore [CHAR LIMIT=NONE] -->
     <string name="desktop_mode_a11y_action_maximize_restore">Maximize or restore window size</string>
 
-    <!-- Accessibility action replacement for caption handle menu split screen button [CHAR LIMIT=NONE] -->
-    <string name="app_handle_menu_talkback_split_screen_mode_button_text">Enter split screen mode</string>
-    <!-- Accessibility action replacement for caption handle menu enter desktop mode button [CHAR LIMIT=NONE] -->
-    <string name="app_handle_menu_talkback_desktop_mode_button_text">Enter desktop windowing mode</string>
+    <!-- Accessibility action replacement for caption handle app chip buttons [CHAR LIMIT=NONE] -->
+    <string name="app_handle_chip_accessibility_announce">Open Menu</string>
+    <!-- Accessibility action replacement for caption handle menu buttons [CHAR LIMIT=NONE] -->
+    <string name="app_handle_menu_accessibility_announce">Enter <xliff:g id="windowing_mode" example="Desktop View">%1$s</xliff:g></string>
     <!-- Accessibility action replacement for maximize menu enter snap left button [CHAR LIMIT=NONE] -->
     <string name="maximize_menu_talkback_action_snap_left_text">Resize window to left</string>
     <!-- Accessibility action replacement for maximize menu enter snap right button [CHAR LIMIT=NONE] -->
diff --git a/libs/WindowManager/Shell/res/values/styles.xml b/libs/WindowManager/Shell/res/values/styles.xml
index 035004b..637b47a 100644
--- a/libs/WindowManager/Shell/res/values/styles.xml
+++ b/libs/WindowManager/Shell/res/values/styles.xml
@@ -40,13 +40,11 @@
         <item name="android:activityCloseExitAnimation">@anim/forced_resizable_exit</item>
     </style>
 
-    <style name="DesktopModeHandleMenuActionButtonLayout">
+    <style name="DesktopModeHandleMenuActionButton">
         <item name="android:layout_width">match_parent</item>
         <item name="android:layout_height">52dp</item>
-        <item name="android:layout_weight">1</item>
-        <item name="android:gravity">start|center_vertical</item>
-        <item name="android:paddingHorizontal">16dp</item>
-        <item name="android:background">?android:selectableItemBackground</item>
+        <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
+        <item name="android:drawableTint">@androidprv:color/materialColorOnSurface</item>
     </style>
 
     <style name="DesktopModeHandleMenuActionButtonImage">
@@ -71,7 +69,6 @@
     <style name="DesktopModeHandleMenuWindowingButton">
         <item name="android:layout_width">48dp</item>
         <item name="android:layout_height">48dp</item>
-        <item name="android:padding">14dp</item>
         <item name="android:scaleType">fitCenter</item>
         <item name="android:background">?android:selectableItemBackgroundBorderless</item>
     </style>
diff --git a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/res/layout/input_view.xml b/libs/WindowManager/Shell/shared/res/color/bubble_drop_target_background_color.xml
similarity index 61%
rename from services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/res/layout/input_view.xml
rename to libs/WindowManager/Shell/shared/res/color/bubble_drop_target_background_color.xml
index f229270..975d25b 100644
--- a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/res/layout/input_view.xml
+++ b/libs/WindowManager/Shell/shared/res/color/bubble_drop_target_background_color.xml
@@ -1,6 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2022 The Android Open Source Project
+<?xml version="1.0" encoding="utf-8"?><!--
+  ~ Copyright (C) 2025 The Android Open Source Project
   ~
   ~ Licensed under the Apache License, Version 2.0 (the "License");
   ~ you may not use this file except in compliance with the License.
@@ -15,8 +14,7 @@
   ~ limitations under the License.
   -->
 
-<FrameLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/input"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"/>
\ No newline at end of file
+<selector xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
+    <item android:alpha="0.35" android:color="@androidprv:color/materialColorPrimaryContainer" />
+</selector>
diff --git a/libs/WindowManager/Shell/shared/res/drawable/bubble_drop_target_background.xml b/libs/WindowManager/Shell/shared/res/drawable/bubble_drop_target_background.xml
new file mode 100644
index 0000000..89546f9
--- /dev/null
+++ b/libs/WindowManager/Shell/shared/res/drawable/bubble_drop_target_background.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  ~ Copyright (C) 2025 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT 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="28dp" />
+    <solid android:color="@color/bubble_drop_target_background_color" />
+    <stroke
+        android:width="1dp"
+        android:color="@androidprv:color/materialColorPrimaryContainer" />
+</shape>
diff --git a/libs/WindowManager/Shell/shared/res/values/dimen.xml b/libs/WindowManager/Shell/shared/res/values/dimen.xml
index d280083..5f013c5 100644
--- a/libs/WindowManager/Shell/shared/res/values/dimen.xml
+++ b/libs/WindowManager/Shell/shared/res/values/dimen.xml
@@ -36,4 +36,13 @@
     <dimen name="drag_zone_v_split_from_expanded_view_height_tablet">285dp</dimen>
     <dimen name="drag_zone_v_split_from_expanded_view_height_fold_tall">150dp</dimen>
     <dimen name="drag_zone_v_split_from_expanded_view_height_fold_short">100dp</dimen>
+
+    <!-- Bubble drop target dimensions -->
+    <dimen name="drop_target_full_screen_padding">20dp</dimen>
+    <dimen name="drop_target_desktop_window_padding_small">100dp</dimen>
+    <dimen name="drop_target_desktop_window_padding_large">130dp</dimen>
+    <dimen name="drop_target_expanded_view_width">364</dimen>
+    <dimen name="drop_target_expanded_view_height">578</dimen>
+    <dimen name="drop_target_expanded_view_padding_bottom">108</dimen>
+    <dimen name="drop_target_expanded_view_padding_horizontal">24</dimen>
 </resources>
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/bubbles/BubbleBarLocation.kt b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/bubbles/BubbleBarLocation.kt
index 481fc7f..6acd9db 100644
--- a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/bubbles/BubbleBarLocation.kt
+++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/bubbles/BubbleBarLocation.kt
@@ -70,7 +70,8 @@
         UpdateSource.A11Y_ACTION_BAR,
         UpdateSource.A11Y_ACTION_BUBBLE,
         UpdateSource.A11Y_ACTION_EXP_VIEW,
-        UpdateSource.APP_ICON_DRAG
+        UpdateSource.APP_ICON_DRAG,
+        UpdateSource.DRAG_TASK,
     )
     @Retention(AnnotationRetention.SOURCE)
     annotation class UpdateSource {
@@ -95,6 +96,9 @@
 
             /** Location changed from dragging the application icon to the bubble bar */
             const val APP_ICON_DRAG = 7
+
+            /** Location changed from dragging a running task to the bubble bar */
+            const val DRAG_TASK = 8
         }
     }
 }
diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/bubbles/DragZoneFactory.kt b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/bubbles/DragZoneFactory.kt
index 909e9d2..1a80b0f 100644
--- a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/bubbles/DragZoneFactory.kt
+++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/bubbles/DragZoneFactory.kt
@@ -18,6 +18,7 @@
 
 import android.content.Context
 import android.graphics.Rect
+import android.util.TypedValue
 import androidx.annotation.DimenRes
 import com.android.wm.shell.shared.R
 import com.android.wm.shell.shared.bubbles.DragZoneFactory.SplitScreenModeChecker.SplitScreenMode
@@ -50,6 +51,60 @@
     private var vSplitFromExpandedViewDragZoneHeightFoldTall = 0
     private var vSplitFromExpandedViewDragZoneHeightFoldShort = 0
 
+    private var fullScreenDropTargetPadding = 0
+    private var desktopWindowDropTargetPaddingSmall = 0
+    private var desktopWindowDropTargetPaddingLarge = 0
+    private var expandedViewDropTargetWidth = 0
+    private var expandedViewDropTargetHeight = 0
+    private var expandedViewDropTargetPaddingBottom = 0
+    private var expandedViewDropTargetPaddingHorizontal = 0
+
+    private val fullScreenDropTarget: Rect
+        get() =
+            Rect(windowBounds).apply {
+                inset(fullScreenDropTargetPadding, fullScreenDropTargetPadding)
+            }
+
+    private val desktopWindowDropTarget: Rect
+        get() =
+            Rect(windowBounds).apply {
+                if (deviceConfig.isLandscape) {
+                    inset(
+                        /* dx= */ desktopWindowDropTargetPaddingLarge,
+                        /* dy= */ desktopWindowDropTargetPaddingSmall
+                    )
+                } else {
+                    inset(
+                        /* dx= */ desktopWindowDropTargetPaddingSmall,
+                        /* dy= */ desktopWindowDropTargetPaddingLarge
+                    )
+                }
+            }
+
+    private val expandedViewDropTargetLeft: Rect
+        get() =
+            Rect(
+                expandedViewDropTargetPaddingHorizontal,
+                windowBounds.bottom -
+                    expandedViewDropTargetPaddingBottom -
+                    expandedViewDropTargetHeight,
+                expandedViewDropTargetWidth + expandedViewDropTargetPaddingHorizontal,
+                windowBounds.bottom - expandedViewDropTargetPaddingBottom
+            )
+
+    private val expandedViewDropTargetRight: Rect
+        get() =
+            Rect(
+                windowBounds.right -
+                    expandedViewDropTargetPaddingHorizontal -
+                    expandedViewDropTargetWidth,
+                windowBounds.bottom -
+                    expandedViewDropTargetPaddingBottom -
+                    expandedViewDropTargetHeight,
+                windowBounds.right - expandedViewDropTargetPaddingHorizontal,
+                windowBounds.bottom - expandedViewDropTargetPaddingBottom
+            )
+
     init {
         onConfigurationUpdated()
     }
@@ -88,11 +143,32 @@
             context.resolveDimension(R.dimen.drag_zone_v_split_from_expanded_view_height_fold_tall)
         vSplitFromExpandedViewDragZoneHeightFoldShort =
             context.resolveDimension(R.dimen.drag_zone_v_split_from_expanded_view_height_fold_short)
+        fullScreenDropTargetPadding =
+            context.resolveDimension(R.dimen.drop_target_full_screen_padding)
+        desktopWindowDropTargetPaddingSmall =
+            context.resolveDimension(R.dimen.drop_target_desktop_window_padding_small)
+        desktopWindowDropTargetPaddingLarge =
+            context.resolveDimension(R.dimen.drop_target_desktop_window_padding_large)
+
+        // TODO b/393172431: Use the shared xml resources once we can easily access them from
+        //  launcher
+        expandedViewDropTargetWidth = 364.dpToPx()
+        expandedViewDropTargetHeight = 578.dpToPx()
+        expandedViewDropTargetPaddingBottom = 108.dpToPx()
+        expandedViewDropTargetPaddingHorizontal = 24.dpToPx()
     }
 
     private fun Context.resolveDimension(@DimenRes dimension: Int) =
         resources.getDimensionPixelSize(dimension)
 
+    private fun Int.dpToPx() =
+        TypedValue.applyDimension(
+                TypedValue.COMPLEX_UNIT_DIP,
+                this.toFloat(),
+                context.resources.displayMetrics
+            )
+            .toInt()
+
     /**
      * Creates the list of drag zones for the dragged object.
      *
@@ -155,7 +231,7 @@
             DragZone.Bubble.Left(
                 bounds =
                     Rect(0, windowBounds.bottom - dragZoneSize, dragZoneSize, windowBounds.bottom),
-                dropTarget = Rect(0, 0, 0, 0),
+                dropTarget = expandedViewDropTargetLeft,
             ),
             DragZone.Bubble.Right(
                 bounds =
@@ -165,7 +241,7 @@
                         windowBounds.right,
                         windowBounds.bottom,
                     ),
-                dropTarget = Rect(0, 0, 0, 0),
+                dropTarget = expandedViewDropTargetRight,
             )
         )
     }
@@ -174,7 +250,7 @@
         return listOf(
             DragZone.Bubble.Left(
                 bounds = Rect(0, 0, windowBounds.right / 2, windowBounds.bottom),
-                dropTarget = Rect(0, 0, 0, 0),
+                dropTarget = expandedViewDropTargetLeft,
             ),
             DragZone.Bubble.Right(
                 bounds =
@@ -184,7 +260,7 @@
                         windowBounds.right,
                         windowBounds.bottom,
                     ),
-                dropTarget = Rect(0, 0, 0, 0),
+                dropTarget = expandedViewDropTargetRight,
             )
         )
     }
@@ -198,7 +274,7 @@
                     windowBounds.right / 2 + fullScreenDragZoneWidth / 2,
                     fullScreenDragZoneHeight
                 ),
-            dropTarget = Rect(0, 0, 0, 0)
+            dropTarget = fullScreenDropTarget
         )
     }
 
@@ -223,7 +299,7 @@
                         windowBounds.bottom / 2 + desktopWindowDragZoneHeight / 2
                     )
                 },
-            dropTarget = Rect(0, 0, 0, 0)
+            dropTarget = desktopWindowDropTarget
         )
     }
 
@@ -236,7 +312,7 @@
                     windowBounds.right / 2 + desktopWindowFromExpandedViewDragZoneWidth / 2,
                     windowBounds.bottom / 2 + desktopWindowFromExpandedViewDragZoneHeight / 2
                 ),
-            dropTarget = Rect(0, 0, 0, 0)
+            dropTarget = desktopWindowDropTarget
         )
     }
 
diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeCompatPolicy.kt b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeCompatPolicy.kt
index f234ff5c2c..126ab3d 100644
--- a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeCompatPolicy.kt
+++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeCompatPolicy.kt
@@ -21,6 +21,7 @@
 import android.content.pm.ActivityInfo
 import android.content.pm.ActivityInfo.INSETS_DECOUPLED_CONFIGURATION_ENFORCED
 import android.content.pm.ActivityInfo.OVERRIDE_ENABLE_INSETS_DECOUPLED_CONFIGURATION
+import android.content.pm.ActivityInfo.OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS
 import android.window.DesktopModeFlags
 import com.android.internal.R
 import com.android.window.flags.Flags
@@ -49,7 +50,7 @@
         numActivities: Int, isTopActivityNoDisplay: Boolean, isActivityStackTransparent: Boolean) =
         DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_MODALS_POLICY.isTrue
                 && ((isSystemUiTask(packageName)
-                || isPartOfDefaultHomePackage(packageName)
+                || isPartOfDefaultHomePackageOrNoHomeAvailable(packageName)
                 || isTransparentTask(isActivityStackTransparent, numActivities))
                 && !isTopActivityNoDisplay)
 
@@ -59,13 +60,16 @@
      * The treatment is enabled when all the of the following is true:
      * * Any flags to forcibly consume caption insets are enabled.
      * * Top activity have configuration coupled with insets.
-     * * Task is not resizeable.
+     * * Task is not resizeable or [ActivityInfo.OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS]
+     * is enabled.
      */
     fun shouldExcludeCaptionFromAppBounds(taskInfo: TaskInfo): Boolean =
         Flags.excludeCaptionFromAppBounds()
                 && isAnyForceConsumptionFlagsEnabled()
                 && taskInfo.topActivityInfo?.let {
-            isInsetsCoupledWithConfiguration(it) && !taskInfo.isResizeable
+            isInsetsCoupledWithConfiguration(it) && (!taskInfo.isResizeable || it.isChangeEnabled(
+                OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS
+            ))
         } ?: false
 
     /**
@@ -81,10 +85,11 @@
     private fun isSystemUiTask(packageName: String?) = packageName == systemUiPackage
 
     /**
-     * Returns true if the tasks base activity is part of the default home package.
+     * Returns true if the tasks base activity is part of the default home package, or there is
+     * currently no default home package available.
      */
-    private fun isPartOfDefaultHomePackage(packageName: String?) =
-        packageName != null && packageName == defaultHomePackage
+    private fun isPartOfDefaultHomePackageOrNoHomeAvailable(packageName: String?) =
+        defaultHomePackage == null || (packageName != null && packageName == defaultHomePackage)
 
     private fun isAnyForceConsumptionFlagsEnabled(): Boolean =
         DesktopModeFlags.ENABLE_CAPTION_COMPAT_INSET_FORCE_CONSUMPTION_ALWAYS.isTrue
diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeStatus.java b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeStatus.java
index 643c150..00901a4 100644
--- a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeStatus.java
+++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeStatus.java
@@ -226,6 +226,7 @@
         return context.getResources().getBoolean(R.bool.config_canInternalDisplayHostDesktops);
     }
 
+
     /**
      * Return {@code true} if desktop mode dev option should be shown on current device
      */
@@ -239,23 +240,22 @@
      */
     public static boolean canShowDesktopExperienceDevOption(@NonNull Context context) {
         return Flags.showDesktopExperienceDevOption()
-                && isInternalDisplayEligibleToHostDesktops(context);
+            && isDeviceEligibleForDesktopMode(context);
     }
 
     /** Returns if desktop mode dev option should be enabled if there is no user override. */
     public static boolean shouldDevOptionBeEnabledByDefault(Context context) {
-        return isInternalDisplayEligibleToHostDesktops(context)
-                && Flags.enableDesktopWindowingMode();
+        return isDeviceEligibleForDesktopMode(context)
+            && Flags.enableDesktopWindowingMode();
     }
 
     /**
      * Return {@code true} if desktop mode is enabled and can be entered on the current device.
      */
     public static boolean canEnterDesktopMode(@NonNull Context context) {
-        return (isInternalDisplayEligibleToHostDesktops(context)
-                && DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_MODE.isTrue()
-                && (isDesktopModeSupported(context) || !enforceDeviceRestrictions())
-                || isDesktopModeEnabledByDevOption(context));
+        return (isDeviceEligibleForDesktopMode(context)
+                && DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_MODE.isTrue())
+                || isDesktopModeEnabledByDevOption(context);
     }
 
     /**
@@ -323,25 +323,34 @@
     }
 
     /**
-     * Return {@code true} if desktop sessions is unrestricted and can be host for the device's
-     * internal display.
+     * Return {@code true} if desktop mode is unrestricted and is supported on the device.
      */
-    public static boolean isInternalDisplayEligibleToHostDesktops(@NonNull Context context) {
-        return !enforceDeviceRestrictions() || canInternalDisplayHostDesktops(context) || (
-                Flags.enableDesktopModeThroughDevOption() && isDesktopModeDevOptionSupported(
-                        context));
+    public static boolean isDeviceEligibleForDesktopMode(@NonNull Context context) {
+        if (!enforceDeviceRestrictions()) {
+            return true;
+        }
+        final boolean desktopModeSupported = isDesktopModeSupported(context)
+                && canInternalDisplayHostDesktops(context);
+        final boolean desktopModeSupportedByDevOptions =
+                Flags.enableDesktopModeThroughDevOption()
+                    && isDesktopModeDevOptionSupported(context);
+        return desktopModeSupported || desktopModeSupportedByDevOptions;
     }
 
     /**
      * Return {@code true} if the developer option for desktop mode is unrestricted and is supported
      * in the device.
      *
-     * Note that, if {@link #isInternalDisplayEligibleToHostDesktops(Context)} is true, then
+     * Note that, if {@link #isDeviceEligibleForDesktopMode(Context)} is true, then
      * {@link #isDeviceEligibleForDesktopModeDevOption(Context)} is also true.
      */
     private static boolean isDeviceEligibleForDesktopModeDevOption(@NonNull Context context) {
-        return !enforceDeviceRestrictions() || isDesktopModeSupported(context)
-                || isDesktopModeDevOptionSupported(context);
+        if (!enforceDeviceRestrictions()) {
+            return true;
+        }
+        final boolean desktopModeSupported = isDesktopModeSupported(context)
+                && canInternalDisplayHostDesktops(context);
+        return desktopModeSupported || isDesktopModeDevOptionSupported(context);
     }
 
     /**
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 c7a0401..58b46d2 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
@@ -22,6 +22,7 @@
 import static android.view.View.INVISIBLE;
 import static android.view.View.VISIBLE;
 import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
+import static android.view.WindowManager.TRANSIT_CHANGE;
 
 import static com.android.wm.shell.bubbles.BubbleDebugConfig.TAG_BUBBLES;
 import static com.android.wm.shell.bubbles.BubbleDebugConfig.TAG_WITH_CLASS_NAME;
@@ -844,6 +845,10 @@
                 mLogger.log(onLeft ? BubbleLogger.Event.BUBBLE_BAR_MOVED_LEFT_APP_ICON_DROP
                         : BubbleLogger.Event.BUBBLE_BAR_MOVED_RIGHT_APP_ICON_DROP);
                 break;
+            case BubbleBarLocation.UpdateSource.DRAG_TASK:
+                mLogger.log(onLeft ? BubbleLogger.Event.BUBBLE_BAR_MOVED_LEFT_DRAG_TASK
+                        : BubbleLogger.Event.BUBBLE_BAR_MOVED_RIGHT_DRAG_TASK);
+                break;
         }
     }
 
@@ -1290,6 +1295,11 @@
                         mContext.getResources().getDimensionPixelSize(
                                 com.android.internal.R.dimen.importance_ring_stroke_width));
                 mStackView.onDisplaySizeChanged();
+                // TODO b/392893178: Merge the unfold and the task view transition so that we don't
+                //  have to post a delayed runnable to the looper to update the bounds
+                if (mStackView.isExpanded()) {
+                    mStackView.postDelayed(() -> mStackView.updateExpandedView(), 500);
+                }
             }
             if (newConfig.fontScale != mFontScale) {
                 mFontScale = newConfig.fontScale;
@@ -1590,20 +1600,34 @@
      * Expands and selects a bubble created from a running task in a different mode.
      *
      * @param taskInfo the task.
+     * @param dragData optional information about the task when it is being dragged into a bubble
      */
-    public void expandStackAndSelectBubble(ActivityManager.RunningTaskInfo taskInfo) {
+    public void expandStackAndSelectBubble(ActivityManager.RunningTaskInfo taskInfo,
+            @Nullable BubbleTransitions.DragData dragData) {
         if (!BubbleAnythingFlagHelper.enableBubbleToFullscreen()) return;
         Bubble b = mBubbleData.getOrCreateBubble(taskInfo); // Removes from overflow
         ProtoLog.v(WM_SHELL_BUBBLES, "expandStackAndSelectBubble - intent=%s", taskInfo.taskId);
+        BubbleBarLocation location = null;
+        if (dragData != null) {
+            location =
+                    dragData.isReleasedOnLeft() ? BubbleBarLocation.LEFT : BubbleBarLocation.RIGHT;
+        }
         if (b.isInflated()) {
-            mBubbleData.setSelectedBubbleAndExpandStack(b);
+            mBubbleData.setSelectedBubbleAndExpandStack(b, location);
+            if (dragData != null && dragData.getPendingWct() != null) {
+                mTransitions.startTransition(TRANSIT_CHANGE,
+                        dragData.getPendingWct(), /* handler= */ null);
+            }
         } else {
+            if (location != null) {
+                setBubbleBarLocation(location, BubbleBarLocation.UpdateSource.DRAG_TASK);
+            }
             b.enable(Notification.BubbleMetadata.FLAG_AUTO_EXPAND_BUBBLE);
             // Lazy init stack view when a bubble is created
             ensureBubbleViewsAndWindowCreated();
             mBubbleTransitions.startConvertToBubble(b, taskInfo, mExpandedViewManager,
                     mBubbleTaskViewFactory, mBubblePositioner, mStackView, mLayerView,
-                    mBubbleIconFactory, mInflateSynchronously);
+                    mBubbleIconFactory, dragData, mInflateSynchronously);
         }
     }
 
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleLogger.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleLogger.java
index 831f227..a0c4731 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleLogger.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleLogger.java
@@ -156,6 +156,12 @@
         @UiEvent(doc = "while bubble bar is expanded, switch to another/existing bubble")
         BUBBLE_BAR_BUBBLE_SWITCHED(1977),
 
+        @UiEvent(doc = "bubble bar moved to the left edge of the screen by dragging a task")
+        BUBBLE_BAR_MOVED_LEFT_DRAG_TASK(2146),
+
+        @UiEvent(doc = "bubble bar moved to the right edge of the screen by dragging a task")
+        BUBBLE_BAR_MOVED_RIGHT_DRAG_TASK(2147),
+
         // endregion
         ;
 
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 dad627f..9272417 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
@@ -3548,7 +3548,7 @@
         }
     }
 
-    private void updateExpandedView() {
+    void updateExpandedView() {
         boolean isOverflowExpanded = mExpandedBubble != null
                 && BubbleOverflow.KEY.equals(mExpandedBubble.getKey());
         int[] paddings = mPositioner.getExpandedViewContainerPadding(
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleTaskViewHelper.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleTaskViewHelper.java
deleted file mode 100644
index e47ac61..0000000
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleTaskViewHelper.java
+++ /dev/null
@@ -1,292 +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.bubbles;
-
-import static android.app.ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOW_ALWAYS;
-import static android.app.ActivityTaskManager.INVALID_TASK_ID;
-import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
-import static android.content.Intent.FLAG_ACTIVITY_NEW_DOCUMENT;
-
-import static com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_BUBBLES;
-
-import android.app.ActivityOptions;
-import android.app.ActivityTaskManager;
-import android.app.PendingIntent;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.Rect;
-import android.util.Log;
-import android.view.View;
-import android.view.ViewGroup;
-
-import androidx.annotation.Nullable;
-
-import com.android.internal.protolog.ProtoLog;
-import com.android.wm.shell.shared.bubbles.BubbleAnythingFlagHelper;
-import com.android.wm.shell.taskview.TaskView;
-
-/**
- * Handles creating and updating the {@link TaskView} associated with a {@link Bubble}.
- */
-public class BubbleTaskViewHelper {
-
-    private static final String TAG = BubbleTaskViewHelper.class.getSimpleName();
-
-    /**
-     * Listener for users of {@link BubbleTaskViewHelper} to use to be notified of events
-     * on the task.
-     */
-    public interface Listener {
-
-        /** Called when the task is first created. */
-        void onTaskCreated();
-
-        /** Called when the visibility of the task changes. */
-        void onContentVisibilityChanged(boolean visible);
-
-        /** Called when back is pressed on the task root. */
-        void onBackPressed();
-
-        /** Called when task removal has started. */
-        void onTaskRemovalStarted();
-    }
-
-    private final Context mContext;
-    private final BubbleExpandedViewManager mExpandedViewManager;
-    private final BubbleTaskViewHelper.Listener mListener;
-    private final View mParentView;
-
-    @Nullable
-    private Bubble mBubble;
-    @Nullable
-    private PendingIntent mPendingIntent;
-    @Nullable
-    private TaskView mTaskView;
-    private int mTaskId = INVALID_TASK_ID;
-
-    private final TaskView.Listener mTaskViewListener = new TaskView.Listener() {
-        private boolean mInitialized = false;
-        private boolean mDestroyed = false;
-
-        @Override
-        public void onInitialized() {
-            ProtoLog.d(WM_SHELL_BUBBLES, "onInitialized: destroyed=%b initialized=%b bubble=%s",
-                    mDestroyed, mInitialized, getBubbleKey());
-
-            if (mDestroyed || mInitialized) {
-                return;
-            }
-
-            // Custom options so there is no activity transition animation
-            ActivityOptions options = ActivityOptions.makeCustomAnimation(mContext,
-                    0 /* enterResId */, 0 /* exitResId */);
-
-            Rect launchBounds = new Rect();
-            mTaskView.getBoundsOnScreen(launchBounds);
-
-            // TODO: I notice inconsistencies in lifecycle
-            // Post to keep the lifecycle normal
-            // TODO - currently based on type, really it's what the "launch item" is.
-            mParentView.post(() -> {
-                ProtoLog.d(WM_SHELL_BUBBLES, "onInitialized: calling startActivity, bubble=%s",
-                        getBubbleKey());
-                try {
-                    options.setTaskAlwaysOnTop(true);
-                    options.setPendingIntentBackgroundActivityStartMode(
-                            MODE_BACKGROUND_ACTIVITY_START_ALLOW_ALWAYS);
-                    final boolean isShortcutBubble = (mBubble.hasMetadataShortcutId()
-                            || (mBubble.isShortcut()
-                            && BubbleAnythingFlagHelper.enableCreateAnyBubble()));
-                    if (mBubble.getPreparingTransition() != null) {
-                        mBubble.getPreparingTransition().surfaceCreated();
-                    } else if (mBubble.isApp() || mBubble.isNote()) {
-                        Context context =
-                                mContext.createContextAsUser(
-                                        mBubble.getUser(), Context.CONTEXT_RESTRICTED);
-                        Intent fillInIntent = null;
-                        //first try get pending intent from the bubble
-                        PendingIntent pi = mBubble.getPendingIntent();
-                        if (pi == null) {
-                            // if null - create new one
-                            pi = PendingIntent.getActivity(
-                                    context,
-                                    /* requestCode= */ 0,
-                                    mBubble.getIntent()
-                                            .addFlags(FLAG_ACTIVITY_MULTIPLE_TASK),
-                                    PendingIntent.FLAG_IMMUTABLE
-                                            | PendingIntent.FLAG_UPDATE_CURRENT,
-                                    /* options= */ null);
-                        } else {
-                            fillInIntent = new Intent(pi.getIntent());
-                            fillInIntent.addFlags(FLAG_ACTIVITY_MULTIPLE_TASK);
-                        }
-                        mTaskView.startActivity(pi, fillInIntent, options, launchBounds);
-                    } else if (isShortcutBubble) {
-                        options.setLaunchedFromBubble(true);
-                        options.setApplyActivityFlagsForBubbles(true);
-                        mTaskView.startShortcutActivity(mBubble.getShortcutInfo(),
-                                options, launchBounds);
-                    } else {
-                        options.setLaunchedFromBubble(true);
-                        if (mBubble != null) {
-                            mBubble.setPendingIntentActive();
-                        }
-                        final Intent fillInIntent = new Intent();
-                        // Apply flags to make behaviour match documentLaunchMode=always.
-                        fillInIntent.addFlags(FLAG_ACTIVITY_NEW_DOCUMENT);
-                        fillInIntent.addFlags(FLAG_ACTIVITY_MULTIPLE_TASK);
-                        mTaskView.startActivity(mPendingIntent, fillInIntent, options,
-                                launchBounds);
-                    }
-                } catch (RuntimeException e) {
-                    // If there's a runtime exception here then there's something
-                    // wrong with the intent, we can't really recover / try to populate
-                    // the bubble again so we'll just remove it.
-                    Log.w(TAG, "Exception while displaying bubble: " + getBubbleKey()
-                            + ", " + e.getMessage() + "; removing bubble");
-                    mExpandedViewManager.removeBubble(
-                            getBubbleKey(), Bubbles.DISMISS_INVALID_INTENT);
-                }
-                mInitialized = true;
-            });
-        }
-
-        @Override
-        public void onReleased() {
-            mDestroyed = true;
-        }
-
-        @Override
-        public void onTaskCreated(int taskId, ComponentName name) {
-            ProtoLog.d(WM_SHELL_BUBBLES, "onTaskCreated: taskId=%d bubble=%s",
-                    taskId, getBubbleKey());
-            // The taskId is saved to use for removeTask, preventing appearance in recent tasks.
-            mTaskId = taskId;
-
-            if (mBubble != null && mBubble.isNote()) {
-                // Let the controller know sooner what the taskId is.
-                mExpandedViewManager.setNoteBubbleTaskId(mBubble.getKey(), mTaskId);
-            }
-
-            // With the task org, the taskAppeared callback will only happen once the task has
-            // already drawn
-            mListener.onTaskCreated();
-        }
-
-        @Override
-        public void onTaskVisibilityChanged(int taskId, boolean visible) {
-            mListener.onContentVisibilityChanged(visible);
-        }
-
-        @Override
-        public void onTaskRemovalStarted(int taskId) {
-            ProtoLog.d(WM_SHELL_BUBBLES, "onTaskRemovalStarted: taskId=%d bubble=%s",
-                    taskId, getBubbleKey());
-            if (mBubble != null) {
-                mExpandedViewManager.removeBubble(mBubble.getKey(), Bubbles.DISMISS_TASK_FINISHED);
-            }
-            if (mTaskView != null) {
-                mTaskView.release();
-                ((ViewGroup) mParentView).removeView(mTaskView);
-                mTaskView = null;
-            }
-            mListener.onTaskRemovalStarted();
-        }
-
-        @Override
-        public void onBackPressedOnTaskRoot(int taskId) {
-            if (mTaskId == taskId && mExpandedViewManager.isStackExpanded()) {
-                mListener.onBackPressed();
-            }
-        }
-    };
-
-    public BubbleTaskViewHelper(Context context,
-            BubbleExpandedViewManager expandedViewManager,
-            BubbleTaskViewHelper.Listener listener,
-            BubbleTaskView bubbleTaskView,
-            View parent) {
-        mContext = context;
-        mExpandedViewManager = expandedViewManager;
-        mListener = listener;
-        mParentView = parent;
-        mTaskView = bubbleTaskView.getTaskView();
-        bubbleTaskView.setDelegateListener(mTaskViewListener);
-        if (bubbleTaskView.isCreated()) {
-            mTaskId = bubbleTaskView.getTaskId();
-            mListener.onTaskCreated();
-        }
-    }
-
-    /**
-     * Sets the bubble or updates the bubble used to populate the view.
-     *
-     * @return true if the bubble is new, false if it was an update to the same bubble.
-     */
-    public boolean update(Bubble bubble) {
-        boolean isNew = mBubble == null || didBackingContentChange(bubble);
-        mBubble = bubble;
-        if (isNew) {
-            mPendingIntent = mBubble.getPendingIntent();
-            return true;
-        }
-        return false;
-    }
-
-    /** Returns the bubble key associated with this view. */
-    @Nullable
-    public String getBubbleKey() {
-        return mBubble != null ? mBubble.getKey() : null;
-    }
-
-    /** Returns the TaskView associated with this view. */
-    @Nullable
-    public TaskView getTaskView() {
-        return mTaskView;
-    }
-
-    /**
-     * Returns the task id associated with the task in this view. If the task doesn't exist then
-     * {@link ActivityTaskManager#INVALID_TASK_ID}.
-     */
-    public int getTaskId() {
-        return mTaskId;
-    }
-
-    /** Returns whether the bubble set on the helper is valid to populate the task view. */
-    public boolean isValidBubble() {
-        return mBubble != null && (mPendingIntent != null || mBubble.hasMetadataShortcutId());
-    }
-
-    // TODO (b/274980695): Is this still relevant?
-    /**
-     * Bubbles are backed by a pending intent or a shortcut, once the activity is
-     * started we never change it / restart it on notification updates -- unless the bubble's
-     * backing data switches.
-     *
-     * This indicates if the new bubble is backed by a different data source than what was
-     * previously shown here (e.g. previously a pending intent & now a shortcut).
-     *
-     * @param newBubble the bubble this view is being updated with.
-     * @return true if the backing content has changed.
-     */
-    private boolean didBackingContentChange(Bubble newBubble) {
-        boolean prevWasIntentBased = mBubble != null && mPendingIntent != null;
-        boolean newIsIntentBased = newBubble.getPendingIntent() != null;
-        return prevWasIntentBased != newIsIntentBased;
-    }
-}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleTaskViewListener.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleTaskViewListener.java
new file mode 100644
index 0000000..a38debb
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleTaskViewListener.java
@@ -0,0 +1,279 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.bubbles;
+
+import static android.app.ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOW_ALWAYS;
+import static android.app.ActivityTaskManager.INVALID_TASK_ID;
+import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
+import static android.content.Intent.FLAG_ACTIVITY_NEW_DOCUMENT;
+
+import static com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_BUBBLES;
+
+import android.app.ActivityOptions;
+import android.app.ActivityTaskManager;
+import android.app.PendingIntent;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Rect;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.Nullable;
+
+import com.android.internal.protolog.ProtoLog;
+import com.android.wm.shell.shared.bubbles.BubbleAnythingFlagHelper;
+import com.android.wm.shell.taskview.TaskView;
+
+/**
+ * A listener that works with task views for bubbles, manages launching the appropriate
+ * content into the task view from the bubble and sends updates of task view events back to
+ * the parent view via {@link BubbleTaskViewListener.Callback}.
+ */
+public class BubbleTaskViewListener implements TaskView.Listener {
+    private static final String TAG = BubbleTaskViewListener.class.getSimpleName();
+
+    /**
+     * Callback to let the view parent of TaskView to be notified of different events.
+     */
+    public interface Callback {
+
+        /** Called when the task is first created. */
+        void onTaskCreated();
+
+        /** Called when the visibility of the task changes. */
+        void onContentVisibilityChanged(boolean visible);
+
+        /** Called when back is pressed on the task root. */
+        void onBackPressed();
+
+        /** Called when task removal has started. */
+        void onTaskRemovalStarted();
+    }
+
+    private final Context mContext;
+    private final BubbleExpandedViewManager mExpandedViewManager;
+    private final BubbleTaskViewListener.Callback mCallback;
+    private final View mParentView;
+
+    private Bubble mBubble;
+    @Nullable
+    private PendingIntent mPendingIntent;
+    private int mTaskId = INVALID_TASK_ID;
+    private TaskView mTaskView;
+
+    private boolean mInitialized = false;
+    private boolean mDestroyed = false;
+
+    public BubbleTaskViewListener(Context context, BubbleTaskView bubbleTaskView, View parentView,
+            BubbleExpandedViewManager manager, BubbleTaskViewListener.Callback callback) {
+        mContext = context;
+        mTaskView = bubbleTaskView.getTaskView();
+        mParentView = parentView;
+        mExpandedViewManager = manager;
+        mCallback = callback;
+        bubbleTaskView.setDelegateListener(this);
+        if (bubbleTaskView.isCreated()) {
+            mTaskId = bubbleTaskView.getTaskId();
+            callback.onTaskCreated();
+        }
+    }
+
+    @Override
+    public void onInitialized() {
+        ProtoLog.d(WM_SHELL_BUBBLES, "onInitialized: destroyed=%b initialized=%b bubble=%s",
+                mDestroyed, mInitialized, getBubbleKey());
+
+        if (mDestroyed || mInitialized) {
+            return;
+        }
+
+        // Custom options so there is no activity transition animation
+        ActivityOptions options = ActivityOptions.makeCustomAnimation(mContext,
+                0 /* enterResId */, 0 /* exitResId */);
+
+        Rect launchBounds = new Rect();
+        mTaskView.getBoundsOnScreen(launchBounds);
+
+        // TODO: I notice inconsistencies in lifecycle
+        // Post to keep the lifecycle normal
+        // TODO - currently based on type, really it's what the "launch item" is.
+        mParentView.post(() -> {
+            ProtoLog.d(WM_SHELL_BUBBLES, "onInitialized: calling startActivity, bubble=%s",
+                    getBubbleKey());
+            try {
+                options.setTaskAlwaysOnTop(true);
+                options.setPendingIntentBackgroundActivityStartMode(
+                        MODE_BACKGROUND_ACTIVITY_START_ALLOW_ALWAYS);
+                final boolean isShortcutBubble = (mBubble.hasMetadataShortcutId()
+                        || (mBubble.isShortcut()
+                        && BubbleAnythingFlagHelper.enableCreateAnyBubble()));
+                if (mBubble.getPreparingTransition() != null) {
+                    mBubble.getPreparingTransition().surfaceCreated();
+                } else if (mBubble.isApp() || mBubble.isNote()) {
+                    Context context =
+                            mContext.createContextAsUser(
+                                    mBubble.getUser(), Context.CONTEXT_RESTRICTED);
+                    Intent fillInIntent = null;
+                    // First try get pending intent from the bubble
+                    PendingIntent pi = mBubble.getPendingIntent();
+                    if (pi == null) {
+                        // If null - create new one
+                        pi = PendingIntent.getActivity(
+                                context,
+                                /* requestCode= */ 0,
+                                mBubble.getIntent()
+                                        .addFlags(FLAG_ACTIVITY_MULTIPLE_TASK),
+                                PendingIntent.FLAG_IMMUTABLE
+                                        | PendingIntent.FLAG_UPDATE_CURRENT,
+                                /* options= */ null);
+                    } else {
+                        fillInIntent = new Intent(pi.getIntent());
+                        fillInIntent.addFlags(FLAG_ACTIVITY_MULTIPLE_TASK);
+                    }
+                    mTaskView.startActivity(pi, fillInIntent, options, launchBounds);
+                } else if (isShortcutBubble) {
+                    options.setLaunchedFromBubble(true);
+                    options.setApplyActivityFlagsForBubbles(true);
+                    mTaskView.startShortcutActivity(mBubble.getShortcutInfo(),
+                            options, launchBounds);
+                } else {
+                    options.setLaunchedFromBubble(true);
+                    if (mBubble != null) {
+                        mBubble.setPendingIntentActive();
+                    }
+                    final Intent fillInIntent = new Intent();
+                    // Apply flags to make behaviour match documentLaunchMode=always.
+                    fillInIntent.addFlags(FLAG_ACTIVITY_NEW_DOCUMENT);
+                    fillInIntent.addFlags(FLAG_ACTIVITY_MULTIPLE_TASK);
+                    mTaskView.startActivity(mPendingIntent, fillInIntent, options,
+                            launchBounds);
+                }
+            } catch (RuntimeException e) {
+                // If there's a runtime exception here then there's something
+                // wrong with the intent, we can't really recover / try to populate
+                // the bubble again so we'll just remove it.
+                Log.w(TAG, "Exception while displaying bubble: " + getBubbleKey()
+                        + ", " + e.getMessage() + "; removing bubble");
+                mExpandedViewManager.removeBubble(
+                        getBubbleKey(), Bubbles.DISMISS_INVALID_INTENT);
+            }
+            mInitialized = true;
+        });
+    }
+
+    @Override
+    public void onReleased() {
+        mDestroyed = true;
+    }
+
+    @Override
+    public void onTaskCreated(int taskId, ComponentName name) {
+        ProtoLog.d(WM_SHELL_BUBBLES, "onTaskCreated: taskId=%d bubble=%s",
+                taskId, getBubbleKey());
+        // The taskId is saved to use for removeTask, preventing appearance in recent tasks.
+        mTaskId = taskId;
+
+        if (mBubble != null && mBubble.isNote()) {
+            // Let the controller know sooner what the taskId is.
+            mExpandedViewManager.setNoteBubbleTaskId(mBubble.getKey(), mTaskId);
+        }
+
+        // With the task org, the taskAppeared callback will only happen once the task has
+        // already drawn
+        mCallback.onTaskCreated();
+    }
+
+    @Override
+    public void onTaskVisibilityChanged(int taskId, boolean visible) {
+        mCallback.onContentVisibilityChanged(visible);
+    }
+
+    @Override
+    public void onTaskRemovalStarted(int taskId) {
+        ProtoLog.d(WM_SHELL_BUBBLES, "onTaskRemovalStarted: taskId=%d bubble=%s",
+                taskId, getBubbleKey());
+        if (mBubble != null) {
+            mExpandedViewManager.removeBubble(mBubble.getKey(), Bubbles.DISMISS_TASK_FINISHED);
+        }
+        if (mTaskView != null) {
+            mTaskView.release();
+            ((ViewGroup) mParentView).removeView(mTaskView);
+            mTaskView = null;
+        }
+        mCallback.onTaskRemovalStarted();
+    }
+
+    @Override
+    public void onBackPressedOnTaskRoot(int taskId) {
+        if (mTaskId == taskId && mExpandedViewManager.isStackExpanded()) {
+            mCallback.onBackPressed();
+        }
+    }
+
+    /**
+     * Sets the bubble or updates the bubble used to populate the view.
+     *
+     * @return true if the bubble is new or if the launch content of the bubble changed from the
+     * previous bubble.
+     */
+    public boolean setBubble(Bubble bubble) {
+        boolean isNew = mBubble == null || didBackingContentChange(bubble);
+        mBubble = bubble;
+        if (isNew) {
+            mPendingIntent = mBubble.getPendingIntent();
+        }
+        return isNew;
+    }
+
+    /** Returns the TaskView associated with this view. */
+    @Nullable
+    public TaskView getTaskView() {
+        return mTaskView;
+    }
+
+    /**
+     * Returns the task id associated with the task in this view. If the task doesn't exist then
+     * {@link ActivityTaskManager#INVALID_TASK_ID}.
+     */
+    public int getTaskId() {
+        return mTaskId;
+    }
+
+    private String getBubbleKey() {
+        return mBubble != null ? mBubble.getKey() : "";
+    }
+
+    // TODO (b/274980695): Is this still relevant?
+    /**
+     * Bubbles are backed by a pending intent or a shortcut, once the activity is
+     * started we never change it / restart it on notification updates -- unless the bubble's
+     * backing data switches.
+     *
+     * This indicates if the new bubble is backed by a different data source than what was
+     * previously shown here (e.g. previously a pending intent & now a shortcut).
+     *
+     * @param newBubble the bubble this view is being updated with.
+     * @return true if the backing content has changed.
+     */
+    private boolean didBackingContentChange(Bubble newBubble) {
+        boolean prevWasIntentBased = mBubble != null && mPendingIntent != null;
+        boolean newIsIntentBased = newBubble.getPendingIntent() != null;
+        return prevWasIntentBased != newIsIntentBased;
+    }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleTransitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleTransitions.java
index df8b4fd..a676f41 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleTransitions.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleTransitions.java
@@ -22,6 +22,8 @@
 import static android.view.View.INVISIBLE;
 import static android.view.WindowManager.TRANSIT_CHANGE;
 
+import static com.android.wm.shell.transition.Transitions.TRANSIT_CONVERT_TO_BUBBLE;
+
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.ActivityManager;
@@ -92,10 +94,10 @@
             BubbleExpandedViewManager expandedViewManager, BubbleTaskViewFactory factory,
             BubblePositioner positioner, BubbleStackView stackView,
             BubbleBarLayerView layerView, BubbleIconFactory iconFactory,
-            boolean inflateSync) {
+            DragData dragData, boolean inflateSync) {
         return new ConvertToBubble(bubble, taskInfo, mContext,
                 expandedViewManager, factory, positioner, stackView, layerView, iconFactory,
-                inflateSync);
+                dragData, inflateSync);
     }
 
     /**
@@ -149,43 +151,92 @@
     }
 
     /**
+     * Information about the task when it is being dragged to a bubble
+     */
+    public static class DragData {
+        private final Rect mBounds;
+        private final WindowContainerTransaction mPendingWct;
+        private final boolean mReleasedOnLeft;
+
+        /**
+         * @param bounds bounds of the dragged task when the drag was released
+         * @param wct pending operations to be applied when finishing the drag
+         * @param releasedOnLeft true if the bubble was released in the left drop target
+         */
+        public DragData(@Nullable Rect bounds, @Nullable WindowContainerTransaction wct,
+                boolean releasedOnLeft) {
+            mBounds = bounds;
+            mPendingWct = wct;
+            mReleasedOnLeft = releasedOnLeft;
+        }
+
+        /**
+         * @return bounds of the dragged task when the drag was released
+         */
+        @Nullable
+        public Rect getBounds() {
+            return mBounds;
+        }
+
+        /**
+         * @return pending operations to be applied when finishing the drag
+         */
+        @Nullable
+        public WindowContainerTransaction getPendingWct() {
+            return mPendingWct;
+        }
+
+        /**
+         * @return true if the bubble was released in the left drop target
+         */
+        public boolean isReleasedOnLeft() {
+            return mReleasedOnLeft;
+        }
+    }
+
+    /**
      * BubbleTransition that coordinates the process of a non-bubble task becoming a bubble. The
      * steps are as follows:
      *
      * 1. Start inflating the bubble view
      * 2. Once inflated (but not-yet visible), tell WM to do the shell-transition.
-     * 3. Transition becomes ready, so notify Launcher
-     * 4. Launcher responds with showExpandedView which calls continueExpand() to make view visible
-     * 5. Surface is created which kicks off actual animation
+     * 3. When the transition becomes ready, notify Launcher in parallel
+     * 4. Wait for surface to be created
+     * 5. Once surface is ready, animate the task to a bubble
      *
-     * So, constructor -> onInflated -> startAnimation -> continueExpand -> surfaceCreated.
+     * While the animation is pending, we keep a reference to the pending transition in the bubble.
+     * This allows us to check in other parts of the code that this bubble will be shown via the
+     * transition animation.
      *
-     * continueExpand and surfaceCreated are set-up to happen in either order, though, to support
-     * UX/timing adjustments.
+     * startAnimation, continueExpand and surfaceCreated are set-up to happen in either order,
+     * to support UX/timing adjustments.
      */
     @VisibleForTesting
     class ConvertToBubble implements Transitions.TransitionHandler, BubbleTransition {
         final BubbleBarLayerView mLayerView;
         Bubble mBubble;
+        @Nullable DragData mDragData;
         IBinder mTransition;
         Transitions.TransitionFinishCallback mFinishCb;
         WindowContainerTransaction mFinishWct = null;
         final Rect mStartBounds = new Rect();
         SurfaceControl mSnapshot = null;
         TaskInfo mTaskInfo;
-        boolean mFinishedExpand = false;
         BubbleViewProvider mPriorBubble = null;
 
+        private final TransitionProgress mTransitionProgress = new TransitionProgress();
         private SurfaceControl.Transaction mFinishT;
         private SurfaceControl mTaskLeash;
 
         ConvertToBubble(Bubble bubble, TaskInfo taskInfo, Context context,
                 BubbleExpandedViewManager expandedViewManager, BubbleTaskViewFactory factory,
                 BubblePositioner positioner, BubbleStackView stackView,
-                BubbleBarLayerView layerView, BubbleIconFactory iconFactory, boolean inflateSync) {
+                BubbleBarLayerView layerView, BubbleIconFactory iconFactory,
+                @Nullable DragData dragData, boolean inflateSync) {
             mBubble = bubble;
             mTaskInfo = taskInfo;
             mLayerView = layerView;
+            mDragData = dragData;
             mBubble.setInflateSynchronously(inflateSync);
             mBubble.setPreparingTransition(this);
             mBubble.inflate(
@@ -208,6 +259,9 @@
             final Rect launchBounds = new Rect();
             mLayerView.getExpandedViewRestBounds(launchBounds);
             WindowContainerTransaction wct = new WindowContainerTransaction();
+            if (mDragData != null && mDragData.getPendingWct() != null) {
+                wct.merge(mDragData.getPendingWct(), true);
+            }
             if (mTaskInfo.getWindowingMode() == WINDOWING_MODE_MULTI_WINDOW) {
                 if (mTaskInfo.getParentTaskId() != INVALID_TASK_ID) {
                     wct.reparent(mTaskInfo.token, null, true);
@@ -226,7 +280,7 @@
                 state.mVisible = true;
             }
             mTaskViewTransitions.enqueueExternal(tv.getController(), () -> {
-                mTransition = mTransitions.startTransition(TRANSIT_CHANGE, wct, this);
+                mTransition = mTransitions.startTransition(TRANSIT_CONVERT_TO_BUBBLE, wct, this);
                 return mTransition;
             });
         }
@@ -292,6 +346,11 @@
             }
             mFinishCb = finishCallback;
 
+            if (mDragData != null && mDragData.getBounds() != null) {
+                // Override start bounds with the dragged task bounds
+                mStartBounds.set(mDragData.getBounds());
+            }
+
             // Now update state (and talk to launcher) in parallel with snapshot stuff
             mBubbleData.notificationEntryUpdated(mBubble, /* suppressFlyout= */ true,
                     /* showInShade= */ false);
@@ -303,15 +362,22 @@
                     mStartBounds.left - info.getRoot(0).getOffset().x,
                     mStartBounds.top - info.getRoot(0).getOffset().y);
             startTransaction.setLayer(mSnapshot, Integer.MAX_VALUE);
+
+            BubbleBarExpandedView bbev = mBubble.getBubbleBarExpandedView();
+            if (bbev != null) {
+                // Corners get reset during the animation. Add them back
+                startTransaction.setCornerRadius(mSnapshot, bbev.getRestingCornerRadius());
+            }
+
             startTransaction.apply();
 
             mTaskViewTransitions.onExternalDone(transition);
+            mTransitionProgress.setTransitionReady();
+            startExpandAnim();
             return true;
         }
 
-        @Override
-        public void continueExpand() {
-            mFinishedExpand = true;
+        private void startExpandAnim() {
             final boolean animate = mLayerView.canExpandView(mBubble);
             if (animate) {
                 mPriorBubble = mLayerView.prepareConvertedView(mBubble);
@@ -322,19 +388,25 @@
                 mLayerView.removeView(priorView);
                 mPriorBubble = null;
             }
-            if (!animate || mBubble.getTaskView().getSurfaceControl() != null) {
+            if (!animate || mTransitionProgress.isReadyToAnimate()) {
                 playAnimation(animate);
             }
         }
 
         @Override
+        public void continueExpand() {
+            mTransitionProgress.setReadyToExpand();
+        }
+
+        @Override
         public void surfaceCreated() {
+            mTransitionProgress.setSurfaceReady();
             mMainExecutor.execute(() -> {
                 final TaskViewTaskController tvc = mBubble.getTaskView().getController();
                 final TaskViewRepository.TaskViewState state = mRepository.byTaskView(tvc);
                 if (state == null) return;
                 state.mVisible = true;
-                if (mFinishedExpand) {
+                if (mTransitionProgress.isReadyToAnimate()) {
                     playAnimation(true /* animate */);
                 }
             });
@@ -350,9 +422,6 @@
                 mFinishWct = null;
             }
 
-            // Preparation is complete.
-            mBubble.setPreparingTransition(null);
-
             if (animate) {
                 mLayerView.animateConvert(startT, mStartBounds, mSnapshot, mTaskLeash, () -> {
                     mFinishCb.onTransitionFinished(mFinishWct);
@@ -364,6 +433,42 @@
                 mFinishCb = null;
             }
         }
+
+        /**
+         * Keeps track of internal state of different steps of this BubbleTransition.
+         */
+        private class TransitionProgress {
+            private boolean mTransitionReady;
+            private boolean mReadyToExpand;
+            private boolean mSurfaceReady;
+
+            void setTransitionReady() {
+                mTransitionReady = true;
+                onUpdate();
+            }
+
+            void setReadyToExpand() {
+                mReadyToExpand = true;
+                onUpdate();
+            }
+
+            void setSurfaceReady() {
+                mSurfaceReady = true;
+                onUpdate();
+            }
+
+            boolean isReadyToAnimate() {
+                // Animation only depends on transition and surface state
+                return mTransitionReady && mSurfaceReady;
+            }
+
+            private void onUpdate() {
+                if (mTransitionReady && mReadyToExpand && mSurfaceReady) {
+                    // Clear the transition from bubble when all the steps are ready
+                    mBubble.setPreparingTransition(null);
+                }
+            }
+        }
     }
 
     /**
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedView.java
index 6798a88..d93dbc3 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedView.java
@@ -43,9 +43,10 @@
 import com.android.wm.shell.bubbles.BubbleOverflowContainerView;
 import com.android.wm.shell.bubbles.BubblePositioner;
 import com.android.wm.shell.bubbles.BubbleTaskView;
-import com.android.wm.shell.bubbles.BubbleTaskViewHelper;
+import com.android.wm.shell.bubbles.BubbleTaskViewListener;
 import com.android.wm.shell.bubbles.Bubbles;
 import com.android.wm.shell.bubbles.RegionSamplingProvider;
+import com.android.wm.shell.dagger.HasWMComponent;
 import com.android.wm.shell.shared.bubbles.BubbleBarLocation;
 import com.android.wm.shell.shared.handles.RegionSamplingHelper;
 import com.android.wm.shell.taskview.TaskView;
@@ -56,7 +57,7 @@
 import javax.inject.Inject;
 
 /** Expanded view of a bubble when it's part of the bubble bar. */
-public class BubbleBarExpandedView extends FrameLayout implements BubbleTaskViewHelper.Listener {
+public class BubbleBarExpandedView extends FrameLayout implements BubbleTaskViewListener.Callback {
     /**
      * The expanded view listener notifying the {@link BubbleBarLayerView} about the internal
      * actions and events
@@ -110,7 +111,7 @@
     private BubbleExpandedViewManager mManager;
     private BubblePositioner mPositioner;
     private boolean mIsOverflow;
-    private BubbleTaskViewHelper mBubbleTaskViewHelper;
+    private BubbleTaskViewListener mBubbleTaskViewListener;
     private BubbleBarMenuViewController mMenuViewController;
     @Nullable
     private Supplier<Rect> mLayerBoundsSupplier;
@@ -205,6 +206,9 @@
     protected void onFinishInflate() {
         super.onFinishInflate();
         Context context = getContext();
+        if (context instanceof HasWMComponent) {
+            ((HasWMComponent) context).getWMComponent().inject(this);
+        }
         setElevation(getResources().getDimensionPixelSize(R.dimen.bubble_elevation));
         mCaptionHeight = context.getResources().getDimensionPixelSize(
                 R.dimen.bubble_bar_expanded_view_caption_height);
@@ -246,9 +250,10 @@
             mHandleView.setVisibility(View.GONE);
         } else {
             mTaskView = bubbleTaskView.getTaskView();
-            mBubbleTaskViewHelper = new BubbleTaskViewHelper(mContext, expandedViewManager,
-                    /* listener= */ this, bubbleTaskView,
-                    /* viewParent= */ this);
+            mBubbleTaskViewListener = new BubbleTaskViewListener(mContext, bubbleTaskView,
+                    /* viewParent= */ this,
+                    expandedViewManager,
+                    /* callback= */ this);
 
             // if the task view is already attached to a parent we need to remove it
             if (mTaskView.getParent() != null) {
@@ -535,13 +540,15 @@
     /** Updates the bubble shown in the expanded view. */
     public void update(Bubble bubble) {
         mBubble = bubble;
-        mBubbleTaskViewHelper.update(bubble);
+        mBubbleTaskViewListener.setBubble(bubble);
         mMenuViewController.updateMenu(bubble);
     }
 
     /** The task id of the activity shown in the task view, if it exists. */
     public int getTaskId() {
-        return mBubbleTaskViewHelper != null ? mBubbleTaskViewHelper.getTaskId() : INVALID_TASK_ID;
+        return mBubbleTaskViewListener != null
+                ? mBubbleTaskViewListener.getTaskId()
+                : INVALID_TASK_ID;
     }
 
     /** Sets layer bounds supplier used for obscured touchable region of task view */
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipDesktopState.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipDesktopState.java
index c10c2c9..c6afc31 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipDesktopState.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipDesktopState.java
@@ -81,8 +81,8 @@
         return false;
     }
 
-    /** Returns whether PiP is exiting while we're in a Desktop Mode session. */
-    private boolean isPipExitingToDesktopMode() {
+    /** Returns whether PiP is active in a display that is in active Desktop Mode session. */
+    public boolean isPipInDesktopMode() {
         // Early return if PiP in Desktop Windowing is not supported.
         if (!isDesktopWindowingPipEnabled()) {
             return false;
@@ -137,7 +137,7 @@
         // 1) If the display windowing mode is freeform, set windowing mode to UNDEFINED so it will
         //    resolve the windowing mode to the display's windowing mode.
         // 2) If the display windowing mode is not FREEFORM, set windowing mode to FREEFORM.
-        if (isPipExitingToDesktopMode()) {
+        if (isPipInDesktopMode()) {
             if (isDisplayInFreeform()) {
                 return WINDOWING_MODE_UNDEFINED;
             } else {
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 aebd94f..34d840e 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
@@ -92,7 +92,7 @@
             MultiInstanceHelper multiInstanceHelper,
             SplitState splitState,
             @ShellMainThread ShellExecutor mainExecutor,
-            Handler mainHandler,
+            @ShellMainThread Handler mainHandler,
             SystemWindows systemWindows) {
         return new TvSplitScreenController(context, shellInit, shellCommandHandler, shellController,
                 shellTaskOrganizer, syncQueue, rootTDAOrganizer, displayController,
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 b601237..2fd8c27 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
@@ -134,6 +134,7 @@
 import com.android.wm.shell.shared.TransactionPool;
 import com.android.wm.shell.shared.annotations.ShellAnimationThread;
 import com.android.wm.shell.shared.annotations.ShellBackgroundThread;
+import com.android.wm.shell.shared.annotations.ShellDesktopThread;
 import com.android.wm.shell.shared.annotations.ShellMainThread;
 import com.android.wm.shell.shared.desktopmode.DesktopModeCompatPolicy;
 import com.android.wm.shell.shared.desktopmode.DesktopModeStatus;
@@ -750,6 +751,7 @@
             MultiInstanceHelper multiInstanceHelper,
             @ShellMainThread ShellExecutor mainExecutor,
             @ShellMainThread Handler mainHandler,
+            @ShellDesktopThread ShellExecutor desktopExecutor,
             Optional<DesktopTasksLimiter> desktopTasksLimiter,
             Optional<RecentTasksController> recentTasksController,
             InteractionJankMonitor interactionJankMonitor,
@@ -757,7 +759,6 @@
             FocusTransitionObserver focusTransitionObserver,
             DesktopModeEventLogger desktopModeEventLogger,
             DesktopModeUiEventLogger desktopModeUiEventLogger,
-            DesktopTilingDecorViewModel desktopTilingDecorViewModel,
             DesktopWallpaperActivityTokenProvider desktopWallpaperActivityTokenProvider,
             Optional<BubbleController> bubbleController,
             OverviewToDesktopTransitionObserver overviewToDesktopTransitionObserver,
@@ -789,13 +790,13 @@
                 recentsTransitionHandler,
                 multiInstanceHelper,
                 mainExecutor,
+                desktopExecutor,
                 desktopTasksLimiter,
                 recentTasksController.orElse(null),
                 interactionJankMonitor,
                 mainHandler,
                 desktopModeEventLogger,
                 desktopModeUiEventLogger,
-                desktopTilingDecorViewModel,
                 desktopWallpaperActivityTokenProvider,
                 bubbleController,
                 overviewToDesktopTransitionObserver,
@@ -915,14 +916,15 @@
             Transitions transitions,
             RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer,
             @DynamicOverride DesktopUserRepositories desktopUserRepositories,
-            InteractionJankMonitor interactionJankMonitor) {
+            InteractionJankMonitor interactionJankMonitor,
+            Optional<BubbleController> bubbleController) {
         return ENABLE_DESKTOP_WINDOWING_ENTER_TRANSITIONS_BUGFIX.isTrue()
                 ? new SpringDragToDesktopTransitionHandler(
                 context, transitions, rootTaskDisplayAreaOrganizer, desktopUserRepositories,
-                interactionJankMonitor)
+                interactionJankMonitor, bubbleController)
                 : new DefaultDragToDesktopTransitionHandler(
                         context, transitions, rootTaskDisplayAreaOrganizer, desktopUserRepositories,
-                        interactionJankMonitor);
+                        interactionJankMonitor, bubbleController);
     }
 
     @WMSingleton
@@ -986,7 +988,8 @@
             DesktopModeUiEventLogger desktopModeUiEventLogger,
             WindowDecorTaskResourceLoader taskResourceLoader,
             RecentsTransitionHandler recentsTransitionHandler,
-            DesktopModeCompatPolicy desktopModeCompatPolicy
+            DesktopModeCompatPolicy desktopModeCompatPolicy,
+            DesktopTilingDecorViewModel desktopTilingDecorViewModel
     ) {
         if (!DesktopModeStatus.canEnterDesktopModeOrShowAppHandle(context)) {
             return Optional.empty();
@@ -1002,7 +1005,8 @@
                 desktopTasksLimiter, appHandleEducationController, appToWebEducationController,
                 windowDecorCaptionHandleRepository, activityOrientationChangeHandler,
                 focusTransitionObserver, desktopModeEventLogger, desktopModeUiEventLogger,
-                taskResourceLoader, recentsTransitionHandler, desktopModeCompatPolicy));
+                taskResourceLoader, recentsTransitionHandler, desktopModeCompatPolicy,
+                desktopTilingDecorViewModel));
     }
 
     @WMSingleton
@@ -1274,10 +1278,10 @@
     @WMSingleton
     @Provides
     static DesktopWindowingEducationTooltipController
-            provideDesktopWindowingEducationTooltipController(
-                    Context context,
-                    AdditionalSystemViewContainer.Factory additionalSystemViewContainerFactory,
-                    DisplayController displayController) {
+    provideDesktopWindowingEducationTooltipController(
+            Context context,
+            AdditionalSystemViewContainer.Factory additionalSystemViewContainerFactory,
+            DisplayController displayController) {
         return new DesktopWindowingEducationTooltipController(
                 context, additionalSystemViewContainerFactory, displayController);
     }
@@ -1306,7 +1310,8 @@
             WindowDecorCaptionHandleRepository windowDecorCaptionHandleRepository,
             DesktopWindowingEducationTooltipController desktopWindowingEducationTooltipController,
             @ShellMainThread CoroutineScope applicationScope,
-            @ShellBackgroundThread MainCoroutineDispatcher backgroundDispatcher) {
+            @ShellBackgroundThread MainCoroutineDispatcher backgroundDispatcher,
+            DesktopModeUiEventLogger desktopModeUiEventLogger) {
         return new AppHandleEducationController(
                 context,
                 appHandleEducationFilter,
@@ -1314,7 +1319,8 @@
                 windowDecorCaptionHandleRepository,
                 desktopWindowingEducationTooltipController,
                 applicationScope,
-                backgroundDispatcher);
+                backgroundDispatcher,
+                desktopModeUiEventLogger);
     }
 
     @WMSingleton
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 e7c76bb..7d80ee5 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
@@ -174,6 +174,7 @@
             @NonNull PipScheduler pipScheduler,
             @NonNull SizeSpecSource sizeSpecSource,
             @NonNull PipDisplayLayoutState pipDisplayLayoutState,
+            PipDesktopState pipDesktopState,
             DisplayController displayController,
             PipMotionHelper pipMotionHelper,
             FloatingContentCoordinator floatingContentCoordinator,
@@ -182,8 +183,8 @@
             Optional<PipPerfHintController> pipPerfHintControllerOptional) {
         return new PipTouchHandler(context, shellInit, shellCommandHandler, menuPhoneController,
                 pipBoundsAlgorithm, pipBoundsState, pipTransitionState, pipScheduler,
-                sizeSpecSource, pipDisplayLayoutState, displayController, pipMotionHelper,
-                floatingContentCoordinator, pipUiEventLogger, mainExecutor,
+                sizeSpecSource, pipDisplayLayoutState, pipDesktopState, displayController,
+                pipMotionHelper, floatingContentCoordinator, pipUiEventLogger, mainExecutor,
                 pipPerfHintControllerOptional);
     }
 
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt
index c9b3ec0..1f7edb4 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt
@@ -71,9 +71,31 @@
         wct: WindowContainerTransaction?,
     ) = freeformTaskTransitionHandler.startWindowingModeTransition(targetWindowingMode, wct)
 
-    /** Delegates starting minimized mode transition to [FreeformTaskTransitionHandler]. */
-    override fun startMinimizedModeTransition(wct: WindowContainerTransaction?): IBinder =
-        freeformTaskTransitionHandler.startMinimizedModeTransition(wct)
+    /**
+     * Starts a minimize transition for [taskId], with [isLastTask] which is true if the task going
+     * to be minimized is the last visible task.
+     */
+    override fun startMinimizedModeTransition(
+        wct: WindowContainerTransaction?,
+        taskId: Int,
+        isLastTask: Boolean,
+    ): IBinder {
+        if (!DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_EXIT_BY_MINIMIZE_TRANSITION_BUGFIX.isTrue) {
+            return freeformTaskTransitionHandler.startMinimizedModeTransition(
+                wct,
+                taskId,
+                isLastTask,
+            )
+        }
+        requireNotNull(wct)
+        return transitions
+            .startTransition(Transitions.TRANSIT_MINIMIZE, wct, /* handler= */ this)
+            .also { transition ->
+                pendingMixedTransitions.add(
+                    PendingMixedTransition.Minimize(transition, taskId, isLastTask)
+                )
+            }
+    }
 
     /** Delegates starting PiP transition to [FreeformTaskTransitionHandler]. */
     override fun startPipTransition(wct: WindowContainerTransaction?): IBinder =
@@ -298,7 +320,15 @@
         finishTransaction: SurfaceControl.Transaction,
         finishCallback: TransitionFinishCallback,
     ): Boolean {
-        if (!DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION.isTrue) return false
+        val shouldAnimate =
+            if (info.type == Transitions.TRANSIT_MINIMIZE) {
+                DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_EXIT_BY_MINIMIZE_TRANSITION_BUGFIX.isTrue
+            } else {
+                DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION.isTrue
+            }
+        if (!shouldAnimate) {
+            return false
+        }
 
         val minimizeChange = findTaskChange(info, pending.minimizingTask)
         if (minimizeChange == null) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeUiEventLogger.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeUiEventLogger.kt
index b96b9d2..b9cb32d 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeUiEventLogger.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeUiEventLogger.kt
@@ -149,7 +149,25 @@
         @UiEvent(doc = "Enter multi-instance by using the New Window button")
         DESKTOP_WINDOW_MULTI_INSTANCE_NEW_WINDOW_CLICK(2069),
         @UiEvent(doc = "Enter multi-instance by clicking an icon in the Manage Windows menu")
-        DESKTOP_WINDOW_MULTI_INSTANCE_MANAGE_WINDOWS_ICON_CLICK(2070);
+        DESKTOP_WINDOW_MULTI_INSTANCE_MANAGE_WINDOWS_ICON_CLICK(2070),
+        @UiEvent(doc = "Education tooltip on the app handle is shown")
+        APP_HANDLE_EDUCATION_TOOLTIP_SHOWN(2097),
+        @UiEvent(doc = "Education tooltip on the app handle is clicked")
+        APP_HANDLE_EDUCATION_TOOLTIP_CLICKED(2098),
+        @UiEvent(doc = "Education tooltip on the app handle is dismissed by the user")
+        APP_HANDLE_EDUCATION_TOOLTIP_DISMISSED(2099),
+        @UiEvent(doc = "Enter desktop mode education tooltip on the app handle menu is shown")
+        ENTER_DESKTOP_MODE_EDUCATION_TOOLTIP_SHOWN(2100),
+        @UiEvent(doc = "Enter desktop mode education tooltip on the app handle menu is clicked")
+        ENTER_DESKTOP_MODE_EDUCATION_TOOLTIP_CLICKED(2101),
+        @UiEvent(doc = "Enter desktop mode education tooltip is dismissed by the user")
+        ENTER_DESKTOP_MODE_EDUCATION_TOOLTIP_DISMISSED(2102),
+        @UiEvent(doc = "Exit desktop mode education tooltip on the app header menu is shown")
+        EXIT_DESKTOP_MODE_EDUCATION_TOOLTIP_SHOWN(2103),
+        @UiEvent(doc = "Exit desktop mode education tooltip on the app header menu is clicked")
+        EXIT_DESKTOP_MODE_EDUCATION_TOOLTIP_CLICKED(2104),
+        @UiEvent(doc = "Exit desktop mode education tooltip is dismissed by the user")
+        EXIT_DESKTOP_MODE_EDUCATION_TOOLTIP_DISMISSED(2105);
 
         override fun getId(): Int = mId
     }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeVisualIndicator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeVisualIndicator.java
index 27aed17..99f05283 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeVisualIndicator.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeVisualIndicator.java
@@ -18,9 +18,6 @@
 
 import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
 import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
-import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
-import static android.view.WindowManager.LayoutParams.INPUT_FEATURE_NO_INPUT_CHANNEL;
-import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
 
 import static com.android.wm.shell.desktopmode.DesktopModeVisualIndicator.IndicatorType.NO_INDICATOR;
 import static com.android.wm.shell.desktopmode.DesktopModeVisualIndicator.IndicatorType.TO_DESKTOP_INDICATOR;
@@ -28,37 +25,27 @@
 import static com.android.wm.shell.desktopmode.DesktopModeVisualIndicator.IndicatorType.TO_SPLIT_LEFT_INDICATOR;
 import static com.android.wm.shell.desktopmode.DesktopModeVisualIndicator.IndicatorType.TO_SPLIT_RIGHT_INDICATOR;
 
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.RectEvaluator;
-import android.animation.ValueAnimator;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.ActivityManager;
 import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.PixelFormat;
 import android.graphics.PointF;
 import android.graphics.Rect;
 import android.graphics.Region;
-import android.graphics.drawable.LayerDrawable;
-import android.util.DisplayMetrics;
 import android.view.SurfaceControl;
-import android.view.SurfaceControlViewHost;
-import android.view.View;
-import android.view.WindowManager;
-import android.view.WindowlessWindowManager;
-import android.view.animation.DecelerateInterpolator;
+import android.window.DesktopModeFlags;
 
 import androidx.annotation.VisibleForTesting;
 
 import com.android.internal.policy.SystemBarUtils;
-import com.android.window.flags.Flags;
 import com.android.wm.shell.R;
 import com.android.wm.shell.RootTaskDisplayAreaOrganizer;
 import com.android.wm.shell.common.DisplayController;
 import com.android.wm.shell.common.DisplayLayout;
+import com.android.wm.shell.common.ShellExecutor;
 import com.android.wm.shell.common.SyncTransactionQueue;
+import com.android.wm.shell.shared.annotations.ShellDesktopThread;
+import com.android.wm.shell.shared.annotations.ShellMainThread;
 import com.android.wm.shell.shared.bubbles.BubbleAnythingFlagHelper;
 import com.android.wm.shell.shared.bubbles.BubbleDropTargetBoundsProvider;
 import com.android.wm.shell.shared.desktopmode.DesktopModeStatus;
@@ -115,37 +102,54 @@
         }
     }
 
+    private final VisualIndicatorViewContainer mVisualIndicatorViewContainer;
+
     private final Context mContext;
     private final DisplayController mDisplayController;
-    private final RootTaskDisplayAreaOrganizer mRootTdaOrganizer;
     private final ActivityManager.RunningTaskInfo mTaskInfo;
-    private final SurfaceControl mTaskSurface;
-    private final @Nullable BubbleDropTargetBoundsProvider mBubbleBoundsProvider;
-    private SurfaceControl mLeash;
 
-    private final SyncTransactionQueue mSyncQueue;
-    private SurfaceControlViewHost mViewHost;
-
-    private View mView;
     private IndicatorType mCurrentType;
-    private DragStartState mDragStartState;
-    private boolean mIsReleased;
+    private final DragStartState mDragStartState;
 
-    public DesktopModeVisualIndicator(SyncTransactionQueue syncQueue,
+    public DesktopModeVisualIndicator(@ShellDesktopThread ShellExecutor desktopExecutor,
+            @ShellMainThread ShellExecutor mainExecutor,
+            SyncTransactionQueue syncQueue,
             ActivityManager.RunningTaskInfo taskInfo, DisplayController displayController,
             Context context, SurfaceControl taskSurface,
             RootTaskDisplayAreaOrganizer taskDisplayAreaOrganizer,
             DragStartState dragStartState,
             @Nullable BubbleDropTargetBoundsProvider bubbleBoundsProvider) {
-        mSyncQueue = syncQueue;
+        SurfaceControl.Builder builder = new SurfaceControl.Builder();
+        taskDisplayAreaOrganizer.attachToDisplayArea(taskInfo.displayId, builder);
+        mVisualIndicatorViewContainer = new VisualIndicatorViewContainer(
+                DesktopModeFlags.ENABLE_DESKTOP_INDICATOR_IN_SEPARATE_THREAD_BUGFIX.isTrue()
+                        ? desktopExecutor : mainExecutor,
+                mainExecutor, builder, syncQueue, bubbleBoundsProvider);
         mTaskInfo = taskInfo;
         mDisplayController = displayController;
         mContext = context;
-        mTaskSurface = taskSurface;
-        mRootTdaOrganizer = taskDisplayAreaOrganizer;
-        mBubbleBoundsProvider = bubbleBoundsProvider;
         mCurrentType = NO_INDICATOR;
         mDragStartState = dragStartState;
+        mVisualIndicatorViewContainer.createView(
+                mContext,
+                mDisplayController.getDisplay(mTaskInfo.displayId),
+                mDisplayController.getDisplayLayout(mTaskInfo.displayId),
+                mTaskInfo,
+                taskSurface
+        );
+    }
+
+    /** Start the fade out animation, running the callback on the main thread once it is done. */
+    public void fadeOutIndicator(
+            @NonNull Runnable callback) {
+        mVisualIndicatorViewContainer.fadeOutIndicator(
+                mDisplayController.getDisplayLayout(mTaskInfo.displayId), mCurrentType, callback
+        );
+    }
+
+    /** Release the visual indicator view and its viewhost. */
+    public void releaseVisualIndicator() {
+        mVisualIndicatorViewContainer.releaseVisualIndicator();
     }
 
     /**
@@ -202,11 +206,21 @@
             }
         }
         if (mDragStartState != DragStartState.DRAGGED_INTENT) {
-            transitionIndicator(result);
+            mVisualIndicatorViewContainer.transitionIndicator(
+                    mTaskInfo, mDisplayController, mCurrentType, result
+            );
+            mCurrentType = result;
         }
         return result;
     }
 
+    /**
+     * Returns the [DragStartState] of the visual indicator.
+     */
+    DragStartState getDragStartState() {
+        return mDragStartState;
+    }
+
     @VisibleForTesting
     Region calculateFullscreenRegion(DisplayLayout layout, int captionHeight) {
         final Region region = new Region();
@@ -283,338 +297,8 @@
                 layout.width(), layout.height());
     }
 
-    /**
-     * Create a fullscreen indicator with no animation
-     */
-    private void createView() {
-        if (mIsReleased) return;
-        final SurfaceControl.Transaction t = new SurfaceControl.Transaction();
-        final Resources resources = mContext.getResources();
-        final DisplayMetrics metrics = resources.getDisplayMetrics();
-        final int screenWidth;
-        final int screenHeight;
-        if (Flags.enableBugFixesForSecondaryDisplay()) {
-            final DisplayLayout displayLayout =
-                    mDisplayController.getDisplayLayout(mTaskInfo.displayId);
-            screenWidth = displayLayout.width();
-            screenHeight = displayLayout.height();
-        } else {
-            screenWidth = metrics.widthPixels;
-            screenHeight = metrics.heightPixels;
-        }
-        mView = new View(mContext);
-        final SurfaceControl.Builder builder = new SurfaceControl.Builder();
-        mRootTdaOrganizer.attachToDisplayArea(mTaskInfo.displayId, builder);
-        mLeash = builder
-                .setName("Desktop Mode Visual Indicator")
-                .setContainerLayer()
-                .setCallsite("DesktopModeVisualIndicator.createView")
-                .build();
-        t.show(mLeash);
-        final WindowManager.LayoutParams lp =
-                new WindowManager.LayoutParams(screenWidth, screenHeight, TYPE_APPLICATION,
-                        FLAG_NOT_FOCUSABLE, PixelFormat.TRANSPARENT);
-        lp.setTitle("Desktop Mode Visual Indicator");
-        lp.setTrustedOverlay();
-        lp.inputFeatures |= INPUT_FEATURE_NO_INPUT_CHANNEL;
-        final WindowlessWindowManager windowManager = new WindowlessWindowManager(
-                mTaskInfo.configuration, mLeash,
-                /* hostInputToken= */ null);
-        mViewHost = new SurfaceControlViewHost(mContext,
-                mDisplayController.getDisplay(mTaskInfo.displayId), windowManager,
-                "DesktopModeVisualIndicator");
-        mViewHost.setView(mView, lp);
-        // We want this indicator to be behind the dragged task, but in front of all others.
-        t.setRelativeLayer(mLeash, mTaskSurface, -1);
-
-        mSyncQueue.runInSync(transaction -> {
-            transaction.merge(t);
-            t.close();
-        });
-    }
-
     @VisibleForTesting
     Rect getIndicatorBounds() {
-        return mView.getBackground().getBounds();
-    }
-
-    /**
-     * Fade indicator in as provided type. Animator fades it in while expanding the bounds outwards.
-     */
-    private void fadeInIndicator(IndicatorType type) {
-        mView.setBackgroundResource(R.drawable.desktop_windowing_transition_background);
-        final VisualIndicatorAnimator animator = VisualIndicatorAnimator
-                .fadeBoundsIn(mView, type,
-                        mDisplayController.getDisplayLayout(mTaskInfo.displayId),
-                        mBubbleBoundsProvider);
-        animator.start();
-        mCurrentType = type;
-    }
-
-    /**
-     * Fade out indicator without fully releasing it. Animator fades it out while shrinking bounds.
-     *
-     * @param finishCallback called when animation ends or gets cancelled
-     */
-    void fadeOutIndicator(@Nullable Runnable finishCallback) {
-        if (mCurrentType == NO_INDICATOR) {
-            // In rare cases, fade out can be requested before the indicator has determined its
-            // initial type and started animating in. In this case, no animator is needed.
-            finishCallback.run();
-            return;
-        }
-        final VisualIndicatorAnimator animator = VisualIndicatorAnimator
-                .fadeBoundsOut(mView, mCurrentType,
-                        mDisplayController.getDisplayLayout(mTaskInfo.displayId),
-                        mBubbleBoundsProvider);
-        animator.start();
-        if (finishCallback != null) {
-            animator.addListener(new AnimatorListenerAdapter() {
-                @Override
-                public void onAnimationEnd(Animator animation) {
-                    finishCallback.run();
-                }
-            });
-        }
-        mCurrentType = NO_INDICATOR;
-    }
-
-    /**
-     * Takes existing indicator and animates it to bounds reflecting a new indicator type.
-     */
-    private void transitionIndicator(IndicatorType newType) {
-        if (mCurrentType == newType) return;
-        if (mView == null) {
-            createView();
-        }
-        if (mCurrentType == NO_INDICATOR) {
-            fadeInIndicator(newType);
-        } else if (newType == NO_INDICATOR) {
-            fadeOutIndicator(/* finishCallback= */ null);
-        } else {
-            final VisualIndicatorAnimator animator = VisualIndicatorAnimator.animateIndicatorType(
-                    mView, mDisplayController.getDisplayLayout(mTaskInfo.displayId), mCurrentType,
-                    newType, mBubbleBoundsProvider);
-            mCurrentType = newType;
-            animator.start();
-        }
-    }
-
-    /**
-     * Release the indicator and its components when it is no longer needed.
-     */
-    public void releaseVisualIndicator(SurfaceControl.Transaction t) {
-        mIsReleased = true;
-        if (mViewHost == null) return;
-        if (mViewHost != null) {
-            mViewHost.release();
-            mViewHost = null;
-        }
-
-        if (mLeash != null) {
-            t.remove(mLeash);
-            mLeash = null;
-        }
-    }
-
-    /**
-     * Animator for Desktop Mode transitions which supports bounds and alpha animation.
-     */
-    private static class VisualIndicatorAnimator extends ValueAnimator {
-        private static final int FULLSCREEN_INDICATOR_DURATION = 200;
-        private static final float FULLSCREEN_SCALE_ADJUSTMENT_PERCENT = 0.015f;
-        private static final float INDICATOR_FINAL_OPACITY = 0.35f;
-        private static final int MAXIMUM_OPACITY = 255;
-
-        /**
-         * Determines how this animator will interact with the view's alpha:
-         * Fade in, fade out, or no change to alpha
-         */
-        private enum AlphaAnimType {
-            ALPHA_FADE_IN_ANIM, ALPHA_FADE_OUT_ANIM, ALPHA_NO_CHANGE_ANIM
-        }
-
-        private final View mView;
-        private final Rect mStartBounds;
-        private final Rect mEndBounds;
-        private final RectEvaluator mRectEvaluator;
-
-        private VisualIndicatorAnimator(View view, Rect startBounds,
-                Rect endBounds) {
-            mView = view;
-            mStartBounds = new Rect(startBounds);
-            mEndBounds = endBounds;
-            setFloatValues(0, 1);
-            mRectEvaluator = new RectEvaluator(new Rect());
-        }
-
-        private static VisualIndicatorAnimator fadeBoundsIn(
-                @NonNull View view, IndicatorType type, @NonNull DisplayLayout displayLayout,
-                @Nullable BubbleDropTargetBoundsProvider bubbleBoundsProvider) {
-            final Rect endBounds = getIndicatorBounds(displayLayout, type, bubbleBoundsProvider);
-            final Rect startBounds = getMinBounds(endBounds);
-            view.getBackground().setBounds(startBounds);
-
-            final VisualIndicatorAnimator animator = new VisualIndicatorAnimator(
-                    view, startBounds, endBounds);
-            animator.setInterpolator(new DecelerateInterpolator());
-            setupIndicatorAnimation(animator, AlphaAnimType.ALPHA_FADE_IN_ANIM);
-            return animator;
-        }
-
-        private static VisualIndicatorAnimator fadeBoundsOut(
-                @NonNull View view, IndicatorType type, @NonNull DisplayLayout displayLayout,
-                @Nullable BubbleDropTargetBoundsProvider bubbleBoundsProvider) {
-            final Rect startBounds = getIndicatorBounds(displayLayout, type, bubbleBoundsProvider);
-            final Rect endBounds = getMinBounds(startBounds);
-            view.getBackground().setBounds(startBounds);
-
-            final VisualIndicatorAnimator animator = new VisualIndicatorAnimator(
-                    view, startBounds, endBounds);
-            animator.setInterpolator(new DecelerateInterpolator());
-            setupIndicatorAnimation(animator, AlphaAnimType.ALPHA_FADE_OUT_ANIM);
-            return animator;
-        }
-
-        /**
-         * Create animator for visual indicator changing type (i.e., fullscreen to freeform,
-         * freeform to split, etc.)
-         *
-         * @param view                 the view for this indicator
-         * @param displayLayout        information about the display the transitioning task is
-         *                             currently on
-         * @param origType             the original indicator type
-         * @param newType              the new indicator type
-         * @param bubbleBoundsProvider provides bounds for bubbles indicators
-         */
-        private static VisualIndicatorAnimator animateIndicatorType(@NonNull View view,
-                @NonNull DisplayLayout displayLayout, IndicatorType origType, IndicatorType newType,
-                @Nullable BubbleDropTargetBoundsProvider bubbleBoundsProvider) {
-            final Rect startBounds = getIndicatorBounds(displayLayout, origType,
-                    bubbleBoundsProvider);
-            final Rect endBounds = getIndicatorBounds(displayLayout, newType, bubbleBoundsProvider);
-            final VisualIndicatorAnimator animator = new VisualIndicatorAnimator(
-                    view, startBounds, endBounds);
-            animator.setInterpolator(new DecelerateInterpolator());
-            setupIndicatorAnimation(animator, AlphaAnimType.ALPHA_NO_CHANGE_ANIM);
-            return animator;
-        }
-
-        /** Calculates the bounds the indicator should have when fully faded in. */
-        private static Rect getIndicatorBounds(DisplayLayout layout, IndicatorType type,
-                @Nullable BubbleDropTargetBoundsProvider bubbleBoundsProvider) {
-            final Rect desktopStableBounds = new Rect();
-            layout.getStableBounds(desktopStableBounds);
-            final int padding = desktopStableBounds.top;
-            switch (type) {
-                case TO_FULLSCREEN_INDICATOR:
-                    desktopStableBounds.top += padding;
-                    desktopStableBounds.bottom -= padding;
-                    desktopStableBounds.left += padding;
-                    desktopStableBounds.right -= padding;
-                    return desktopStableBounds;
-                case TO_DESKTOP_INDICATOR:
-                    final float adjustmentPercentage = 1f
-                            - DesktopTasksController.DESKTOP_MODE_INITIAL_BOUNDS_SCALE;
-                    return new Rect((int) (adjustmentPercentage * desktopStableBounds.width() / 2),
-                            (int) (adjustmentPercentage * desktopStableBounds.height() / 2),
-                            (int) (desktopStableBounds.width()
-                                    - (adjustmentPercentage * desktopStableBounds.width() / 2)),
-                            (int) (desktopStableBounds.height()
-                                    - (adjustmentPercentage * desktopStableBounds.height() / 2)));
-                case TO_SPLIT_LEFT_INDICATOR:
-                    return new Rect(padding, padding,
-                            desktopStableBounds.width() / 2 - padding,
-                            desktopStableBounds.height());
-                case TO_SPLIT_RIGHT_INDICATOR:
-                    return new Rect(desktopStableBounds.width() / 2 + padding, padding,
-                            desktopStableBounds.width() - padding,
-                            desktopStableBounds.height());
-                case TO_BUBBLE_LEFT_INDICATOR:
-                    if (bubbleBoundsProvider == null) {
-                        return new Rect();
-                    }
-                    return bubbleBoundsProvider.getBubbleBarExpandedViewDropTargetBounds(
-                            /* onLeft= */ true);
-                case TO_BUBBLE_RIGHT_INDICATOR:
-                    if (bubbleBoundsProvider == null) {
-                        return new Rect();
-                    }
-                    return bubbleBoundsProvider.getBubbleBarExpandedViewDropTargetBounds(
-                            /* onLeft= */ false);
-                default:
-                    throw new IllegalArgumentException("Invalid indicator type provided.");
-            }
-        }
-
-        /**
-         * Add necessary listener for animation of indicator
-         */
-        private static void setupIndicatorAnimation(@NonNull VisualIndicatorAnimator animator,
-                AlphaAnimType animType) {
-            animator.addUpdateListener(a -> {
-                if (animator.mView != null) {
-                    animator.updateBounds(a.getAnimatedFraction(), animator.mView);
-                    if (animType == AlphaAnimType.ALPHA_FADE_IN_ANIM) {
-                        animator.updateIndicatorAlpha(a.getAnimatedFraction(), animator.mView);
-                    } else if (animType == AlphaAnimType.ALPHA_FADE_OUT_ANIM) {
-                        animator.updateIndicatorAlpha(1 - a.getAnimatedFraction(), animator.mView);
-                    }
-                } else {
-                    animator.cancel();
-                }
-            });
-            animator.addListener(new AnimatorListenerAdapter() {
-                @Override
-                public void onAnimationEnd(Animator animation) {
-                    animator.mView.getBackground().setBounds(animator.mEndBounds);
-                }
-            });
-            animator.setDuration(FULLSCREEN_INDICATOR_DURATION);
-        }
-
-        /**
-         * Update bounds of view based on current animation fraction.
-         * Use of delta is to animate bounds independently, in case we need to
-         * run multiple animations simultaneously.
-         *
-         * @param fraction fraction to use, compared against previous fraction
-         * @param view     the view to update
-         */
-        private void updateBounds(float fraction, View view) {
-            if (mStartBounds.equals(mEndBounds)) {
-                return;
-            }
-            final Rect currentBounds = mRectEvaluator.evaluate(fraction, mStartBounds, mEndBounds);
-            view.getBackground().setBounds(currentBounds);
-        }
-
-        /**
-         * Fade in the fullscreen indicator
-         *
-         * @param fraction current animation fraction
-         */
-        private void updateIndicatorAlpha(float fraction, View view) {
-            final LayerDrawable drawable = (LayerDrawable) view.getBackground();
-            drawable.findDrawableByLayerId(R.id.indicator_stroke)
-                    .setAlpha((int) (MAXIMUM_OPACITY * fraction));
-            drawable.findDrawableByLayerId(R.id.indicator_solid)
-                    .setAlpha((int) (MAXIMUM_OPACITY * fraction * INDICATOR_FINAL_OPACITY));
-        }
-
-        /**
-         * Return the minimum bounds of a visual indicator, to be used at the end of fading out
-         * and the start of fading in.
-         */
-        private static Rect getMinBounds(Rect maxBounds) {
-            return new Rect((int) (maxBounds.left
-                    + (FULLSCREEN_SCALE_ADJUSTMENT_PERCENT * maxBounds.width())),
-                    (int) (maxBounds.top
-                            + (FULLSCREEN_SCALE_ADJUSTMENT_PERCENT * maxBounds.height())),
-                    (int) (maxBounds.right
-                            - (FULLSCREEN_SCALE_ADJUSTMENT_PERCENT * maxBounds.width())),
-                    (int) (maxBounds.bottom
-                            - (FULLSCREEN_SCALE_ADJUSTMENT_PERCENT * maxBounds.height())));
-        }
+        return mVisualIndicatorViewContainer.getIndicatorBounds();
     }
 }
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 531304d..3f4edeb 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
@@ -41,6 +41,7 @@
 import android.os.IBinder
 import android.os.SystemProperties
 import android.os.UserHandle
+import android.util.Slog
 import android.view.Display.DEFAULT_DISPLAY
 import android.view.DragEvent
 import android.view.MotionEvent
@@ -116,6 +117,7 @@
 import com.android.wm.shell.recents.RecentsTransitionStateListener.TRANSITION_STATE_NOT_RUNNING
 import com.android.wm.shell.shared.TransitionUtil
 import com.android.wm.shell.shared.annotations.ExternalThread
+import com.android.wm.shell.shared.annotations.ShellDesktopThread
 import com.android.wm.shell.shared.annotations.ShellMainThread
 import com.android.wm.shell.shared.desktopmode.DesktopModeCompatPolicy
 import com.android.wm.shell.shared.desktopmode.DesktopModeStatus
@@ -135,7 +137,6 @@
 import com.android.wm.shell.transition.OneShotRemoteHandler
 import com.android.wm.shell.transition.Transitions
 import com.android.wm.shell.transition.Transitions.TransitionFinishCallback
-import com.android.wm.shell.windowdecor.DesktopModeWindowDecoration
 import com.android.wm.shell.windowdecor.DragPositioningCallbackUtility
 import com.android.wm.shell.windowdecor.MoveToDesktopAnimator
 import com.android.wm.shell.windowdecor.OnTaskRepositionAnimationListener
@@ -143,7 +144,7 @@
 import com.android.wm.shell.windowdecor.extension.isFullscreen
 import com.android.wm.shell.windowdecor.extension.isMultiWindow
 import com.android.wm.shell.windowdecor.extension.requestingImmersive
-import com.android.wm.shell.windowdecor.tiling.DesktopTilingDecorViewModel
+import com.android.wm.shell.windowdecor.tiling.SnapEventHandler
 import java.io.PrintWriter
 import java.util.Optional
 import java.util.concurrent.Executor
@@ -176,13 +177,13 @@
     private val recentsTransitionHandler: RecentsTransitionHandler,
     private val multiInstanceHelper: MultiInstanceHelper,
     @ShellMainThread private val mainExecutor: ShellExecutor,
+    @ShellDesktopThread private val desktopExecutor: ShellExecutor,
     private val desktopTasksLimiter: Optional<DesktopTasksLimiter>,
     private val recentTasksController: RecentTasksController?,
     private val interactionJankMonitor: InteractionJankMonitor,
     @ShellMainThread private val handler: Handler,
     private val desktopModeEventLogger: DesktopModeEventLogger,
     private val desktopModeUiEventLogger: DesktopModeUiEventLogger,
-    private val desktopTilingDecorViewModel: DesktopTilingDecorViewModel,
     private val desktopWallpaperActivityTokenProvider: DesktopWallpaperActivityTokenProvider,
     private val bubbleController: Optional<BubbleController>,
     private val overviewToDesktopTransitionObserver: OverviewToDesktopTransitionObserver,
@@ -202,26 +203,21 @@
     private var userId: Int
     private val desktopModeShellCommandHandler: DesktopModeShellCommandHandler =
         DesktopModeShellCommandHandler(this)
-    private val mOnAnimationFinishedCallback =
-        Consumer<SurfaceControl.Transaction> { t: SurfaceControl.Transaction ->
-            visualIndicator?.releaseVisualIndicator(t)
-            visualIndicator = null
-        }
+
+    private val mOnAnimationFinishedCallback = { releaseVisualIndicator() }
+    private lateinit var snapEventHandler: SnapEventHandler
     private val dragToDesktopStateListener =
         object : DragToDesktopStateListener {
-            override fun onCommitToDesktopAnimationStart(tx: SurfaceControl.Transaction) {
-                removeVisualIndicator(tx)
+            override fun onCommitToDesktopAnimationStart() {
+                removeVisualIndicator()
             }
 
-            override fun onCancelToDesktopAnimationEnd(tx: SurfaceControl.Transaction) {
-                removeVisualIndicator(tx)
+            override fun onCancelToDesktopAnimationEnd() {
+                removeVisualIndicator()
             }
 
-            private fun removeVisualIndicator(tx: SurfaceControl.Transaction) {
-                visualIndicator?.fadeOutIndicator {
-                    visualIndicator?.releaseVisualIndicator(tx)
-                    visualIndicator = null
-                }
+            private fun removeVisualIndicator() {
+                visualIndicator?.fadeOutIndicator { releaseVisualIndicator() }
             }
         }
 
@@ -274,7 +270,7 @@
                         RecentsTransitionStateListener.stateToString(state),
                     )
                     recentsTransitionState = state
-                    desktopTilingDecorViewModel.onOverviewAnimationStateChange(
+                    snapEventHandler.onOverviewAnimationStateChange(
                         RecentsTransitionStateListener.isAnimating(state)
                     )
                 }
@@ -305,6 +301,11 @@
         dragToDesktopTransitionHandler.setSplitScreenController(controller)
     }
 
+    /** Setter to handle snap events */
+    fun setSnapEventHandler(handler: SnapEventHandler) {
+        snapEventHandler = handler
+    }
+
     /** Returns the transition type for the given remote transition. */
     private fun transitionType(remoteTransition: RemoteTransition?): Int {
         if (remoteTransition == null) {
@@ -789,7 +790,7 @@
         taskInfo: RunningTaskInfo,
     ): ((IBinder) -> Unit)? {
         val taskId = taskInfo.taskId
-        desktopTilingDecorViewModel.removeTaskIfTiled(displayId, taskId)
+        snapEventHandler.removeTaskIfTiled(displayId, taskId)
         performDesktopExitCleanupIfNeeded(taskId, displayId, wct, forceToFullscreen = false)
         taskRepository.addClosingTask(displayId, taskId)
         taskbarDesktopTaskListener?.onTaskbarCornerRoundingUpdate(
@@ -838,6 +839,7 @@
         val taskId = taskInfo.taskId
         val displayId = taskInfo.displayId
         val wct = WindowContainerTransaction()
+        snapEventHandler.removeTaskIfTiled(displayId, taskId)
         performDesktopExitCleanupIfNeeded(taskId, displayId, wct, forceToFullscreen = false)
         // Notify immersive handler as it might need to exit immersive state.
         val exitResult =
@@ -848,7 +850,9 @@
             )
 
         wct.reorder(taskInfo.token, false)
-        val transition = freeformTaskTransitionStarter.startMinimizedModeTransition(wct)
+        val isLastTask = taskRepository.isOnlyVisibleNonClosingTask(taskId, displayId)
+        val transition: IBinder =
+            freeformTaskTransitionStarter.startMinimizedModeTransition(wct, taskId, isLastTask)
         desktopTasksLimiter.ifPresent {
             it.addPendingMinimizeChange(
                 transition = transition,
@@ -863,7 +867,7 @@
     /** Move a task with given `taskId` to fullscreen */
     fun moveToFullscreen(taskId: Int, transitionSource: DesktopModeTransitionSource) {
         shellTaskOrganizer.getRunningTaskInfo(taskId)?.let { task ->
-            desktopTilingDecorViewModel.removeTaskIfTiled(task.displayId, taskId)
+            snapEventHandler.removeTaskIfTiled(task.displayId, taskId)
             moveToFullscreenWithAnimation(task, task.positionInParent, transitionSource)
         }
     }
@@ -871,7 +875,7 @@
     /** Enter fullscreen by moving the focused freeform task in given `displayId` to fullscreen. */
     fun enterFullscreen(displayId: Int, transitionSource: DesktopModeTransitionSource) {
         getFocusedFreeformTask(displayId)?.let {
-            desktopTilingDecorViewModel.removeTaskIfTiled(displayId, it.taskId)
+            snapEventHandler.removeTaskIfTiled(displayId, it.taskId)
             moveToFullscreenWithAnimation(it, it.positionInParent, transitionSource)
         }
     }
@@ -990,7 +994,7 @@
         logV("moveTaskToFront taskId=%s", taskInfo.taskId)
         // If a task is tiled, another task should be brought to foreground with it so let
         // tiling controller handle the request.
-        if (desktopTilingDecorViewModel.moveTaskToFrontIfTiled(taskInfo)) {
+        if (snapEventHandler.moveTaskToFrontIfTiled(taskInfo)) {
             return
         }
         val wct = WindowContainerTransaction()
@@ -1232,7 +1236,7 @@
         } else {
             // Save current bounds so that task can be restored back to original bounds if necessary
             // and toggle to the stable bounds.
-            desktopTilingDecorViewModel.removeTaskIfTiled(taskInfo.displayId, taskInfo.taskId)
+            snapEventHandler.removeTaskIfTiled(taskInfo.displayId, taskInfo.taskId)
             taskRepository.saveBoundsBeforeMaximize(taskInfo.taskId, currentTaskBounds)
             destinationBounds.set(calculateMaximizeBounds(displayLayout, taskInfo))
         }
@@ -1358,7 +1362,6 @@
         position: SnapPosition,
         resizeTrigger: ResizeTrigger,
         inputMethod: InputMethod,
-        desktopWindowDecoration: DesktopModeWindowDecoration,
     ) {
         desktopModeEventLogger.logTaskResizingStarted(
             resizeTrigger,
@@ -1380,13 +1383,7 @@
         )
 
         if (DesktopModeFlags.ENABLE_TILE_RESIZING.isTrue()) {
-            val isTiled =
-                desktopTilingDecorViewModel.snapToHalfScreen(
-                    taskInfo,
-                    desktopWindowDecoration,
-                    position,
-                    currentDragBounds,
-                )
+            val isTiled = snapEventHandler.snapToHalfScreen(taskInfo, currentDragBounds, position)
             if (isTiled) {
                 taskbarDesktopTaskListener?.onTaskbarCornerRoundingUpdate(true)
             }
@@ -1423,7 +1420,6 @@
         position: SnapPosition,
         resizeTrigger: ResizeTrigger,
         inputMethod: InputMethod,
-        desktopModeWindowDecoration: DesktopModeWindowDecoration,
     ) {
         if (!isSnapResizingAllowed(taskInfo)) {
             Toast.makeText(
@@ -1442,7 +1438,6 @@
             position,
             resizeTrigger,
             inputMethod,
-            desktopModeWindowDecoration,
         )
     }
 
@@ -1454,7 +1449,6 @@
         currentDragBounds: Rect,
         dragStartBounds: Rect,
         motionEvent: MotionEvent,
-        desktopModeWindowDecoration: DesktopModeWindowDecoration,
     ) {
         releaseVisualIndicator()
         if (!isSnapResizingAllowed(taskInfo)) {
@@ -1502,7 +1496,6 @@
                 position,
                 resizeTrigger,
                 DesktopModeEventLogger.getInputMethodFromMotionEvent(motionEvent),
-                desktopModeWindowDecoration,
             )
         }
     }
@@ -1773,13 +1766,8 @@
     }
 
     fun releaseVisualIndicator() {
-        val t = SurfaceControl.Transaction()
-        visualIndicator?.releaseVisualIndicator(t)
+        visualIndicator?.releaseVisualIndicator()
         visualIndicator = null
-        syncQueue.runInSync { transaction ->
-            transaction.merge(t)
-            t.close()
-        }
     }
 
     override fun getContext(): Context = context
@@ -1999,6 +1987,9 @@
                 splitPosition,
                 options.toBundle(),
                 /* hideTaskToken= */ null,
+                if (enableFlexibleSplit())
+                    splitScreenController.determineNewInstanceIndex(callingTask)
+                else SPLIT_INDEX_UNDEFINED,
             )
         }
     }
@@ -2175,7 +2166,7 @@
             return wct
         }
         if (!wct.isEmpty) {
-            desktopTilingDecorViewModel.removeTaskIfTiled(task.displayId, task.taskId)
+            snapEventHandler.removeTaskIfTiled(task.displayId, task.taskId)
             return wct
         }
         return null
@@ -2271,7 +2262,7 @@
 
         if (!DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION.isTrue()) {
             taskRepository.addClosingTask(task.displayId, task.taskId)
-            desktopTilingDecorViewModel.removeTaskIfTiled(task.displayId, task.taskId)
+            snapEventHandler.removeTaskIfTiled(task.displayId, task.taskId)
         }
 
         taskbarDesktopTaskListener?.onTaskbarCornerRoundingUpdate(
@@ -2689,15 +2680,22 @@
     }
 
     /** Requests a task be transitioned from whatever mode it's in to a bubble. */
-    fun requestFloat(taskInfo: RunningTaskInfo) {
+    @JvmOverloads
+    fun requestFloat(taskInfo: RunningTaskInfo, left: Boolean? = null) {
         val isDragging = dragToDesktopTransitionHandler.inProgress
         val shouldRequestFloat =
             taskInfo.isFullscreen || taskInfo.isFreeform || isDragging || taskInfo.isMultiWindow
         if (!shouldRequestFloat) return
         if (isDragging) {
             releaseVisualIndicator()
+            val cancelState =
+                if (left == true) DragToDesktopTransitionHandler.CancelState.CANCEL_BUBBLE_LEFT
+                else DragToDesktopTransitionHandler.CancelState.CANCEL_BUBBLE_RIGHT
+            dragToDesktopTransitionHandler.cancelDragToDesktopTransition(cancelState)
         } else {
-            bubbleController.ifPresent { it.expandStackAndSelectBubble(taskInfo) }
+            bubbleController.ifPresent {
+                it.expandStackAndSelectBubble(taskInfo, /* dragData= */ null)
+            }
         }
     }
 
@@ -2729,7 +2727,7 @@
         taskBounds: Rect,
     ) {
         if (taskInfo.windowingMode != WINDOWING_MODE_FREEFORM) return
-        desktopTilingDecorViewModel.removeTaskIfTiled(taskInfo.displayId, taskInfo.taskId)
+        snapEventHandler.removeTaskIfTiled(taskInfo.displayId, taskInfo.taskId)
         updateVisualIndicator(
             taskInfo,
             taskSurface,
@@ -2746,10 +2744,18 @@
         taskTop: Float,
         dragStartState: DragStartState,
     ): DesktopModeVisualIndicator.IndicatorType {
+        // If the visual indicator has the wrong start state, it was never cleared from a previous
+        // drag event and needs to be cleared
+        if (visualIndicator != null && visualIndicator?.dragStartState != dragStartState) {
+            Slog.e(TAG, "Visual indicator from previous motion event was never released")
+            releaseVisualIndicator()
+        }
         // If the visual indicator does not exist, create it.
         val indicator =
             visualIndicator
                 ?: DesktopModeVisualIndicator(
+                    desktopExecutor,
+                    mainExecutor,
                     syncQueue,
                     taskInfo,
                     displayController,
@@ -2787,7 +2793,6 @@
         validDragArea: Rect,
         dragStartBounds: Rect,
         motionEvent: MotionEvent,
-        desktopModeWindowDecoration: DesktopModeWindowDecoration,
     ) {
         if (taskInfo.configuration.windowConfiguration.windowingMode != WINDOWING_MODE_FREEFORM) {
             return
@@ -2826,7 +2831,6 @@
                     currentDragBounds,
                     dragStartBounds,
                     motionEvent,
-                    desktopModeWindowDecoration,
                 )
             }
             IndicatorType.TO_SPLIT_RIGHT_INDICATOR -> {
@@ -2841,7 +2845,6 @@
                     currentDragBounds,
                     dragStartBounds,
                     motionEvent,
-                    desktopModeWindowDecoration,
                 )
             }
             IndicatorType.NO_INDICATOR,
@@ -2975,10 +2978,11 @@
                 )
                 requestSplit(taskInfo, leftOrTop = false)
             }
-            IndicatorType.TO_BUBBLE_LEFT_INDICATOR,
+            IndicatorType.TO_BUBBLE_LEFT_INDICATOR -> {
+                requestFloat(taskInfo, left = true)
+            }
             IndicatorType.TO_BUBBLE_RIGHT_INDICATOR -> {
-                // TODO(b/388851898): move to bubble
-                cancelDragToDesktop(taskInfo)
+                requestFloat(taskInfo, left = false)
             }
         }
         return indicatorType
@@ -3126,7 +3130,7 @@
         logV("onUserChanged previousUserId=%d, newUserId=%d", userId, newUserId)
         userId = newUserId
         taskRepository = userRepositories.getProfile(userId)
-        desktopTilingDecorViewModel.onUserChange()
+        snapEventHandler.onUserChange()
     }
 
     /** Called when a task's info changes. */
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 8194d3c..aaecf8c 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
@@ -37,6 +37,8 @@
 import com.android.internal.protolog.ProtoLog
 import com.android.wm.shell.RootTaskDisplayAreaOrganizer
 import com.android.wm.shell.animation.FloatProperties
+import com.android.wm.shell.bubbles.BubbleController
+import com.android.wm.shell.bubbles.BubbleTransitions
 import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_DESKTOP_MODE_CANCEL_DRAG_TO_DESKTOP
 import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_DESKTOP_MODE_END_DRAG_TO_DESKTOP
 import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_DESKTOP_MODE_START_DRAG_TO_DESKTOP
@@ -49,10 +51,12 @@
 import com.android.wm.shell.shared.split.SplitScreenConstants.SplitPosition
 import com.android.wm.shell.splitscreen.SplitScreenController
 import com.android.wm.shell.transition.Transitions
+import com.android.wm.shell.transition.Transitions.TRANSIT_CONVERT_TO_BUBBLE
 import com.android.wm.shell.transition.Transitions.TransitionHandler
 import com.android.wm.shell.windowdecor.MoveToDesktopAnimator
 import com.android.wm.shell.windowdecor.MoveToDesktopAnimator.Companion.DRAG_FREEFORM_SCALE
 import com.android.wm.shell.windowdecor.OnTaskResizeAnimationListener
+import java.util.Optional
 import java.util.function.Supplier
 import kotlin.math.max
 
@@ -72,6 +76,7 @@
     private val taskDisplayAreaOrganizer: RootTaskDisplayAreaOrganizer,
     private val desktopUserRepositories: DesktopUserRepositories,
     protected val interactionJankMonitor: InteractionJankMonitor,
+    private val bubbleController: Optional<BubbleController>,
     protected val transactionSupplier: Supplier<SurfaceControl.Transaction>,
 ) : TransitionHandler {
 
@@ -241,6 +246,20 @@
             state.startTransitionFinishCb?.onTransitionFinished(/* wct= */ null)
             requestSplitFromScaledTask(splitPosition, wct)
             clearState()
+        } else if (
+            state.draggedTaskChange != null &&
+                (cancelState == CancelState.CANCEL_BUBBLE_LEFT ||
+                    cancelState == CancelState.CANCEL_BUBBLE_RIGHT)
+        ) {
+            if (!bubbleController.isPresent) {
+                startCancelAnimation()
+            } else {
+                // Animation is handled by BubbleController
+                val wct = WindowContainerTransaction()
+                restoreWindowOrder(wct, state)
+                val onLeft = cancelState == CancelState.CANCEL_BUBBLE_LEFT
+                requestBubbleFromScaledTask(wct, onLeft)
+            }
         } else {
             // There's no dragged task, this can happen when the "cancel" happened too quickly
             // before the "start" transition is even ready (like on a fling gesture). The
@@ -258,20 +277,25 @@
     ) {
         val state = requireTransitionState()
         val taskInfo = state.draggedTaskChange?.taskInfo ?: error("Expected non-null taskInfo")
+        val animatedTaskBounds = getAnimatedTaskBounds()
+        requestSplitSelect(wct, taskInfo, splitPosition, animatedTaskBounds)
+    }
+
+    private fun getAnimatedTaskBounds(): Rect {
+        val state = requireTransitionState()
+        val taskInfo = state.draggedTaskChange?.taskInfo ?: error("Expected non-null taskInfo")
         val taskBounds = Rect(taskInfo.configuration.windowConfiguration.bounds)
         val taskScale = state.dragAnimator.scale
         val scaledWidth = taskBounds.width() * taskScale
         val scaledHeight = taskBounds.height() * taskScale
         val dragPosition = PointF(state.dragAnimator.position)
         state.dragAnimator.cancelAnimator()
-        val animatedTaskBounds =
-            Rect(
-                dragPosition.x.toInt(),
-                dragPosition.y.toInt(),
-                (dragPosition.x + scaledWidth).toInt(),
-                (dragPosition.y + scaledHeight).toInt(),
-            )
-        requestSplitSelect(wct, taskInfo, splitPosition, animatedTaskBounds)
+        return Rect(
+            dragPosition.x.toInt(),
+            dragPosition.y.toInt(),
+            (dragPosition.x + scaledWidth).toInt(),
+            (dragPosition.y + scaledHeight).toInt(),
+        )
     }
 
     private fun requestSplitSelect(
@@ -294,6 +318,29 @@
         splitScreenController.requestEnterSplitSelect(taskInfo, wct, splitPosition, taskBounds)
     }
 
+    private fun requestBubbleFromScaledTask(wct: WindowContainerTransaction, onLeft: Boolean) {
+        // TODO(b/391928049): update density once we can drag from desktop to bubble
+        val state = requireTransitionState()
+        val taskInfo = state.draggedTaskChange?.taskInfo ?: error("Expected non-null taskInfo")
+        val taskBounds = getAnimatedTaskBounds()
+        state.dragAnimator.cancelAnimator()
+        requestBubble(wct, taskInfo, onLeft, taskBounds)
+    }
+
+    private fun requestBubble(
+        wct: WindowContainerTransaction,
+        taskInfo: RunningTaskInfo,
+        onLeft: Boolean,
+        taskBounds: Rect = Rect(taskInfo.configuration.windowConfiguration.bounds),
+    ) {
+        val controller =
+            bubbleController.orElseThrow { IllegalStateException("BubbleController not set") }
+        controller.expandStackAndSelectBubble(
+            taskInfo,
+            BubbleTransitions.DragData(taskBounds, wct, onLeft),
+        )
+    }
+
     override fun startAnimation(
         transition: IBinder,
         info: TransitionInfo,
@@ -446,6 +493,16 @@
             state.startTransitionFinishTransaction?.apply()
             state.startTransitionFinishCb?.onTransitionFinished(/* wct= */ null)
             requestSplitSelect(wct, taskInfo, splitPosition)
+        } else if (
+            state.cancelState == CancelState.CANCEL_BUBBLE_LEFT ||
+                state.cancelState == CancelState.CANCEL_BUBBLE_RIGHT
+        ) {
+            val taskInfo =
+                state.draggedTaskChange?.taskInfo ?: error("Expected non-null task info.")
+            val wct = WindowContainerTransaction()
+            restoreWindowOrder(wct)
+            val onLeft = state.cancelState == CancelState.CANCEL_BUBBLE_LEFT
+            requestBubble(wct, taskInfo, onLeft)
         }
         return true
     }
@@ -476,6 +533,13 @@
             clearState()
             return
         }
+        // In case of bubble animation, finish the initial desktop drag animation, but keep the
+        // current animation running and have bubbles take over
+        if (info.type == TRANSIT_CONVERT_TO_BUBBLE) {
+            state.startTransitionFinishCb?.onTransitionFinished(/* wct= */ null)
+            clearState()
+            return
+        }
         val isCancelTransition =
             info.type == TRANSIT_DESKTOP_MODE_CANCEL_DRAG_TO_DESKTOP &&
                 transition == state.cancelTransitionToken &&
@@ -582,7 +646,7 @@
                 startPosition.y.toInt() + unscaledStartHeight,
             )
 
-        dragToDesktopStateListener?.onCommitToDesktopAnimationStart(startTransaction)
+        dragToDesktopStateListener?.onCommitToDesktopAnimationStart()
         // 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.
@@ -713,7 +777,7 @@
                 addListener(
                     object : AnimatorListenerAdapter() {
                         override fun onAnimationEnd(animation: Animator) {
-                            dragToDesktopStateListener?.onCancelToDesktopAnimationEnd(tx)
+                            dragToDesktopStateListener?.onCancelToDesktopAnimationEnd()
                             // Start the cancel transition to restore order.
                             startCancelDragToDesktopTransition()
                         }
@@ -806,9 +870,9 @@
     )
 
     interface DragToDesktopStateListener {
-        fun onCommitToDesktopAnimationStart(tx: SurfaceControl.Transaction)
+        fun onCommitToDesktopAnimationStart()
 
-        fun onCancelToDesktopAnimationEnd(tx: SurfaceControl.Transaction)
+        fun onCancelToDesktopAnimationEnd()
     }
 
     sealed class TransitionState {
@@ -869,6 +933,10 @@
         CANCEL_SPLIT_LEFT,
         /** A cancel event where the task will request to enter split on the right side. */
         CANCEL_SPLIT_RIGHT,
+        /** A cancel event where the task will request to bubble on the left side. */
+        CANCEL_BUBBLE_LEFT,
+        /** A cancel event where the task will request to bubble on the right side. */
+        CANCEL_BUBBLE_RIGHT,
     }
 
     companion object {
@@ -887,6 +955,7 @@
     taskDisplayAreaOrganizer: RootTaskDisplayAreaOrganizer,
     desktopUserRepositories: DesktopUserRepositories,
     interactionJankMonitor: InteractionJankMonitor,
+    bubbleController: Optional<BubbleController>,
     transactionSupplier: Supplier<SurfaceControl.Transaction> = Supplier {
         SurfaceControl.Transaction()
     },
@@ -897,6 +966,7 @@
         taskDisplayAreaOrganizer,
         desktopUserRepositories,
         interactionJankMonitor,
+        bubbleController,
         transactionSupplier,
     ) {
 
@@ -925,6 +995,7 @@
     taskDisplayAreaOrganizer: RootTaskDisplayAreaOrganizer,
     desktopUserRepositories: DesktopUserRepositories,
     interactionJankMonitor: InteractionJankMonitor,
+    bubbleController: Optional<BubbleController>,
     transactionSupplier: Supplier<SurfaceControl.Transaction> = Supplier {
         SurfaceControl.Transaction()
     },
@@ -935,6 +1006,7 @@
         taskDisplayAreaOrganizer,
         desktopUserRepositories,
         interactionJankMonitor,
+        bubbleController,
         transactionSupplier,
     ) {
 
@@ -1013,7 +1085,7 @@
         val startBoundsWithOffset =
             Rect(startBounds).apply { offset(startPosition.x.toInt(), startPosition.y.toInt()) }
 
-        dragToDesktopStateListener?.onCommitToDesktopAnimationStart(startTransaction)
+        dragToDesktopStateListener?.onCommitToDesktopAnimationStart()
         // 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.
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/ExitDesktopTaskTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/ExitDesktopTaskTransitionHandler.java
index f7f87ed..5ae1fca 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/ExitDesktopTaskTransitionHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/ExitDesktopTaskTransitionHandler.java
@@ -50,9 +50,11 @@
 import com.android.wm.shell.shared.desktopmode.DesktopModeTransitionSource;
 import com.android.wm.shell.transition.Transitions;
 
+import kotlin.Unit;
+import kotlin.jvm.functions.Function0;
+
 import java.util.ArrayList;
 import java.util.List;
-import java.util.function.Consumer;
 import java.util.function.Supplier;
 
 
@@ -69,7 +71,7 @@
     @ShellMainThread
     private final Handler mHandler;
     private final List<IBinder> mPendingTransitionTokens = new ArrayList<>();
-    private Consumer<SurfaceControl.Transaction> mOnAnimationFinishedCallback;
+    private Function0<Unit> mOnAnimationFinishedCallback;
     private final Supplier<SurfaceControl.Transaction> mTransactionSupplier;
     private Point mPosition;
 
@@ -106,7 +108,7 @@
      */
     public void startTransition(@NonNull DesktopModeTransitionSource transitionSource,
             @NonNull WindowContainerTransaction wct, Point position,
-            Consumer<SurfaceControl.Transaction> onAnimationEndCallback) {
+            Function0<Unit> onAnimationEndCallback) {
         mPosition = position;
         mOnAnimationFinishedCallback = onAnimationEndCallback;
         final IBinder token = mTransitions.startTransition(getExitTransitionType(transitionSource),
@@ -192,7 +194,7 @@
                 @Override
                 public void onAnimationEnd(Animator animation) {
                     if (mOnAnimationFinishedCallback != null) {
-                        mOnAnimationFinishedCallback.accept(finishT);
+                        mOnAnimationFinishedCallback.invoke();
                     }
                     mInteractionJankMonitor.end(Cuj.CUJ_DESKTOP_MODE_EXIT_MODE);
                     mTransitions.getMainExecutor().execute(
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/VisualIndicatorViewContainer.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/VisualIndicatorViewContainer.kt
new file mode 100644
index 0000000..2317274
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/VisualIndicatorViewContainer.kt
@@ -0,0 +1,491 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.desktopmode
+
+import android.animation.Animator
+import android.animation.AnimatorListenerAdapter
+import android.animation.RectEvaluator
+import android.animation.ValueAnimator
+import android.app.ActivityManager
+import android.content.Context
+import android.graphics.PixelFormat
+import android.graphics.Rect
+import android.graphics.drawable.LayerDrawable
+import android.view.Display
+import android.view.SurfaceControl
+import android.view.SurfaceControlViewHost
+import android.view.View
+import android.view.WindowManager
+import android.view.WindowlessWindowManager
+import android.view.animation.DecelerateInterpolator
+import com.android.internal.annotations.VisibleForTesting
+import com.android.window.flags.Flags
+import com.android.wm.shell.R
+import com.android.wm.shell.common.DisplayController
+import com.android.wm.shell.common.DisplayLayout
+import com.android.wm.shell.common.ShellExecutor
+import com.android.wm.shell.common.SyncTransactionQueue
+import com.android.wm.shell.desktopmode.DesktopModeVisualIndicator.IndicatorType
+import com.android.wm.shell.shared.annotations.ShellDesktopThread
+import com.android.wm.shell.shared.annotations.ShellMainThread
+import com.android.wm.shell.shared.bubbles.BubbleDropTargetBoundsProvider
+import com.android.wm.shell.windowdecor.WindowDecoration.SurfaceControlViewHostFactory
+
+/**
+ * Container for the view / viewhost of the indicator, ensuring it is created / animated off the
+ * main thread.
+ */
+@VisibleForTesting
+class VisualIndicatorViewContainer
+@JvmOverloads
+constructor(
+    @ShellDesktopThread private val desktopExecutor: ShellExecutor,
+    @ShellMainThread private val mainExecutor: ShellExecutor,
+    private val indicatorBuilder: SurfaceControl.Builder,
+    private val syncQueue: SyncTransactionQueue,
+    private val surfaceControlViewHostFactory: SurfaceControlViewHostFactory =
+        object : SurfaceControlViewHostFactory {},
+    private val bubbleBoundsProvider: BubbleDropTargetBoundsProvider?,
+) {
+    @VisibleForTesting var indicatorView: View? = null
+    private var indicatorViewHost: SurfaceControlViewHost? = null
+    // Below variables and the SyncTransactionQueue are the only variables that should
+    // be accessed from shell main thread. Everything else should be used exclusively
+    // from the desktop thread.
+    private var indicatorLeash: SurfaceControl? = null
+    private var isReleased = false
+
+    /** Create a fullscreen indicator with no animation */
+    @ShellMainThread
+    fun createView(
+        context: Context,
+        display: Display,
+        layout: DisplayLayout,
+        taskInfo: ActivityManager.RunningTaskInfo,
+        taskSurface: SurfaceControl,
+    ) {
+        if (isReleased) return
+        desktopExecutor.execute {
+            val resources = context.resources
+            val metrics = resources.displayMetrics
+            val screenWidth: Int
+            val screenHeight: Int
+            if (Flags.enableBugFixesForSecondaryDisplay()) {
+                screenWidth = layout.width()
+                screenHeight = layout.height()
+            } else {
+                screenWidth = metrics.widthPixels
+                screenHeight = metrics.heightPixels
+            }
+            indicatorView = View(context)
+            val leash =
+                indicatorBuilder
+                    .setName("Desktop Mode Visual Indicator")
+                    .setContainerLayer()
+                    .setCallsite("DesktopModeVisualIndicator.createView")
+                    .build()
+            val lp =
+                WindowManager.LayoutParams(
+                    screenWidth,
+                    screenHeight,
+                    WindowManager.LayoutParams.TYPE_APPLICATION,
+                    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
+                    PixelFormat.TRANSPARENT,
+                )
+            lp.title = "Desktop Mode Visual Indicator"
+            lp.setTrustedOverlay()
+            lp.inputFeatures =
+                lp.inputFeatures or WindowManager.LayoutParams.INPUT_FEATURE_NO_INPUT_CHANNEL
+            val windowManager =
+                WindowlessWindowManager(
+                    taskInfo.configuration,
+                    leash,
+                    /* hostInputTransferToken= */ null,
+                )
+            indicatorViewHost =
+                surfaceControlViewHostFactory.create(
+                    context,
+                    display,
+                    windowManager,
+                    "VisualIndicatorViewContainer",
+                )
+            indicatorView?.let { indicatorViewHost?.setView(it, lp) }
+            showIndicator(taskSurface, leash)
+        }
+    }
+
+    private fun showIndicator(taskSurface: SurfaceControl, leash: SurfaceControl) {
+        mainExecutor.execute {
+            indicatorLeash = leash
+            val t = SurfaceControl.Transaction()
+            t.show(indicatorLeash)
+            // We want this indicator to be behind the dragged task, but in front of all others.
+            t.setRelativeLayer(indicatorLeash, taskSurface, -1)
+            syncQueue.runInSync { transaction: SurfaceControl.Transaction ->
+                transaction.merge(t)
+                t.close()
+            }
+        }
+    }
+
+    @VisibleForTesting
+    fun getIndicatorBounds(): Rect {
+        return indicatorView?.background?.getBounds() ?: Rect()
+    }
+
+    /**
+     * Takes existing indicator and animates it to bounds reflecting a new indicator type. Should
+     * only be called from the main thread.
+     */
+    @ShellMainThread
+    fun transitionIndicator(
+        taskInfo: ActivityManager.RunningTaskInfo,
+        displayController: DisplayController,
+        currentType: IndicatorType,
+        newType: IndicatorType,
+    ) {
+        if (currentType == newType || isReleased) return
+        desktopExecutor.execute {
+            val layout =
+                displayController.getDisplayLayout(taskInfo.displayId)
+                    ?: error("Expected to find DisplayLayout for taskId${taskInfo.taskId}.")
+            if (currentType == IndicatorType.NO_INDICATOR) {
+                fadeInIndicator(layout, newType)
+            } else if (newType == IndicatorType.NO_INDICATOR) {
+                fadeOutIndicator(layout, currentType, /* finishCallback= */ null)
+            } else {
+                val animStartType = IndicatorType.valueOf(currentType.name)
+                val animator =
+                    indicatorView?.let {
+                        VisualIndicatorAnimator.animateIndicatorType(
+                            it,
+                            layout,
+                            animStartType,
+                            newType,
+                            bubbleBoundsProvider,
+                        )
+                    } ?: return@execute
+                animator.start()
+            }
+        }
+    }
+
+    /**
+     * Fade indicator in as provided type. Animator fades it in while expanding the bounds outwards.
+     */
+    @VisibleForTesting
+    fun fadeInIndicator(layout: DisplayLayout, type: IndicatorType) {
+        desktopExecutor.assertCurrentThread()
+        indicatorView?.let {
+            it.setBackgroundResource(R.drawable.desktop_windowing_transition_background)
+            val animator =
+                VisualIndicatorAnimator.fadeBoundsIn(it, type, layout, bubbleBoundsProvider)
+            animator.start()
+        }
+    }
+
+    /**
+     * Fade out indicator without fully releasing it. Animator fades it out while shrinking bounds.
+     *
+     * @param finishCallback called when animation ends or gets cancelled
+     */
+    fun fadeOutIndicator(
+        layout: DisplayLayout,
+        currentType: IndicatorType,
+        finishCallback: Runnable?,
+    ) {
+        if (currentType == IndicatorType.NO_INDICATOR) {
+            // In rare cases, fade out can be requested before the indicator has determined its
+            // initial type and started animating in. In this case, no animator is needed.
+            finishCallback?.run()
+            return
+        }
+        desktopExecutor.execute {
+            indicatorView?.let {
+                val animStartType = IndicatorType.valueOf(currentType.name)
+                val animator =
+                    VisualIndicatorAnimator.fadeBoundsOut(
+                        it,
+                        animStartType,
+                        layout,
+                        bubbleBoundsProvider,
+                    )
+                animator.addListener(
+                    object : AnimatorListenerAdapter() {
+                        override fun onAnimationEnd(animation: Animator) {
+                            if (finishCallback != null) {
+                                mainExecutor.execute(finishCallback)
+                            }
+                        }
+                    }
+                )
+                animator.start()
+            }
+        }
+    }
+
+    /** Release the indicator and its components when it is no longer needed. */
+    @ShellMainThread
+    fun releaseVisualIndicator() {
+        if (isReleased) return
+        desktopExecutor.execute {
+            indicatorViewHost?.release()
+            indicatorViewHost = null
+        }
+        indicatorLeash?.let {
+            val tx = SurfaceControl.Transaction()
+            tx.remove(it)
+            indicatorLeash = null
+            syncQueue.runInSync { transaction: SurfaceControl.Transaction ->
+                transaction.merge(tx)
+                tx.close()
+            }
+        }
+        isReleased = true
+    }
+
+    /**
+     * Animator for Desktop Mode transitions which supports bounds and alpha animation. Functions
+     * should only be called from the desktop executor.
+     */
+    @VisibleForTesting
+    class VisualIndicatorAnimator(view: View, startBounds: Rect, endBounds: Rect) :
+        ValueAnimator() {
+        /**
+         * Determines how this animator will interact with the view's alpha: Fade in, fade out, or
+         * no change to alpha
+         */
+        private enum class AlphaAnimType {
+            ALPHA_FADE_IN_ANIM,
+            ALPHA_FADE_OUT_ANIM,
+            ALPHA_NO_CHANGE_ANIM,
+        }
+
+        private val indicatorView: View = view
+        @VisibleForTesting val indicatorStartBounds = Rect(startBounds)
+        @VisibleForTesting val indicatorEndBounds = endBounds
+        private val mRectEvaluator: RectEvaluator
+
+        init {
+            setFloatValues(0f, 1f)
+            mRectEvaluator = RectEvaluator(Rect())
+        }
+
+        /**
+         * Update bounds of view based on current animation fraction. Use of delta is to animate
+         * bounds independently, in case we need to run multiple animations simultaneously.
+         *
+         * @param fraction fraction to use, compared against previous fraction
+         * @param view the view to update
+         */
+        @ShellDesktopThread
+        private fun updateBounds(fraction: Float, view: View?) {
+            if (indicatorStartBounds == indicatorEndBounds) {
+                return
+            }
+            val currentBounds =
+                mRectEvaluator.evaluate(fraction, indicatorStartBounds, indicatorEndBounds)
+            view?.background?.bounds = currentBounds
+        }
+
+        /**
+         * Fade in the fullscreen indicator
+         *
+         * @param fraction current animation fraction
+         */
+        @ShellDesktopThread
+        private fun updateIndicatorAlpha(fraction: Float, view: View?) {
+            val drawable = view?.background as LayerDrawable
+            drawable.findDrawableByLayerId(R.id.indicator_stroke).alpha =
+                (MAXIMUM_OPACITY * fraction).toInt()
+            drawable.findDrawableByLayerId(R.id.indicator_solid).alpha =
+                (MAXIMUM_OPACITY * fraction * INDICATOR_FINAL_OPACITY).toInt()
+        }
+
+        companion object {
+            private const val FULLSCREEN_INDICATOR_DURATION = 200
+            private const val FULLSCREEN_SCALE_ADJUSTMENT_PERCENT = 0.015f
+            private const val INDICATOR_FINAL_OPACITY = 0.35f
+            private const val MAXIMUM_OPACITY = 255
+
+            @ShellDesktopThread
+            fun fadeBoundsIn(
+                view: View,
+                type: IndicatorType,
+                displayLayout: DisplayLayout,
+                bubbleBoundsProvider: BubbleDropTargetBoundsProvider?,
+            ): VisualIndicatorAnimator {
+                val endBounds = getIndicatorBounds(displayLayout, type, bubbleBoundsProvider)
+                val startBounds = getMinBounds(endBounds)
+                view.background.bounds = startBounds
+
+                val animator = VisualIndicatorAnimator(view, startBounds, endBounds)
+                animator.interpolator = DecelerateInterpolator()
+                setupIndicatorAnimation(animator, AlphaAnimType.ALPHA_FADE_IN_ANIM)
+                return animator
+            }
+
+            @ShellDesktopThread
+            fun fadeBoundsOut(
+                view: View,
+                type: IndicatorType,
+                displayLayout: DisplayLayout,
+                bubbleBoundsProvider: BubbleDropTargetBoundsProvider?,
+            ): VisualIndicatorAnimator {
+                val startBounds = getIndicatorBounds(displayLayout, type, bubbleBoundsProvider)
+                val endBounds = getMinBounds(startBounds)
+                view.background.bounds = startBounds
+
+                val animator = VisualIndicatorAnimator(view, startBounds, endBounds)
+                animator.interpolator = DecelerateInterpolator()
+                setupIndicatorAnimation(animator, AlphaAnimType.ALPHA_FADE_OUT_ANIM)
+                return animator
+            }
+
+            /**
+             * Create animator for visual indicator changing type (i.e., fullscreen to freeform,
+             * freeform to split, etc.)
+             *
+             * @param view the view for this indicator
+             * @param displayLayout information about the display the transitioning task is
+             *   currently on
+             * @param origType the original indicator type
+             * @param newType the new indicator type
+             * @param desktopExecutor: the executor for the ShellDesktopThread; should be the only
+             *   thread this function runs on
+             */
+            @ShellDesktopThread
+            fun animateIndicatorType(
+                view: View,
+                displayLayout: DisplayLayout,
+                origType: IndicatorType,
+                newType: IndicatorType,
+                bubbleBoundsProvider: BubbleDropTargetBoundsProvider?,
+            ): VisualIndicatorAnimator {
+                val startBounds = getIndicatorBounds(displayLayout, origType, bubbleBoundsProvider)
+                val endBounds = getIndicatorBounds(displayLayout, newType, bubbleBoundsProvider)
+                val animator = VisualIndicatorAnimator(view, startBounds, endBounds)
+                animator.interpolator = DecelerateInterpolator()
+                setupIndicatorAnimation(animator, AlphaAnimType.ALPHA_NO_CHANGE_ANIM)
+                return animator
+            }
+
+            /** Calculates the bounds the indicator should have when fully faded in. */
+            private fun getIndicatorBounds(
+                layout: DisplayLayout,
+                type: IndicatorType,
+                bubbleBoundsProvider: BubbleDropTargetBoundsProvider?,
+            ): Rect {
+                val desktopStableBounds = Rect()
+                layout.getStableBounds(desktopStableBounds)
+                val padding = desktopStableBounds.top
+                when (type) {
+                    IndicatorType.TO_FULLSCREEN_INDICATOR -> {
+                        desktopStableBounds.top += padding
+                        desktopStableBounds.bottom -= padding
+                        desktopStableBounds.left += padding
+                        desktopStableBounds.right -= padding
+                        return desktopStableBounds
+                    }
+
+                    IndicatorType.TO_DESKTOP_INDICATOR -> {
+                        val adjustmentPercentage =
+                            (1f - DesktopTasksController.DESKTOP_MODE_INITIAL_BOUNDS_SCALE)
+                        return Rect(
+                            (adjustmentPercentage * desktopStableBounds.width() / 2).toInt(),
+                            (adjustmentPercentage * desktopStableBounds.height() / 2).toInt(),
+                            (desktopStableBounds.width() -
+                                    (adjustmentPercentage * desktopStableBounds.width() / 2))
+                                .toInt(),
+                            (desktopStableBounds.height() -
+                                    (adjustmentPercentage * desktopStableBounds.height() / 2))
+                                .toInt(),
+                        )
+                    }
+
+                    IndicatorType.TO_SPLIT_LEFT_INDICATOR ->
+                        return Rect(
+                            padding,
+                            padding,
+                            desktopStableBounds.width() / 2 - padding,
+                            desktopStableBounds.height(),
+                        )
+
+                    IndicatorType.TO_SPLIT_RIGHT_INDICATOR ->
+                        return Rect(
+                            desktopStableBounds.width() / 2 + padding,
+                            padding,
+                            desktopStableBounds.width() - padding,
+                            desktopStableBounds.height(),
+                        )
+                    IndicatorType.TO_BUBBLE_LEFT_INDICATOR ->
+                        return bubbleBoundsProvider?.getBubbleBarExpandedViewDropTargetBounds(
+                            /* onLeft= */ true
+                        ) ?: Rect()
+                    IndicatorType.TO_BUBBLE_RIGHT_INDICATOR ->
+                        return bubbleBoundsProvider?.getBubbleBarExpandedViewDropTargetBounds(
+                            /* onLeft= */ false
+                        ) ?: Rect()
+                    else -> throw IllegalArgumentException("Invalid indicator type provided.")
+                }
+            }
+
+            /** Add necessary listener for animation of indicator */
+            private fun setupIndicatorAnimation(
+                animator: VisualIndicatorAnimator,
+                animType: AlphaAnimType,
+            ) {
+                animator.addUpdateListener { a: ValueAnimator ->
+                    animator.updateBounds(a.animatedFraction, animator.indicatorView)
+                    if (animType == AlphaAnimType.ALPHA_FADE_IN_ANIM) {
+                        animator.updateIndicatorAlpha(a.animatedFraction, animator.indicatorView)
+                    } else if (animType == AlphaAnimType.ALPHA_FADE_OUT_ANIM) {
+                        animator.updateIndicatorAlpha(
+                            1 - a.animatedFraction,
+                            animator.indicatorView,
+                        )
+                    }
+                }
+                animator.addListener(
+                    object : AnimatorListenerAdapter() {
+                        override fun onAnimationEnd(animation: Animator) {
+                            animator.indicatorView.background.bounds = animator.indicatorEndBounds
+                        }
+                    }
+                )
+                animator.setDuration(FULLSCREEN_INDICATOR_DURATION.toLong())
+            }
+
+            /**
+             * Return the minimum bounds of a visual indicator, to be used at the end of fading out
+             * and the start of fading in.
+             */
+            private fun getMinBounds(maxBounds: Rect): Rect {
+                return Rect(
+                    (maxBounds.left + (FULLSCREEN_SCALE_ADJUSTMENT_PERCENT * maxBounds.width()))
+                        .toInt(),
+                    (maxBounds.top + (FULLSCREEN_SCALE_ADJUSTMENT_PERCENT * maxBounds.height()))
+                        .toInt(),
+                    (maxBounds.right - (FULLSCREEN_SCALE_ADJUSTMENT_PERCENT * maxBounds.width()))
+                        .toInt(),
+                    (maxBounds.bottom - (FULLSCREEN_SCALE_ADJUSTMENT_PERCENT * maxBounds.height()))
+                        .toInt(),
+                )
+            }
+        }
+    }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/AppHandleEducationController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/AppHandleEducationController.kt
index 5d83556..f664514 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/AppHandleEducationController.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/AppHandleEducationController.kt
@@ -26,6 +26,8 @@
 import com.android.window.flags.Flags
 import com.android.wm.shell.R
 import com.android.wm.shell.desktopmode.CaptionState
+import com.android.wm.shell.desktopmode.DesktopModeUiEventLogger
+import com.android.wm.shell.desktopmode.DesktopModeUiEventLogger.DesktopUiEventEnum
 import com.android.wm.shell.desktopmode.WindowDecorCaptionHandleRepository
 import com.android.wm.shell.desktopmode.education.data.AppHandleEducationDatastoreRepository
 import com.android.wm.shell.shared.annotations.ShellBackgroundThread
@@ -62,6 +64,7 @@
     private val windowingEducationViewController: DesktopWindowingEducationTooltipController,
     @ShellMainThread private val applicationCoroutineScope: CoroutineScope,
     @ShellBackgroundThread private val backgroundDispatcher: MainCoroutineDispatcher,
+    private val desktopModeUiEventLogger: DesktopModeUiEventLogger,
 ) {
     private lateinit var openHandleMenuCallback: (Int) -> Unit
     private lateinit var toDesktopModeCallback: (Int, DesktopModeTransitionSource) -> Unit
@@ -171,6 +174,7 @@
 
     private fun showEducation(captionState: CaptionState) {
         val appHandleBounds = (captionState as CaptionState.AppHandle).globalAppHandleBounds
+        val taskInfo = captionState.runningTaskInfo
         val tooltipGlobalCoordinates =
             Point(appHandleBounds.left + appHandleBounds.width() / 2, appHandleBounds.bottom)
         // Populate information important to inflate app handle education tooltip.
@@ -188,22 +192,34 @@
                 arrowDirection =
                     DesktopWindowingEducationTooltipController.TooltipArrowDirection.UP,
                 onEducationClickAction = {
-                    openHandleMenuCallback(captionState.runningTaskInfo.taskId)
+                    openHandleMenuCallback(taskInfo.taskId)
+                    desktopModeUiEventLogger.log(
+                        taskInfo,
+                        DesktopUiEventEnum.APP_HANDLE_EDUCATION_TOOLTIP_CLICKED,
+                    )
                 },
                 onDismissAction = {
-                    // TODO: b/341320146 - Log previous tooltip was dismissed
+                    desktopModeUiEventLogger.log(
+                        taskInfo,
+                        DesktopUiEventEnum.APP_HANDLE_EDUCATION_TOOLTIP_DISMISSED,
+                    )
                 },
             )
 
         windowingEducationViewController.showEducationTooltip(
             tooltipViewConfig = appHandleTooltipConfig,
-            taskId = captionState.runningTaskInfo.taskId,
+            taskId = taskInfo.taskId,
+        )
+        desktopModeUiEventLogger.log(
+            taskInfo,
+            DesktopUiEventEnum.APP_HANDLE_EDUCATION_TOOLTIP_SHOWN,
         )
     }
 
     /** Show tooltip that points to windowing image button in app handle menu */
     private suspend fun showWindowingImageButtonTooltip(captionState: CaptionState.AppHandle) {
         val appInfoPillHeight = getSize(R.dimen.desktop_mode_handle_menu_app_info_pill_height)
+        val taskInfo = captionState.runningTaskInfo
         val windowingOptionPillHeight =
             getSize(R.dimen.desktop_mode_handle_menu_windowing_pill_height)
         val appHandleMenuWidth =
@@ -245,24 +261,36 @@
                     DesktopWindowingEducationTooltipController.TooltipArrowDirection.HORIZONTAL,
                 onEducationClickAction = {
                     toDesktopModeCallback(
-                        captionState.runningTaskInfo.taskId,
+                        taskInfo.taskId,
                         DesktopModeTransitionSource.APP_HANDLE_MENU_BUTTON,
                     )
+                    desktopModeUiEventLogger.log(
+                        taskInfo,
+                        DesktopUiEventEnum.ENTER_DESKTOP_MODE_EDUCATION_TOOLTIP_CLICKED,
+                    )
                 },
                 onDismissAction = {
-                    // TODO: b/341320146 - Log previous tooltip was dismissed
+                    desktopModeUiEventLogger.log(
+                        taskInfo,
+                        DesktopUiEventEnum.ENTER_DESKTOP_MODE_EDUCATION_TOOLTIP_DISMISSED,
+                    )
                 },
             )
 
         windowingEducationViewController.showEducationTooltip(
-            taskId = captionState.runningTaskInfo.taskId,
+            taskId = taskInfo.taskId,
             tooltipViewConfig = windowingImageButtonTooltipConfig,
         )
+        desktopModeUiEventLogger.log(
+            taskInfo,
+            DesktopUiEventEnum.ENTER_DESKTOP_MODE_EDUCATION_TOOLTIP_SHOWN,
+        )
     }
 
     /** Show tooltip that points to app chip button and educates user on how to exit desktop mode */
     private suspend fun showExitWindowingTooltip(captionState: CaptionState.AppHeader) {
         val globalAppChipBounds = captionState.globalAppChipBounds
+        val taskInfo = captionState.runningTaskInfo
         val tooltipGlobalCoordinates =
             Point(
                 if (isRtl()) {
@@ -287,16 +315,27 @@
                 arrowDirection =
                     DesktopWindowingEducationTooltipController.TooltipArrowDirection.HORIZONTAL,
                 onDismissAction = {
-                    // TODO: b/341320146 - Log previous tooltip was dismissed
+                    desktopModeUiEventLogger.log(
+                        taskInfo,
+                        DesktopUiEventEnum.EXIT_DESKTOP_MODE_EDUCATION_TOOLTIP_DISMISSED,
+                    )
                 },
                 onEducationClickAction = {
-                    openHandleMenuCallback(captionState.runningTaskInfo.taskId)
+                    openHandleMenuCallback(taskInfo.taskId)
+                    desktopModeUiEventLogger.log(
+                        taskInfo,
+                        DesktopUiEventEnum.EXIT_DESKTOP_MODE_EDUCATION_TOOLTIP_CLICKED,
+                    )
                 },
             )
         windowingEducationViewController.showEducationTooltip(
-            taskId = captionState.runningTaskInfo.taskId,
+            taskId = taskInfo.taskId,
             tooltipViewConfig = exitWindowingTooltipConfig,
         )
+        desktopModeUiEventLogger.log(
+            taskInfo,
+            DesktopUiEventEnum.EXIT_DESKTOP_MODE_EDUCATION_TOOLTIP_SHOWN,
+        )
     }
 
     /**
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionHandler.java
index 31715f0..b60fb5e 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionHandler.java
@@ -93,7 +93,8 @@
     }
 
     @Override
-    public IBinder startMinimizedModeTransition(WindowContainerTransaction wct) {
+    public IBinder startMinimizedModeTransition(
+            WindowContainerTransaction wct, int taskId, boolean isLastTask) {
         final int type = Transitions.TRANSIT_MINIMIZE;
         final IBinder token = mTransitions.startTransition(type, wct, this);
         mPendingTransitionTokens.add(token);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionStarter.java b/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionStarter.java
index a874a5b..822934c 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionStarter.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionStarter.java
@@ -38,10 +38,13 @@
      * Starts window minimization transition
      *
      * @param wct the {@link WindowContainerTransaction} that changes the windowing mode
+     * @param taskId the task id of the task being minimized
+     * @param isLastTask true if the task being minimized is the last visible task
      *
      * @return the started transition
      */
-    IBinder startMinimizedModeTransition(WindowContainerTransaction wct);
+    IBinder startMinimizedModeTransition(
+            WindowContainerTransaction wct, int taskId, boolean isLastTask);
 
     /**
      * Starts close window transition
@@ -60,4 +63,4 @@
      * @return the started transition
      */
     IBinder startPipTransition(WindowContainerTransaction wct);
-}
\ No newline at end of file
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/keyguard/KeyguardTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/keyguard/KeyguardTransitionHandler.java
index c0a0f46..d666126 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
@@ -22,7 +22,6 @@
 import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
 import static android.service.dreams.Flags.dismissDreamOnKeyguardDismiss;
 import static android.view.WindowManager.KEYGUARD_VISIBILITY_TRANSIT_FLAGS;
-import static android.view.WindowManager.TRANSIT_FLAG_AOD_APPEARING;
 import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_APPEARING;
 import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY;
 import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_LOCKED;
@@ -201,8 +200,7 @@
                     transition, info, startTransaction, finishTransaction, finishCallback);
         }
 
-        if ((info.getFlags() & TRANSIT_FLAG_KEYGUARD_APPEARING) != 0
-                || (info.getFlags() & TRANSIT_FLAG_AOD_APPEARING) != 0) {
+        if ((info.getFlags() & TRANSIT_FLAG_KEYGUARD_APPEARING) != 0) {
             return startAnimation(mAppearTransition, "appearing",
                     transition, info, startTransaction, finishTransaction, finishCallback);
         }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipAppIconOverlay.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipAppIconOverlay.java
index b4cf890..88ac865 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipAppIconOverlay.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipAppIconOverlay.java
@@ -26,6 +26,7 @@
 import android.graphics.Matrix;
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
+import android.hardware.HardwareBuffer;
 import android.util.TypedValue;
 import android.view.SurfaceControl;
 
@@ -39,7 +40,6 @@
 
     private final Context mContext;
     private final int mAppIconSizePx;
-    private final Rect mAppBounds;
     private final int mOverlayHalfSize;
     private final Matrix mTmpTransform = new Matrix();
     private final float[] mTmpFloat9 = new float[9];
@@ -56,10 +56,6 @@
         final int overlaySize = getOverlaySize(appBounds, destinationBounds);
         mOverlayHalfSize = overlaySize >> 1;
 
-        // When the activity is in the secondary split, make sure the scaling center is not
-        // offset.
-        mAppBounds = new Rect(0, 0, appBounds.width(), appBounds.height());
-
         mBitmap = Bitmap.createBitmap(overlaySize, overlaySize, Bitmap.Config.ARGB_8888);
         prepareAppIconOverlay(appIcon);
         mLeash = new SurfaceControl.Builder()
@@ -85,12 +81,17 @@
 
     @Override
     public void attach(SurfaceControl.Transaction tx, SurfaceControl parentLeash) {
+        final HardwareBuffer buffer = mBitmap.getHardwareBuffer();
         tx.show(mLeash);
         tx.setLayer(mLeash, Integer.MAX_VALUE);
-        tx.setBuffer(mLeash, mBitmap.getHardwareBuffer());
+        tx.setBuffer(mLeash, buffer);
         tx.setAlpha(mLeash, 0f);
         tx.reparent(mLeash, parentLeash);
         tx.apply();
+        // Cleanup the bitmap and buffer after setting up the leash
+        mBitmap.recycle();
+        mBitmap = null;
+        buffer.close();
     }
 
     @Override
@@ -108,16 +109,6 @@
                 .setAlpha(mLeash, fraction < 0.5f ? 0 : (fraction - 0.5f) * 2);
     }
 
-
-
-    @Override
-    public void detach(SurfaceControl.Transaction tx) {
-        super.detach(tx);
-        if (mBitmap != null && !mBitmap.isRecycled()) {
-            mBitmap.recycle();
-        }
-    }
-
     private void prepareAppIconOverlay(Drawable appIcon) {
         final Canvas canvas = new Canvas();
         canvas.setBitmap(mBitmap);
@@ -139,6 +130,8 @@
                 mOverlayHalfSize + mAppIconSizePx / 2);
         appIcon.setBounds(appIconBounds);
         appIcon.draw(canvas);
+        Bitmap oldBitmap = mBitmap;
         mBitmap = mBitmap.copy(Bitmap.Config.HARDWARE, false /* mutable */);
+        oldBitmap.recycle();
     }
 }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipDragToResizeHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipDragToResizeHandler.java
new file mode 100644
index 0000000..bd0b810
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipDragToResizeHandler.java
@@ -0,0 +1,218 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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_BOTTOM;
+import static com.android.internal.policy.TaskResizingAlgorithm.CTRL_LEFT;
+import static com.android.internal.policy.TaskResizingAlgorithm.CTRL_RIGHT;
+import static com.android.internal.policy.TaskResizingAlgorithm.CTRL_TOP;
+import static com.android.wm.shell.pip2.phone.PipMenuView.ANIM_TYPE_NONE;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Point;
+import android.graphics.PointF;
+import android.graphics.Rect;
+import android.graphics.Region;
+import android.view.MotionEvent;
+
+import com.android.internal.policy.TaskResizingAlgorithm;
+import com.android.wm.shell.R;
+import com.android.wm.shell.common.pip.PipBoundsAlgorithm;
+import com.android.wm.shell.common.pip.PipBoundsState;
+
+import java.util.function.Function;
+
+/** Helper for handling drag-corner-to-resize gestures. */
+public class PipDragToResizeHandler {
+    private final Context mContext;
+    private final PipResizeGestureHandler mPipResizeGestureHandler;
+    private final PipBoundsState mPipBoundsState;
+    private final PhonePipMenuController mPhonePipMenuController;
+    private final PipBoundsAlgorithm mPipBoundsAlgorithm;
+    private final PipScheduler mPipScheduler;
+
+    private final Region mTmpRegion = new Region();
+    private final Rect mDragCornerSize = new Rect();
+    private final Rect mTmpTopLeftCorner = new Rect();
+    private final Rect mTmpTopRightCorner = new Rect();
+    private final Rect mTmpBottomLeftCorner = new Rect();
+    private final Rect mTmpBottomRightCorner = new Rect();
+    private final Rect mDisplayBounds = new Rect();
+    private final Function<Rect, Rect> mMovementBoundsSupplier;
+    private int mDelta;
+
+    public PipDragToResizeHandler(Context context, PipResizeGestureHandler pipResizeGestureHandler,
+            PipBoundsState pipBoundsState,
+            PhonePipMenuController phonePipMenuController, PipBoundsAlgorithm pipBoundsAlgorithm,
+            PipScheduler pipScheduler, Function<Rect, Rect> movementBoundsSupplier) {
+        mContext = context;
+        mPipResizeGestureHandler = pipResizeGestureHandler;
+        mPipBoundsState = pipBoundsState;
+        mPhonePipMenuController = phonePipMenuController;
+        mPipBoundsAlgorithm = pipBoundsAlgorithm;
+        mPipScheduler = pipScheduler;
+        mMovementBoundsSupplier = movementBoundsSupplier;
+    }
+
+    /** Invoked by {@link PipResizeGestureHandler#reloadResources}. */
+    void reloadResources() {
+        final Resources res = mContext.getResources();
+        mDelta = res.getDimensionPixelSize(R.dimen.pip_resize_edge_size);
+    }
+
+    /** Invoked by {@link PipResizeGestureHandler#onInputEvent} if drag-corner-to-resize is
+     * enabled. */
+    void onDragCornerResize(MotionEvent ev, Rect lastResizeBounds, PointF downPoint,
+            Rect downBounds, Point minSize, Point maxSize, float touchSlop) {
+        int action = ev.getActionMasked();
+        float x = ev.getX();
+        float y = ev.getY();
+        if (action == MotionEvent.ACTION_DOWN) {
+            lastResizeBounds.setEmpty();
+            final boolean allowGesture = isWithinDragResizeRegion((int) x, (int) y);
+            mPipResizeGestureHandler.setAllowGesture(allowGesture);
+            if (allowGesture) {
+                setCtrlType((int) x, (int) y);
+                downPoint.set(x, y);
+                downBounds.set(mPipBoundsState.getBounds());
+            }
+        } else if (mPipResizeGestureHandler.getAllowGesture()) {
+            switch (action) {
+                case MotionEvent.ACTION_POINTER_DOWN:
+                    // We do not support multi touch for resizing via drag
+                    mPipResizeGestureHandler.setAllowGesture(false);
+                    break;
+                case MotionEvent.ACTION_MOVE:
+                    final boolean thresholdCrossed = mPipResizeGestureHandler.getThresholdCrossed();
+                    // Capture inputs
+                    if (!mPipResizeGestureHandler.getThresholdCrossed()
+                            && Math.hypot(x - downPoint.x, y - downPoint.y) > touchSlop) {
+                        mPipResizeGestureHandler.setThresholdCrossed(true);
+                        // Reset the down to begin resizing from this point
+                        downPoint.set(x, y);
+                        mPipResizeGestureHandler.pilferPointers();
+                    }
+                    if (mPipResizeGestureHandler.getThresholdCrossed()) {
+                        if (mPhonePipMenuController.isMenuVisible()) {
+                            mPhonePipMenuController.hideMenu(ANIM_TYPE_NONE,
+                                    false /* resize */);
+                        }
+                        final Rect currentPipBounds = mPipBoundsState.getBounds();
+                        lastResizeBounds.set(TaskResizingAlgorithm.resizeDrag(x, y,
+                                downPoint.x, downPoint.y, currentPipBounds,
+                                mPipResizeGestureHandler.getCtrlType(), minSize.x,
+                                minSize.y, maxSize, true,
+                                downBounds.width() > downBounds.height()));
+                        mPipBoundsAlgorithm.transformBoundsToAspectRatio(lastResizeBounds,
+                                mPipBoundsState.getAspectRatio(), false /* useCurrentMinEdgeSize */,
+                                true /* useCurrentSize */);
+                        mPipScheduler.scheduleUserResizePip(lastResizeBounds);
+                        mPipBoundsState.setHasUserResizedPip(true);
+                    }
+                    break;
+                case MotionEvent.ACTION_UP:
+                case MotionEvent.ACTION_CANCEL:
+                    mPipResizeGestureHandler.finishResize();
+                    break;
+            }
+        }
+    }
+
+    /**
+     * Check whether the current x,y coordinate is within the region in which drag-resize should
+     * start.
+     * This consists of 4 small squares on the 4 corners of the PIP window, a quarter of which
+     * overlaps with the PIP window while the rest goes outside of the PIP window.
+     * _ _           _ _
+     * |_|_|_________|_|_|
+     * |_|_|         |_|_|
+     * |     PIP     |
+     * |   WINDOW    |
+     * _|_           _|_
+     * |_|_|_________|_|_|
+     * |_|_|         |_|_|
+     */
+    boolean isWithinDragResizeRegion(int x, int y) {
+        final Rect currentPipBounds = mPipBoundsState.getBounds();
+        if (currentPipBounds == null) {
+            return false;
+        }
+        resetDragCorners();
+        mTmpTopLeftCorner.offset(currentPipBounds.left - mDelta / 2,
+                currentPipBounds.top - mDelta / 2);
+        mTmpTopRightCorner.offset(currentPipBounds.right - mDelta / 2,
+                currentPipBounds.top - mDelta / 2);
+        mTmpBottomLeftCorner.offset(currentPipBounds.left - mDelta / 2,
+                currentPipBounds.bottom - mDelta / 2);
+        mTmpBottomRightCorner.offset(currentPipBounds.right - mDelta / 2,
+                currentPipBounds.bottom - mDelta / 2);
+
+        mTmpRegion.setEmpty();
+        mTmpRegion.op(mTmpTopLeftCorner, Region.Op.UNION);
+        mTmpRegion.op(mTmpTopRightCorner, Region.Op.UNION);
+        mTmpRegion.op(mTmpBottomLeftCorner, Region.Op.UNION);
+        mTmpRegion.op(mTmpBottomRightCorner, Region.Op.UNION);
+
+        return mTmpRegion.contains(x, y);
+    }
+
+    private void resetDragCorners() {
+        mDragCornerSize.set(0, 0, mDelta, mDelta);
+        mTmpTopLeftCorner.set(mDragCornerSize);
+        mTmpTopRightCorner.set(mDragCornerSize);
+        mTmpBottomLeftCorner.set(mDragCornerSize);
+        mTmpBottomRightCorner.set(mDragCornerSize);
+    }
+
+    private void setCtrlType(int x, int y) {
+        final Rect currentPipBounds = mPipBoundsState.getBounds();
+        int ctrlType = mPipResizeGestureHandler.getCtrlType();
+
+        Rect movementBounds = mMovementBoundsSupplier.apply(currentPipBounds);
+
+        mDisplayBounds.set(movementBounds.left,
+                movementBounds.top,
+                movementBounds.right + currentPipBounds.width(),
+                movementBounds.bottom + currentPipBounds.height());
+
+        if (mTmpTopLeftCorner.contains(x, y) && currentPipBounds.top != mDisplayBounds.top
+                && currentPipBounds.left != mDisplayBounds.left) {
+            ctrlType |= CTRL_LEFT;
+            ctrlType |= CTRL_TOP;
+        }
+        if (mTmpTopRightCorner.contains(x, y) && currentPipBounds.top != mDisplayBounds.top
+                && currentPipBounds.right != mDisplayBounds.right) {
+            ctrlType |= CTRL_RIGHT;
+            ctrlType |= CTRL_TOP;
+        }
+        if (mTmpBottomRightCorner.contains(x, y)
+                && currentPipBounds.bottom != mDisplayBounds.bottom
+                && currentPipBounds.right != mDisplayBounds.right) {
+            ctrlType |= CTRL_RIGHT;
+            ctrlType |= CTRL_BOTTOM;
+        }
+        if (mTmpBottomLeftCorner.contains(x, y)
+                && currentPipBounds.bottom != mDisplayBounds.bottom
+                && currentPipBounds.left != mDisplayBounds.left) {
+            ctrlType |= CTRL_LEFT;
+            ctrlType |= CTRL_BOTTOM;
+        }
+
+        mPipResizeGestureHandler.setCtrlType(ctrlType);
+    }
+
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipPinchToResizeHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipPinchToResizeHandler.java
new file mode 100644
index 0000000..1e41af3
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipPinchToResizeHandler.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.Point;
+import android.graphics.PointF;
+import android.graphics.Rect;
+import android.view.MotionEvent;
+
+import com.android.wm.shell.common.pip.PipBoundsState;
+import com.android.wm.shell.common.pip.PipPinchResizingAlgorithm;
+
+/** Helper for handling pinch-to-resize gestures. */
+public class PipPinchToResizeHandler {
+    private final PipResizeGestureHandler mPipResizeGestureHandler;
+    private final PipBoundsState mPipBoundsState;
+    private final PhonePipMenuController mPhonePipMenuController;
+    private final PipScheduler mPipScheduler;
+    private final PipPinchResizingAlgorithm mPinchResizingAlgorithm;
+
+    private int mFirstIndex = -1;
+    private int mSecondIndex = -1;
+
+    public PipPinchToResizeHandler(PipResizeGestureHandler pipResizeGestureHandler,
+            PipBoundsState pipBoundsState, PhonePipMenuController phonePipMenuController,
+            PipScheduler pipScheduler) {
+        mPipResizeGestureHandler = pipResizeGestureHandler;
+        mPipBoundsState = pipBoundsState;
+        mPhonePipMenuController = phonePipMenuController;
+        mPipScheduler = pipScheduler;
+
+        mPinchResizingAlgorithm = new PipPinchResizingAlgorithm();
+    }
+
+    /** Invoked by {@link PipResizeGestureHandler#onInputEvent} if pinch-to-resize is enabled. */
+    void onPinchResize(MotionEvent ev, PointF downPoint, PointF downSecondPoint, Rect downBounds,
+            PointF lastPoint, PointF lastSecondPoint, Rect lastResizeBounds, float touchSlop,
+            Point minSize, Point maxSize) {
+        int action = ev.getActionMasked();
+
+        if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
+            mFirstIndex = -1;
+            mSecondIndex = -1;
+            mPipResizeGestureHandler.setAllowGesture(false);
+            mPipResizeGestureHandler.finishResize();
+        }
+
+        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))) {
+                mPipResizeGestureHandler.setAllowGesture(true);
+                mFirstIndex = 0;
+                mSecondIndex = 1;
+                downPoint.set(ev.getRawX(mFirstIndex), ev.getRawY(mFirstIndex));
+                downSecondPoint.set(ev.getRawX(mSecondIndex), ev.getRawY(mSecondIndex));
+                downBounds.set(pipBounds);
+
+                lastPoint.set(downPoint);
+                lastSecondPoint.set(lastSecondPoint);
+                lastResizeBounds.set(downBounds);
+
+                // start the high perf session as the second pointer gets detected
+                mPipResizeGestureHandler.startHighPerfSession();
+            }
+        }
+
+        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);
+            lastPoint.set(x0, y0);
+            lastSecondPoint.set(x1, y1);
+
+            // Capture inputs
+            if (!mPipResizeGestureHandler.getThresholdCrossed()
+                    && (distanceBetween(downSecondPoint, lastSecondPoint) > touchSlop
+                    || distanceBetween(downPoint, lastPoint) > touchSlop)) {
+                mPipResizeGestureHandler.pilferPointers();
+                mPipResizeGestureHandler.setThresholdCrossed(true);
+                // Reset the down to begin resizing from this point
+                downPoint.set(lastPoint);
+                downSecondPoint.set(lastSecondPoint);
+
+                if (mPhonePipMenuController.isMenuVisible()) {
+                    mPhonePipMenuController.hideMenu();
+                }
+            }
+
+            if (mPipResizeGestureHandler.getThresholdCrossed()) {
+                final float angle = mPinchResizingAlgorithm.calculateBoundsAndAngle(downPoint,
+                        downSecondPoint, lastPoint, lastSecondPoint, minSize, maxSize,
+                        downBounds, lastResizeBounds);
+
+                mPipResizeGestureHandler.setAngle(angle);
+                mPipScheduler.scheduleUserResizePip(lastResizeBounds, angle);
+                mPipBoundsState.setHasUserResizedPip(true);
+            }
+        }
+    }
+
+    private float distanceBetween(PointF p1, PointF p2) {
+        return (float) Math.hypot(p2.x - p1.x, p2.y - p1.y);
+    }
+
+}
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
index e4be3f6..b869bf1 100644
--- 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
@@ -44,13 +44,14 @@
 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.PipDesktopState;
 import com.android.wm.shell.common.pip.PipDisplayLayoutState;
 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 com.android.wm.shell.pip2.animation.PipResizeAnimator;
 
 import java.io.PrintWriter;
+import java.util.function.Function;
 
 /**
  * Helper on top of PipTouchHandler that handles inputs OUTSIDE of the PIP window, which is used to
@@ -72,8 +73,8 @@
     private final PipTransitionState mPipTransitionState;
     private final PhonePipMenuController mPhonePipMenuController;
     private final PipDisplayLayoutState mPipDisplayLayoutState;
+    private final PipDesktopState mPipDesktopState;
     private final PipUiEventLogger mPipUiEventLogger;
-    private final PipPinchResizingAlgorithm mPinchResizingAlgorithm;
     private final ShellExecutor mMainExecutor;
 
     private final PointF mDownPoint = new PointF();
@@ -93,16 +94,18 @@
     private boolean mIsAttached;
     private boolean mIsEnabled;
     private boolean mEnablePinchResize;
+    private boolean mEnableDragCornerResize;
     private boolean mIsSysUiStateValid;
     private boolean mThresholdCrossed;
     private boolean mOngoingPinchToResize = false;
     private boolean mWaitingForBoundsChangeTransition = false;
     private float mAngle = 0;
-    int mFirstIndex = -1;
-    int mSecondIndex = -1;
+
 
     private InputMonitor mInputMonitor;
     private InputEventReceiver mInputEventReceiver;
+    private PipDragToResizeHandler mPipDragToResizeHandler;
+    private PipPinchToResizeHandler mPipPinchToResizeHandler;
 
     @Nullable
     private final PipPerfHintController mPipPerfHintController;
@@ -121,7 +124,9 @@
             PipTransitionState pipTransitionState,
             PipUiEventLogger pipUiEventLogger,
             PhonePipMenuController menuActivityController,
+            Function<Rect, Rect> movementBoundsSupplier,
             PipDisplayLayoutState pipDisplayLayoutState,
+            PipDesktopState pipDesktopState,
             ShellExecutor mainExecutor,
             @Nullable PipPerfHintController pipPerfHintController) {
         mContext = context;
@@ -137,8 +142,13 @@
 
         mPhonePipMenuController = menuActivityController;
         mPipDisplayLayoutState = pipDisplayLayoutState;
+        mPipDesktopState = pipDesktopState;
         mPipUiEventLogger = pipUiEventLogger;
-        mPinchResizingAlgorithm = new PipPinchResizingAlgorithm();
+
+        mPipDragToResizeHandler = new PipDragToResizeHandler(context, this, pipBoundsState,
+                menuActivityController, pipBoundsAlgorithm, pipScheduler, movementBoundsSupplier);
+        mPipPinchToResizeHandler = new PipPinchToResizeHandler(this, pipBoundsState,
+                menuActivityController, pipScheduler);
     }
 
     void init() {
@@ -163,6 +173,7 @@
     }
 
     private void reloadResources() {
+        mPipDragToResizeHandler.reloadResources();
         mTouchSlop = ViewConfiguration.get(mContext).getScaledTouchSlop();
     }
 
@@ -180,6 +191,8 @@
     void onActivityPinned() {
         mIsAttached = true;
         updateIsEnabled();
+        // Only enable drag-corner-to-resize if PiP was entered when Desktop Mode session is active.
+        mEnableDragCornerResize = mPipDesktopState.isPipInDesktopMode();
     }
 
     void onActivityUnpinned() {
@@ -211,9 +224,44 @@
         }
     }
 
+    boolean getAllowGesture() {
+        return mAllowGesture;
+    }
+
+    void setAllowGesture(boolean allowGesture) {
+        mAllowGesture = allowGesture;
+    }
+
+    boolean getThresholdCrossed() {
+        return mThresholdCrossed;
+    }
+
+    void setThresholdCrossed(boolean thresholdCrossed) {
+        mThresholdCrossed = thresholdCrossed;
+    }
+
+    int getCtrlType() {
+        return mCtrlType;
+    }
+
+    void setCtrlType(int ctrlType) {
+        mCtrlType = ctrlType;
+    }
+
+    void setAngle(float angle) {
+        mAngle = angle;
+    }
+
+    void startHighPerfSession() {
+        if (mPipPerfHintController != null) {
+            mPipHighPerfSession = mPipPerfHintController.startSession(
+                    this::onHighPerfSessionTimeout, "onPinchResize");
+        }
+    }
+
     @VisibleForTesting
     void onInputEvent(InputEvent ev) {
-        if (!mEnablePinchResize) {
+        if (!mEnableDragCornerResize && !mEnablePinchResize) {
             // No need to handle anything if resizing isn't enabled.
             return;
         }
@@ -240,7 +288,12 @@
             }
 
             if (mOngoingPinchToResize) {
-                onPinchResize(mv);
+                mPipPinchToResizeHandler.onPinchResize(mv, mDownPoint, mDownSecondPoint,
+                        mDownBounds, mLastPoint, mLastSecondPoint, mLastResizeBounds, mTouchSlop,
+                        mMinSize, mMaxSize);
+            } else if (mEnableDragCornerResize) {
+                mPipDragToResizeHandler.onDragCornerResize(mv, mLastResizeBounds, mDownPoint,
+                        mDownBounds, mMinSize, mMaxSize, mTouchSlop);
             }
         }
     }
@@ -261,20 +314,31 @@
     }
 
     boolean willStartResizeGesture(MotionEvent ev) {
-        if (ev.getActionMasked() == MotionEvent.ACTION_POINTER_DOWN) {
-            if (mEnablePinchResize && ev.getPointerCount() == 2) {
-                onPinchResize(ev);
-                mOngoingPinchToResize = mAllowGesture;
-                return mAllowGesture;
-            }
+        switch (ev.getActionMasked()) {
+            case MotionEvent.ACTION_DOWN:
+                if (mEnableDragCornerResize && mPipDragToResizeHandler.isWithinDragResizeRegion(
+                        (int) ev.getRawX(),
+                        (int) ev.getRawY())) {
+                    return true;
+                }
+                break;
+
+            case MotionEvent.ACTION_POINTER_DOWN:
+                if (mEnablePinchResize && ev.getPointerCount() == 2) {
+                    mPipPinchToResizeHandler.onPinchResize(ev, mDownPoint, mDownSecondPoint,
+                            mDownBounds, mLastPoint, mLastSecondPoint, mLastResizeBounds,
+                            mTouchSlop, mMinSize, mMaxSize);
+                    mOngoingPinchToResize = mAllowGesture;
+                    return mAllowGesture;
+                }
+                break;
+
+            default:
+                break;
         }
         return false;
     }
 
-    private boolean isInValidSysUiState() {
-        return mIsSysUiStateValid;
-    }
-
     private void onHighPerfSessionTimeout(PipPerfHintController.PipHighPerfSession session) {}
 
     private void cleanUpHighPerfSessionMaybe() {
@@ -285,83 +349,6 @@
         }
     }
 
-    @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();
-        }
-
-        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);
-
-                mPipScheduler.scheduleUserResizePip(mLastResizeBounds, mAngle);
-                mPipBoundsState.setHasUserResizedPip(true);
-            }
-        }
-    }
-
     private void snapToMovementBoundsEdge(Rect bounds, Rect movementBounds) {
         final int leftEdge = bounds.left;
 
@@ -404,17 +391,21 @@
         // mPipTaskOrganizer.scheduleFinishResizePip(finalBounds, mUpdateResizeBoundsCallback);
     }
 
-    private void finishResize() {
+    /** Handles additional resizing and state changes after gesture resizing is done. */
+    void finishResize() {
         if (mLastResizeBounds.isEmpty()) {
             resetState();
         }
-        if (!mOngoingPinchToResize) {
-            return;
-        }
 
         // Cache initial bounds after release for animation before mLastResizeBounds are modified.
         mStartBoundsAfterRelease.set(mLastResizeBounds);
 
+        // Drag-corner-to-resize - we don't need to adjust the bounds at this point
+        if (!mOngoingPinchToResize) {
+            scheduleBoundsChange();
+            return;
+        }
+
         // 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) {
@@ -438,6 +429,10 @@
                 mLastResizeBounds, movementBounds);
         mPipBoundsAlgorithm.applySnapFraction(mLastResizeBounds, snapFraction);
 
+        scheduleBoundsChange();
+    }
+
+    private void scheduleBoundsChange() {
         // Update the transition state to schedule a resize transition.
         Bundle extra = new Bundle();
         extra.putBoolean(RESIZE_BOUNDS_CHANGE, true);
@@ -489,10 +484,6 @@
         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();
@@ -573,6 +564,7 @@
         pw.println(innerPrefix + "mIsAttached=" + mIsAttached);
         pw.println(innerPrefix + "mIsEnabled=" + mIsEnabled);
         pw.println(innerPrefix + "mEnablePinchResize=" + mEnablePinchResize);
+        pw.println(innerPrefix + "mEnableDragCornerResize=" + mEnableDragCornerResize);
         pw.println(innerPrefix + "mThresholdCrossed=" + mThresholdCrossed);
         pw.println(innerPrefix + "mOhmOffset=" + mOhmOffset);
         pw.println(innerPrefix + "mMinSize=" + mMinSize);
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
index e405f33..72346b3 100644
--- 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
@@ -59,6 +59,7 @@
 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.PipDesktopState;
 import com.android.wm.shell.common.pip.PipDisplayLayoutState;
 import com.android.wm.shell.common.pip.PipDoubleTapHelper;
 import com.android.wm.shell.common.pip.PipPerfHintController;
@@ -187,6 +188,7 @@
             @NonNull PipScheduler pipScheduler,
             @NonNull SizeSpecSource sizeSpecSource,
             @NonNull PipDisplayLayoutState pipDisplayLayoutState,
+            PipDesktopState pipDesktopState,
             DisplayController displayController,
             PipMotionHelper pipMotionHelper,
             FloatingContentCoordinator floatingContentCoordinator,
@@ -226,7 +228,8 @@
                 mainExecutor);
         mPipResizeGestureHandler = new PipResizeGestureHandler(context, pipBoundsAlgorithm,
                 pipBoundsState, mTouchState, mPipScheduler, mPipTransitionState, pipUiEventLogger,
-                menuController, mPipDisplayLayoutState, mainExecutor, mPipPerfHintController);
+                menuController, this::getMovementBounds, mPipDisplayLayoutState, pipDesktopState,
+                mainExecutor, mPipPerfHintController);
         mPipBoundsState.addOnAspectRatioChangedCallback(aspectRatio -> {
             updateMinMaxSize(aspectRatio);
             onAspectRatioChanged();
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 bb9b479..9adaa36 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
@@ -72,7 +72,6 @@
 import com.android.wm.shell.pip2.animation.PipEnterAnimator;
 import com.android.wm.shell.pip2.animation.PipExpandAnimator;
 import com.android.wm.shell.shared.TransitionUtil;
-import com.android.wm.shell.shared.pip.PipContentOverlay;
 import com.android.wm.shell.sysui.ShellInit;
 import com.android.wm.shell.transition.Transitions;
 
@@ -301,6 +300,9 @@
             mPipTransitionState.setState(PipTransitionState.EXITING_PIP);
             return startRemoveAnimation(info, startTransaction, finishTransaction, finishCallback);
         }
+        // For any unhandled transition, make sure the PiP surface is properly updated,
+        // i.e. corner and shadow radius.
+        syncPipSurfaceState(info, startTransaction, finishTransaction);
         return false;
     }
 
@@ -422,7 +424,7 @@
         final Rect destinationBounds = pipChange.getEndAbsBounds();
         final SurfaceControl swipePipToHomeOverlay = mPipTransitionState.getSwipePipToHomeOverlay();
         if (swipePipToHomeOverlay != null) {
-            final int overlaySize = PipContentOverlay.PipAppIconOverlay.getOverlaySize(
+            final int overlaySize = PipAppIconOverlay.getOverlaySize(
                     mPipTransitionState.getSwipePipToHomeAppBounds(), destinationBounds);
             // It is possible we reparent the PIP activity to a new PIP task (in multi-activity
             // apps), so we should also reparent the overlay to the final PIP task.
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/IRecentsAnimationRunner.aidl b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/IRecentsAnimationRunner.aidl
index 8cdb8c4..f8d84e4 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/IRecentsAnimationRunner.aidl
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/IRecentsAnimationRunner.aidl
@@ -59,11 +59,12 @@
     void onAnimationStart(in IRecentsAnimationController controller,
             in RemoteAnimationTarget[] apps, in RemoteAnimationTarget[] wallpapers,
             in Rect homeContentInsets, in Rect minimizedHomeBounds, in Bundle extras,
-            in TransitionInfo info) = 2;
+            in @nullable TransitionInfo info) = 2;
 
     /**
      * Called when the task of an activity that has been started while the recents animation
      * was running becomes ready for control.
      */
-    void onTasksAppeared(in RemoteAnimationTarget[] app) = 3;
+    void onTasksAppeared(in RemoteAnimationTarget[] app,
+            in @nullable TransitionInfo transitionInfo) = 3;
 }
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 7751741..a969845 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
@@ -1214,13 +1214,16 @@
             // Since we're accepting the merge, update the finish transaction so that changes via
             // that transaction will be applied on top of those of the merged transitions
             mFinishTransaction = finishT;
-            // not using the incoming anim-only surfaces
-            info.releaseAnimSurfaces();
+            boolean passTransitionInfo = ENABLE_DESKTOP_RECENTS_TRANSITIONS_CORNERS_BUGFIX.isTrue();
+            if (!passTransitionInfo) {
+                // not using the incoming anim-only surfaces
+                info.releaseAnimSurfaces();
+            }
             if (appearedTargets != null) {
                 try {
                     ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENTS_TRANSITION,
                             "[%d] RecentsController.merge: calling onTasksAppeared", mInstanceId);
-                    mListener.onTasksAppeared(appearedTargets);
+                    mListener.onTasksAppeared(appearedTargets, passTransitionInfo ? info : null);
                 } catch (RemoteException e) {
                     Slog.e(TAG, "Error sending appeared tasks to recents animation", e);
                 }
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 e9f8a4a..ba30d92 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
@@ -638,6 +638,14 @@
     }
 
     /**
+     * Starts an existing task via StageCoordinator.
+     */
+    public void startTask(int taskId, @SplitPosition int position, @Nullable Bundle options,
+            @Nullable WindowContainerToken hideTaskToken, @SplitIndex int index) {
+        mStageCoordinator.startTask(taskId, position, options, hideTaskToken, index);
+    }
+
+    /**
      * See {@link #startShortcut(String, String, int, Bundle, UserHandle)}
      * @param instanceId to be used by {@link SplitscreenEventLogger}
      */
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 15ac03c..a799b7f 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
@@ -2859,14 +2859,6 @@
                     prepareExitSplitScreen(dismissTop, out, EXIT_REASON_APP_FINISHED);
                     mSplitTransitions.setDismissTransition(transition, dismissTop,
                             EXIT_REASON_APP_FINISHED);
-                } else if (isOpening && !mPausingTasks.isEmpty()) {
-                    // One of the splitting task is opening while animating the split pair in
-                    // recents, which means to dismiss the split pair to this task.
-                    int dismissTop = getStageType(stage) == STAGE_TYPE_MAIN
-                            ? STAGE_TYPE_MAIN : STAGE_TYPE_SIDE;
-                    prepareExitSplitScreen(dismissTop, out, EXIT_REASON_APP_FINISHED);
-                    mSplitTransitions.setDismissTransition(transition, dismissTop,
-                            EXIT_REASON_APP_FINISHED);
                 } else if (!isSplitScreenVisible() && isOpening) {
                     // If split is running in the background and the trigger task is appearing into
                     // split, prepare to enter split screen.
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java
index a5a5fd7..01428e6 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java
@@ -149,8 +149,7 @@
 
     private Drawable mEnterpriseThumbnailDrawable;
 
-    static final InteractionJankMonitor sInteractionJankMonitor =
-            InteractionJankMonitor.getInstance();
+    final InteractionJankMonitor mInteractionJankMonitor;
 
     private BroadcastReceiver mEnterpriseResourceUpdatedReceiver = new BroadcastReceiver() {
         @Override
@@ -169,7 +168,8 @@
             @NonNull TransactionPool transactionPool,
             @NonNull ShellExecutor mainExecutor, @NonNull Handler mainHandler,
             @NonNull ShellExecutor animExecutor,
-            @NonNull RootTaskDisplayAreaOrganizer rootTDAOrganizer) {
+            @NonNull RootTaskDisplayAreaOrganizer rootTDAOrganizer,
+            @NonNull InteractionJankMonitor interactionJankMonitor) {
         mDisplayController = displayController;
         mTransactionPool = transactionPool;
         mContext = context;
@@ -181,6 +181,7 @@
         mDevicePolicyManager = mContext.getSystemService(DevicePolicyManager.class);
         shellInit.addInitCallback(this::onInit, this);
         mRootTDAOrganizer = rootTDAOrganizer;
+        mInteractionJankMonitor = interactionJankMonitor;
     }
 
     private void onInit() {
@@ -331,14 +332,14 @@
 
         final boolean isTaskTransition = isTaskTransition(info);
         if (isTaskTransition) {
-            sInteractionJankMonitor.begin(info.getRoot(0).getLeash(), mContext,
+            mInteractionJankMonitor.begin(info.getRoot(0).getLeash(), mContext,
                     mMainHandler, CUJ_DEFAULT_TASK_TO_TASK_ANIMATION);
         }
 
         final Runnable onAnimFinish = () -> {
             if (!animations.isEmpty()) return;
             if (isTaskTransition) {
-                sInteractionJankMonitor.end(CUJ_DEFAULT_TASK_TO_TASK_ANIMATION);
+                mInteractionJankMonitor.end(CUJ_DEFAULT_TASK_TO_TASK_ANIMATION);
             }
             mAnimations.remove(transition);
             finishCallback.onTransitionFinished(null /* wct */);
@@ -1031,6 +1032,6 @@
     @Override
     public void onTransitionConsumed(@NonNull IBinder transition, boolean aborted,
                               @Nullable SurfaceControl.Transaction finishTransaction) {
-        sInteractionJankMonitor.cancel(CUJ_DEFAULT_TASK_TO_TASK_ANIMATION);
+        mInteractionJankMonitor.cancel(CUJ_DEFAULT_TASK_TO_TASK_ANIMATION);
     }
 }
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 c90f6cf..e28a7fa 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
@@ -77,6 +77,7 @@
 
 import com.android.internal.R;
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.jank.InteractionJankMonitor;
 import com.android.internal.protolog.ProtoLog;
 import com.android.wm.shell.RootTaskDisplayAreaOrganizer;
 import com.android.wm.shell.ShellTaskOrganizer;
@@ -196,6 +197,9 @@
     /** Transition type for app compat reachability. */
     public static final int TRANSIT_MOVE_LETTERBOX_REACHABILITY = TRANSIT_FIRST_CUSTOM + 23;
 
+    /** Transition type for converting a task to a bubble. */
+    public static final int TRANSIT_CONVERT_TO_BUBBLE = TRANSIT_FIRST_CUSTOM + 24;
+
     /** Transition type for desktop mode transitions. */
     public static final int TRANSIT_DESKTOP_MODE_TYPES =
             WindowManager.TRANSIT_FIRST_CUSTOM + 100;
@@ -335,7 +339,8 @@
         mDisplayController = displayController;
         mPlayerImpl = new TransitionPlayerImpl();
         mDefaultTransitionHandler = new DefaultTransitionHandler(context, shellInit,
-                displayController, pool, mainExecutor, mainHandler, animExecutor, rootTDAOrganizer);
+                displayController, pool, mainExecutor, mainHandler, animExecutor, rootTDAOrganizer,
+                InteractionJankMonitor.getInstance());
         mRemoteTransitionHandler = new RemoteTransitionHandler(mMainExecutor);
         mShellCommandHandler = shellCommandHandler;
         mShellController = shellController;
@@ -1867,6 +1872,7 @@
             case TRANSIT_MINIMIZE -> "MINIMIZE";
             case TRANSIT_START_RECENTS_TRANSITION -> "START_RECENTS_TRANSITION";
             case TRANSIT_END_RECENTS_TRANSITION -> "END_RECENTS_TRANSITION";
+            case TRANSIT_CONVERT_TO_BUBBLE -> "CONVERT_TO_BUBBLE";
             default -> "";
         };
         if (typeStr.isEmpty()) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecorViewModel.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecorViewModel.java
index 7aa0037..dd5439a 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecorViewModel.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecorViewModel.java
@@ -389,7 +389,9 @@
             } else if (id == R.id.back_button) {
                 mTaskOperations.injectBackKey(mDisplayId);
             } else if (id == R.id.minimize_window) {
-                mTaskOperations.minimizeTask(mTaskToken);
+                // This minimize button uses the same effect for any minimization. The last argument
+                // doesn't matter.
+                mTaskOperations.minimizeTask(mTaskToken, mTaskId, /* isLastTask= */ false);
             } else if (id == R.id.maximize_window) {
                 RunningTaskInfo taskInfo = mTaskOrganizer.getRunningTaskInfo(mTaskId);
                 final DisplayAreaInfo rootDisplayAreaInfo =
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 1cc04b4..add2c54 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
@@ -149,6 +149,8 @@
 import com.android.wm.shell.windowdecor.common.viewhost.WindowDecorViewHostSupplier;
 import com.android.wm.shell.windowdecor.extension.InsetsStateKt;
 import com.android.wm.shell.windowdecor.extension.TaskInfoKt;
+import com.android.wm.shell.windowdecor.tiling.DesktopTilingDecorViewModel;
+import com.android.wm.shell.windowdecor.tiling.SnapEventHandler;
 import com.android.wm.shell.windowdecor.viewholder.AppHeaderViewHolder;
 
 import kotlin.Pair;
@@ -173,7 +175,7 @@
  */
 
 public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel,
-        FocusTransitionListener {
+        FocusTransitionListener, SnapEventHandler {
     private static final String TAG = "DesktopModeWindowDecorViewModel";
 
     private final DesktopModeWindowDecoration.Factory mDesktopModeWindowDecorFactory;
@@ -255,6 +257,7 @@
     private final WindowDecorTaskResourceLoader mTaskResourceLoader;
     private final RecentsTransitionHandler mRecentsTransitionHandler;
     private final DesktopModeCompatPolicy mDesktopModeCompatPolicy;
+    private final DesktopTilingDecorViewModel mDesktopTilingDecorViewModel;
 
     public DesktopModeWindowDecorViewModel(
             Context context,
@@ -292,7 +295,8 @@
             DesktopModeUiEventLogger desktopModeUiEventLogger,
             WindowDecorTaskResourceLoader taskResourceLoader,
             RecentsTransitionHandler recentsTransitionHandler,
-            DesktopModeCompatPolicy desktopModeCompatPolicy) {
+            DesktopModeCompatPolicy desktopModeCompatPolicy,
+            DesktopTilingDecorViewModel desktopTilingDecorViewModel) {
         this(
                 context,
                 shellExecutor,
@@ -335,7 +339,8 @@
                 desktopModeUiEventLogger,
                 taskResourceLoader,
                 recentsTransitionHandler,
-                desktopModeCompatPolicy);
+                desktopModeCompatPolicy,
+                desktopTilingDecorViewModel);
     }
 
     @VisibleForTesting
@@ -381,7 +386,8 @@
             DesktopModeUiEventLogger desktopModeUiEventLogger,
             WindowDecorTaskResourceLoader taskResourceLoader,
             RecentsTransitionHandler recentsTransitionHandler,
-            DesktopModeCompatPolicy desktopModeCompatPolicy) {
+            DesktopModeCompatPolicy desktopModeCompatPolicy,
+            DesktopTilingDecorViewModel desktopTilingDecorViewModel) {
         mContext = context;
         mMainExecutor = shellExecutor;
         mMainHandler = mainHandler;
@@ -452,7 +458,8 @@
         mTaskResourceLoader = taskResourceLoader;
         mRecentsTransitionHandler = recentsTransitionHandler;
         mDesktopModeCompatPolicy = desktopModeCompatPolicy;
-
+        mDesktopTilingDecorViewModel = desktopTilingDecorViewModel;
+        mDesktopTasksController.setSnapEventHandler(this);
         shellInit.addInitCallback(this::onInit, this);
     }
 
@@ -723,8 +730,7 @@
                 decoration.mTaskInfo,
                 left ? SnapPosition.LEFT : SnapPosition.RIGHT,
                 left ? ResizeTrigger.SNAP_LEFT_MENU : ResizeTrigger.SNAP_RIGHT_MENU,
-                inputMethod,
-                decoration);
+                inputMethod);
 
         decoration.closeHandleMenu();
         decoration.closeMaximizeMenu();
@@ -885,6 +891,33 @@
         return snapshotList;
     }
 
+    @Override
+    public boolean snapToHalfScreen(@NonNull RunningTaskInfo taskInfo,
+            @NonNull Rect currentDragBounds, @NonNull SnapPosition position) {
+        return mDesktopTilingDecorViewModel.snapToHalfScreen(taskInfo,
+                mWindowDecorByTaskId.get(taskInfo.taskId), position, currentDragBounds);
+    }
+
+    @Override
+    public void removeTaskIfTiled(int displayId, int taskId) {
+        mDesktopTilingDecorViewModel.removeTaskIfTiled(displayId, taskId);
+    }
+
+    @Override
+    public void onUserChange() {
+        mDesktopTilingDecorViewModel.onUserChange();
+    }
+
+    @Override
+    public void onOverviewAnimationStateChange(boolean running) {
+        mDesktopTilingDecorViewModel.onOverviewAnimationStateChange(running);
+    }
+
+    @Override
+    public boolean moveTaskToFrontIfTiled(@NonNull RunningTaskInfo taskInfo) {
+        return mDesktopTilingDecorViewModel.moveTaskToFrontIfTiled(taskInfo);
+    }
+
     private class DesktopModeTouchEventListener extends GestureDetector.SimpleOnGestureListener
             implements View.OnClickListener, View.OnTouchListener, View.OnLongClickListener,
             View.OnGenericMotionListener, DragDetector.MotionEventHandler {
@@ -1238,8 +1271,7 @@
                             taskInfo, decoration.mTaskSurface,
                             new PointF(e.getRawX(dragPointerIdx), e.getRawY(dragPointerIdx)),
                             newTaskBounds, decoration.calculateValidDragArea(),
-                            new Rect(mOnDragStartInitialBounds), e,
-                            mWindowDecorByTaskId.get(taskInfo.taskId));
+                            new Rect(mOnDragStartInitialBounds), e);
                     if (touchingButton) {
                         // We need the input event to not be consumed here to end the ripple
                         // effect on the touched button. We will reset drag state in the ensuing
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
index b21c3f5..458815d 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleImageButton.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleImageButton.kt
@@ -17,9 +17,12 @@
 package com.android.wm.shell.windowdecor
 
 import android.animation.ValueAnimator
+import android.annotation.DimenRes
+import android.content.res.Resources;
 import android.content.Context
 import android.util.AttributeSet
 import android.widget.ImageButton
+import com.android.wm.shell.R
 
 /**
  * [ImageButton] for the handle at the top of fullscreen apps. Has custom hover
@@ -30,13 +33,23 @@
     ImageButton(context, attrs) {
     private val handleAnimator = ValueAnimator()
 
+    /** Final horizontal padding for hover enter. **/
+    private val HANDLE_HOVER_ENTER_PADDING = loadDimensionPixelSize(
+        R.dimen.desktop_mode_fullscreen_decor_caption_horizontal_padding_hovered)
+    /** Final horizontal padding for press down. **/
+    private val HANDLE_PRESS_DOWN_PADDING = loadDimensionPixelSize(
+        R.dimen.desktop_mode_fullscreen_decor_caption_horizontal_padding_touched)
+    /** Default horizontal padding. **/
+    private val HANDLE_DEFAULT_PADDING = loadDimensionPixelSize(
+        R.dimen.desktop_mode_fullscreen_decor_caption_horizontal_padding_default)
+
     override fun onHoverChanged(hovered: Boolean) {
         super.onHoverChanged(hovered)
         if (hovered) {
-            animateHandle(HANDLE_HOVER_ANIM_DURATION, HANDLE_HOVER_ENTER_SCALE)
+            animateHandle(HANDLE_HOVER_ANIM_DURATION, HANDLE_HOVER_ENTER_PADDING)
         } else {
             if (!isPressed) {
-                animateHandle(HANDLE_HOVER_ANIM_DURATION, HANDLE_DEFAULT_SCALE)
+                animateHandle(HANDLE_HOVER_ANIM_DURATION, HANDLE_DEFAULT_PADDING)
             }
         }
     }
@@ -45,35 +58,37 @@
         if (isPressed != pressed) {
             super.setPressed(pressed)
             if (pressed) {
-                animateHandle(HANDLE_PRESS_ANIM_DURATION, HANDLE_PRESS_DOWN_SCALE)
+                animateHandle(HANDLE_PRESS_ANIM_DURATION, HANDLE_PRESS_DOWN_PADDING)
             } else {
-                animateHandle(HANDLE_PRESS_ANIM_DURATION, HANDLE_DEFAULT_SCALE)
+                animateHandle(HANDLE_PRESS_ANIM_DURATION, HANDLE_DEFAULT_PADDING)
             }
         }
     }
 
-    private fun animateHandle(duration: Long, endScale: Float) {
+    private fun animateHandle(duration: Long, endPadding: Int) {
         if (handleAnimator.isRunning) {
             handleAnimator.cancel()
         }
         handleAnimator.duration = duration
-        handleAnimator.setFloatValues(scaleX, endScale)
+        handleAnimator.setIntValues(paddingLeft, endPadding)
         handleAnimator.addUpdateListener { animator ->
-            scaleX = animator.animatedValue as Float
+            val padding = animator.animatedValue as Int
+            setPadding(padding, paddingTop, padding, paddingBottom)
         }
         handleAnimator.start()
     }
 
+    private fun loadDimensionPixelSize(@DimenRes resourceId: Int): Int {
+        if (resourceId == Resources.ID_NULL) {
+            return 0
+        }
+        return context.resources.getDimensionPixelSize(resourceId)
+    }
+
     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.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenu.kt
index c92e67f..ff50672 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenu.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenu.kt
@@ -35,9 +35,10 @@
 import android.view.View
 import android.view.WindowInsets.Type.systemBars
 import android.view.WindowManager
-import android.widget.Button
 import android.widget.ImageButton
 import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.Space
 import android.widget.TextView
 import android.window.DesktopModeFlags
 import android.window.SurfaceSyncGroup
@@ -482,16 +483,23 @@
         private val splitscreenBtn = windowingPill.requireViewById<ImageButton>(
             R.id.split_screen_button)
         private val floatingBtn = windowingPill.requireViewById<ImageButton>(R.id.floating_button)
+        private val floatingBtnSpace = windowingPill.requireViewById<Space>(
+            R.id.floating_button_space)
+
         private val desktopBtn = windowingPill.requireViewById<ImageButton>(R.id.desktop_button)
+        private val desktopBtnSpace = windowingPill.requireViewById<Space>(
+            R.id.desktop_button_space)
 
         // More Actions Pill.
         private val moreActionsPill = rootView.requireViewById<View>(R.id.more_actions_pill)
-        private val screenshotBtn = moreActionsPill.requireViewById<View>(R.id.screenshot_button)
-        private val newWindowBtn = moreActionsPill.requireViewById<View>(R.id.new_window_button)
+        private val screenshotBtn = moreActionsPill.requireViewById<HandleMenuActionButton>(
+            R.id.screenshot_button)
+        private val newWindowBtn = moreActionsPill.requireViewById<HandleMenuActionButton>(
+            R.id.new_window_button)
         private val manageWindowBtn = moreActionsPill
-            .requireViewById<View>(R.id.manage_windows_button)
+            .requireViewById<HandleMenuActionButton>(R.id.manage_windows_button)
         private val changeAspectRatioBtn = moreActionsPill
-            .requireViewById<View>(R.id.change_aspect_ratio_button)
+            .requireViewById<HandleMenuActionButton>(R.id.change_aspect_ratio_button)
 
         // Open in Browser/App Pill.
         private val openInAppOrBrowserPill = rootView.requireViewById<View>(
@@ -540,17 +548,35 @@
                 return@setOnTouchListener true
             }
 
-            with(context.resources) {
-                // Update a11y read out to say "double tap to enter desktop windowing mode"
+            with(context) {
+                // Update a11y announcement out to say "double tap to enter Fullscreen"
                 ViewCompat.replaceAccessibilityAction(
-                    desktopBtn, ACTION_CLICK,
-                    getString(R.string.app_handle_menu_talkback_desktop_mode_button_text), null
+                    fullscreenBtn, ACTION_CLICK,
+                    getString(
+                        R.string.app_handle_menu_accessibility_announce,
+                        getString(R.string.fullscreen_text)
+                    ),
+                    null,
                 )
 
-                // Update a11y read out to say "double tap to enter split screen mode"
+                // Update a11y announcement out to say "double tap to enter Desktop View"
+                ViewCompat.replaceAccessibilityAction(
+                    desktopBtn, ACTION_CLICK,
+                    getString(
+                        R.string.app_handle_menu_accessibility_announce,
+                        getString(R.string.desktop_text)
+                    ),
+                    null,
+                )
+
+                // Update a11y announcement to say "double tap to enter Split Screen"
                 ViewCompat.replaceAccessibilityAction(
                     splitscreenBtn, ACTION_CLICK,
-                    getString(R.string.app_handle_menu_talkback_split_screen_mode_button_text), null
+                    getString(
+                        R.string.app_handle_menu_accessibility_announce,
+                        getString(R.string.split_screen_text)
+                    ),
+                    null,
                 )
             }
         }
@@ -666,6 +692,7 @@
 
             if (!BubbleAnythingFlagHelper.enableBubbleToFullscreen()) {
                 floatingBtn.visibility = View.GONE
+                floatingBtnSpace.visibility = View.GONE
             }
 
             fullscreenBtn.isSelected = taskInfo.isFullscreen
@@ -694,8 +721,10 @@
             ).forEach {
                 val button = it.first
                 val shouldShow = it.second
-                val label = button.requireViewById<MarqueedTextView>(R.id.label)
-                val image = button.requireViewById<ImageView>(R.id.image)
+
+                val buttonRoot = button.requireViewById<LinearLayout>(R.id.action_button)
+                val label = buttonRoot.requireViewById<MarqueedTextView>(R.id.label)
+                val image = buttonRoot.requireViewById<ImageView>(R.id.image)
 
                 button.isGone = !shouldShow
                 label.apply {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenuActionButton.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenuActionButton.kt
new file mode 100644
index 0000000..4b2e473
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenuActionButton.kt
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.annotation.ColorInt
+import android.annotation.IdRes
+import android.content.Context
+import android.content.res.ColorStateList
+import android.util.AttributeSet
+import android.view.LayoutInflater
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.core.content.withStyledAttributes
+import androidx.core.view.isGone
+import com.android.wm.shell.R
+
+/**
+ * Button-like component used to display the "Additional options" elements of the Handle menu window
+ *  decoration.
+ *
+ * The possible options for which this button is used for are "Screenshot", "New Window", "Manage
+ * Windows" and "Change Aspect Ratio".
+ */
+class HandleMenuActionButton @JvmOverloads constructor(
+    context: Context,
+    attrs: AttributeSet? = null,
+    defStyleAttr: Int = 0
+) : LinearLayout(context, attrs, defStyleAttr) {
+
+    private val rootElement: LinearLayout
+    private val iconView: ImageView
+    private val textView: MarqueedTextView
+
+    init {
+        val view = LayoutInflater.from(context).inflate(
+            R.layout.desktop_mode_window_decor_handle_menu_action_button, this, true)
+        rootElement = findViewById(R.id.action_button)
+        iconView = findViewById(R.id.image)
+        textView = findViewById(R.id.label)
+
+        context.withStyledAttributes(attrs, R.styleable.HandleMenuActionButton) {
+            textView.text = getString(R.styleable.HandleMenuActionButton_android_text)
+            textView.setTextColor(getColor(R.styleable.HandleMenuActionButton_android_textColor, 0))
+            iconView.setImageResource(getResourceId(
+                R.styleable.HandleMenuActionButton_android_src, 0))
+            iconView.imageTintList = getColorStateList(
+                R.styleable.HandleMenuActionButton_android_drawableTint)
+        }
+    }
+
+    /**
+     * Sets a listener to be invoked when this view is clicked.
+     *
+     * @param l the [OnClickListener] that receives click events.
+     */
+    override fun setOnClickListener(l: OnClickListener?) {
+        rootElement.setOnClickListener(l)
+    }
+
+    /**
+     * Sets the text color for the text inside the button.
+     *
+     * @param color the color to set for the text, as a color integer.
+     */
+    fun setTextColor(@ColorInt color: Int) {
+        textView.setTextColor(color)
+    }
+
+    /**
+     * Sets the icon for the button using a resource ID.
+     *
+     * @param resourceId the resource ID of the drawable to set as the icon.
+     */
+    fun setIconResource(@IdRes resourceId: Int) {
+        iconView.setImageResource(resourceId)
+    }
+
+    /**
+     * Sets the text to display inside the button.
+     *
+     * @param text the text to display.
+     */
+    fun setText(text: CharSequence?) {
+        textView.text = text
+    }
+
+    /**
+     * Sets the tint color for the icon.
+     *
+     * @param color the color to use for the tint, as a color integer.
+     */
+    fun setDrawableTint(@ColorInt color: Int) {
+        iconView.imageTintList = ColorStateList.valueOf(color)
+    }
+
+    /**
+     * Gets or sets the tint applied to the icon.
+     *
+     * @return The [ColorStateList] representing the tint, or null if no tint is applied.
+     */
+    var compoundDrawableTintList: ColorStateList?
+        get() = iconView.imageTintList
+        set(value) {
+            iconView.imageTintList = value
+        }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MultiDisplayVeiledResizeTaskPositioner.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MultiDisplayVeiledResizeTaskPositioner.kt
index a9c2e68..bb20292 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MultiDisplayVeiledResizeTaskPositioner.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MultiDisplayVeiledResizeTaskPositioner.kt
@@ -237,8 +237,12 @@
             val startDisplayLayout = displayController.getDisplayLayout(startDisplayId)
             val currentDisplayLayout = displayController.getDisplayLayout(displayId)
 
-            if (startDisplayLayout == null || currentDisplayLayout == null) {
-                // Fall back to single-display drag behavior if any display layout is unavailable.
+            if (startDisplayId == displayId
+                || startDisplayLayout == null || currentDisplayLayout == null) {
+                // Fall back to single-display drag behavior if:
+                // 1. The drag destination display is the same as the start display. This prevents
+                // unnecessary animations caused by minor width/height changes due to DPI scaling.
+                // 2. Either the starting or current display layout is unavailable.
                 DragPositioningCallbackUtility.updateTaskBounds(
                     repositionTaskBounds,
                     taskBoundsAtDragStart,
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/TaskOperations.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/TaskOperations.java
index bc85d2b..45ba441 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/TaskOperations.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/TaskOperations.java
@@ -86,14 +86,18 @@
         return null;
     }
 
-    IBinder minimizeTask(WindowContainerToken taskToken) {
-        return minimizeTask(taskToken, new WindowContainerTransaction());
+    IBinder minimizeTask(WindowContainerToken taskToken, int taskId, boolean isLastTask) {
+        return minimizeTask(taskToken, taskId, isLastTask, new WindowContainerTransaction());
     }
 
-    IBinder minimizeTask(WindowContainerToken taskToken, WindowContainerTransaction wct) {
+    IBinder minimizeTask(
+            WindowContainerToken taskToken,
+            int taskId,
+            boolean isLastTask,
+            WindowContainerTransaction wct) {
         wct.reorder(taskToken, false);
         if (Transitions.ENABLE_SHELL_TRANSITIONS) {
-            return mTransitionStarter.startMinimizedModeTransition(wct);
+            return mTransitionStarter.startMinimizedModeTransition(wct, taskId, isLastTask);
         } else {
             mSyncQueue.queue(wct);
             return null;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java
index 76005c2..25dadfd 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java
@@ -911,7 +911,6 @@
         }
     }
 
-    @VisibleForTesting
     public interface SurfaceControlViewHostFactory {
         default SurfaceControlViewHost create(Context c, Display d, WindowlessWindowManager wmm) {
             return new SurfaceControlViewHost(c, d, wmm, "WindowDecoration");
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/tiling/SnapEventHandler.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/tiling/SnapEventHandler.kt
new file mode 100644
index 0000000..52e24d6
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/tiling/SnapEventHandler.kt
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.tiling
+
+import android.app.ActivityManager.RunningTaskInfo
+import android.graphics.Rect
+import com.android.wm.shell.desktopmode.DesktopTasksController.SnapPosition
+
+/** Interface for handling snap to half screen events. */
+interface SnapEventHandler {
+    /** Snaps an app to half the screen for tiling. */
+    fun snapToHalfScreen(
+        taskInfo: RunningTaskInfo,
+        currentDragBounds: Rect,
+        position: SnapPosition,
+    ): Boolean
+
+    /** Removes a task from tiling if it's tiled, for example on task exiting. */
+    fun removeTaskIfTiled(displayId: Int, taskId: Int)
+
+    /** Notifies the tiling handler of user switch. */
+    fun onUserChange()
+
+    /** Notifies the tiling handler of overview animation state change. */
+    fun onOverviewAnimationStateChange(running: Boolean)
+
+    /** If a task is tiled, delegate moving to front to tiling infrastructure. */
+    fun moveTaskToFrontIfTiled(taskInfo: RunningTaskInfo): Boolean
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHeaderViewHolder.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHeaderViewHolder.kt
index 4762bc2..90c865e 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHeaderViewHolder.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHeaderViewHolder.kt
@@ -93,9 +93,6 @@
     private val lightColors = dynamicLightColorScheme(context)
     private val darkColors = dynamicDarkColorScheme(context)
 
-    private val headerButtonOpenMenuA11yText = context.resources
-        .getString(R.string.desktop_mode_app_header_chip_text)
-
     /**
      * The corner radius to apply to the app chip, maximize and close button's background drawable.
      **/
@@ -231,35 +228,29 @@
             }
         }
 
-        val a11yActionOpenHeaderMenu = AccessibilityAction(AccessibilityNodeInfo.ACTION_CLICK,
-            headerButtonOpenMenuA11yText)
-        openMenuButton.accessibilityDelegate = object : View.AccessibilityDelegate() {
-            override fun onInitializeAccessibilityNodeInfo(
-                host: View,
-                info: AccessibilityNodeInfo
-            ) {
-                super.onInitializeAccessibilityNodeInfo(host, info)
-                info.addAction(a11yActionOpenHeaderMenu)
-            }
-        }
+        // Update a11y announcement to say "double tap to open menu"
+        ViewCompat.replaceAccessibilityAction(
+            openMenuButton,
+            AccessibilityActionCompat.ACTION_CLICK,
+            context.getString(R.string.app_handle_chip_accessibility_announce),
+            null
+        )
 
-        with(context.resources) {
-            // Update a11y read out to say "double tap to maximize or restore window size"
-            ViewCompat.replaceAccessibilityAction(
-                maximizeWindowButton,
-                AccessibilityActionCompat.ACTION_CLICK,
-                getString(R.string.maximize_button_talkback_action_maximize_restore_text),
-                null
-            )
+        // Update a11y announcement to say "double tap to maximize or restore window size"
+        ViewCompat.replaceAccessibilityAction(
+            maximizeWindowButton,
+            AccessibilityActionCompat.ACTION_CLICK,
+            context.getString(R.string.maximize_button_talkback_action_maximize_restore_text),
+            null
+        )
 
-            // Update a11y read out to say "double tap to minimize app window"
-            ViewCompat.replaceAccessibilityAction(
-                minimizeWindowButton,
-                AccessibilityActionCompat.ACTION_CLICK,
-                getString(R.string.minimize_button_talkback_action_maximize_restore_text),
-                null
-            )
-        }
+        // Update a11y announcement out to say "double tap to minimize app window"
+        ViewCompat.replaceAccessibilityAction(
+            minimizeWindowButton,
+            AccessibilityActionCompat.ACTION_CLICK,
+            context.getString(R.string.minimize_button_talkback_action_maximize_restore_text),
+            null
+        )
     }
 
     override fun bindData(data: HeaderData) {
@@ -275,7 +266,8 @@
     /** Sets the app's name in the header. */
     fun setAppName(name: CharSequence) {
         appNameTextView.text = name
-        openMenuButton.contentDescription = name
+        openMenuButton.contentDescription =
+            context.getString(R.string.desktop_mode_app_header_chip_text, name)
     }
 
     /** Sets the app's icon in the header. */
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleTransitionsTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleTransitionsTest.java
index 4198f59..42310ca 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleTransitionsTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleTransitionsTest.java
@@ -17,6 +17,10 @@
 
 import static android.view.WindowManager.TRANSIT_CHANGE;
 
+import static com.android.wm.shell.transition.Transitions.TRANSIT_CONVERT_TO_BUBBLE;
+
+import static com.google.common.truth.Truth.assertThat;
+
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
@@ -31,12 +35,14 @@
 import static org.mockito.Mockito.when;
 
 import android.app.ActivityManager;
+import android.graphics.Rect;
 import android.os.IBinder;
 import android.view.SurfaceControl;
 import android.view.ViewRootImpl;
 import android.window.IWindowContainerToken;
 import android.window.TransitionInfo;
 import android.window.WindowContainerToken;
+import android.window.WindowContainerTransaction;
 
 import androidx.test.filters.SmallTest;
 
@@ -65,6 +71,10 @@
  */
 @SmallTest
 public class BubbleTransitionsTest extends ShellTestCase {
+
+    private static final int FULLSCREEN_TASK_WIDTH = 200;
+    private static final int FULLSCREEN_TASK_HEIGHT = 100;
+
     @Mock
     private BubbleData mBubbleData;
     @Mock
@@ -117,10 +127,7 @@
 
     private ActivityManager.RunningTaskInfo setupBubble() {
         ActivityManager.RunningTaskInfo taskInfo = new ActivityManager.RunningTaskInfo();
-        final IWindowContainerToken itoken = mock(IWindowContainerToken.class);
-        final IBinder asBinder = mock(IBinder.class);
-        when(itoken.asBinder()).thenReturn(asBinder);
-        WindowContainerToken token = new WindowContainerToken(itoken);
+        WindowContainerToken token = createMockToken();
         taskInfo.token = token;
         final TaskView tv = mock(TaskView.class);
         final TaskViewTaskController tvtc = mock(TaskViewTaskController.class);
@@ -131,13 +138,32 @@
         return taskInfo;
     }
 
+    private TransitionInfo setupFullscreenTaskTransition(ActivityManager.RunningTaskInfo taskInfo) {
+        final TransitionInfo info = new TransitionInfo(TRANSIT_CONVERT_TO_BUBBLE, 0);
+        final TransitionInfo.Change chg = new TransitionInfo.Change(taskInfo.token,
+                mock(SurfaceControl.class));
+        chg.setTaskInfo(taskInfo);
+        chg.setMode(TRANSIT_CHANGE);
+        chg.setStartAbsBounds(new Rect(0, 0, FULLSCREEN_TASK_WIDTH, FULLSCREEN_TASK_HEIGHT));
+        info.addChange(chg);
+        info.addRoot(new TransitionInfo.Root(0, mock(SurfaceControl.class), 0, 0));
+        return info;
+    }
+
+    private WindowContainerToken createMockToken() {
+        final IWindowContainerToken itoken = mock(IWindowContainerToken.class);
+        final IBinder asBinder = mock(IBinder.class);
+        when(itoken.asBinder()).thenReturn(asBinder);
+        return new WindowContainerToken(itoken);
+    }
+
     @Test
     public void testConvertToBubble() {
         // Basic walk-through of convert-to-bubble transition stages
         ActivityManager.RunningTaskInfo taskInfo = setupBubble();
         final BubbleTransitions.BubbleTransition bt = mBubbleTransitions.startConvertToBubble(
                 mBubble, taskInfo, mExpandedViewManager, mTaskViewFactory, mBubblePositioner,
-                mStackView, mLayerView, mIconFactory, false);
+                mStackView, mLayerView, mIconFactory, null, false);
         final BubbleTransitions.ConvertToBubble ctb = (BubbleTransitions.ConvertToBubble) bt;
         ctb.onInflated(mBubble);
         when(mLayerView.canExpandView(any())).thenReturn(true);
@@ -146,13 +172,7 @@
         // Ensure we are communicating with the taskviewtransitions queue
         assertTrue(mTaskViewTransitions.hasPending());
 
-        final TransitionInfo info = new TransitionInfo(TRANSIT_CHANGE, 0);
-        final TransitionInfo.Change chg = new TransitionInfo.Change(taskInfo.token,
-                mock(SurfaceControl.class));
-        chg.setTaskInfo(taskInfo);
-        chg.setMode(TRANSIT_CHANGE);
-        info.addChange(chg);
-        info.addRoot(new TransitionInfo.Root(0, mock(SurfaceControl.class), 0, 0));
+        final TransitionInfo info = setupFullscreenTaskTransition(taskInfo);
         SurfaceControl.Transaction startT = mock(SurfaceControl.Transaction.class);
         SurfaceControl.Transaction finishT = mock(SurfaceControl.Transaction.class);
         final boolean[] finishCalled = new boolean[]{false};
@@ -163,22 +183,69 @@
         ctb.startAnimation(ctb.mTransition, info, startT, finishT, finishCb);
         assertFalse(mTaskViewTransitions.hasPending());
 
+        verify(startT).setPosition(any(), eq(0f), eq(0f));
+
         verify(mBubbleData).notificationEntryUpdated(eq(mBubble), anyBoolean(), anyBoolean());
-        ctb.continueExpand();
 
         clearInvocations(mBubble);
         verify(mBubble, never()).setPreparingTransition(any());
 
         ctb.surfaceCreated();
-        verify(mBubble).setPreparingTransition(isNull());
+        // Check that preparing transition is not reset before continueExpand is called
+        verify(mBubble, never()).setPreparingTransition(any());
         ArgumentCaptor<Runnable> animCb = ArgumentCaptor.forClass(Runnable.class);
         verify(mLayerView).animateConvert(any(), any(), any(), any(), animCb.capture());
+
+        // continueExpand is now called, check that preparing transition is cleared
+        ctb.continueExpand();
+        verify(mBubble).setPreparingTransition(isNull());
+
         assertFalse(finishCalled[0]);
         animCb.getValue().run();
         assertTrue(finishCalled[0]);
     }
 
     @Test
+    public void testConvertToBubble_drag() {
+        ActivityManager.RunningTaskInfo taskInfo = setupBubble();
+
+        Rect draggedTaskBounds = new Rect(10, 20, 30, 40);
+        WindowContainerTransaction pendingWct = new WindowContainerTransaction();
+        WindowContainerToken pendingDragOpToken = createMockToken();
+        pendingWct.reorder(pendingDragOpToken, /* onTop= */ false);
+
+        BubbleTransitions.DragData dragData = new BubbleTransitions.DragData(
+                draggedTaskBounds, pendingWct, /* releasedOnLeft= */ false
+        );
+
+        final BubbleTransitions.BubbleTransition bt = mBubbleTransitions.startConvertToBubble(
+                mBubble, taskInfo, mExpandedViewManager, mTaskViewFactory, mBubblePositioner,
+                mStackView, mLayerView, mIconFactory, dragData, false);
+        final BubbleTransitions.ConvertToBubble ctb = (BubbleTransitions.ConvertToBubble) bt;
+
+        ArgumentCaptor<WindowContainerTransaction> wctCaptor = ArgumentCaptor.forClass(
+                WindowContainerTransaction.class);
+        ctb.onInflated(mBubble);
+        verify(mTransitions).startTransition(anyInt(), wctCaptor.capture(), eq(ctb));
+
+        // Verify that the WCT has the pending operation from drag data
+        WindowContainerTransaction transitionWct = wctCaptor.getValue();
+        assertThat(transitionWct.getHierarchyOps().stream().anyMatch(op -> op.getType()
+                == WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_REORDER
+                && op.getContainer() == pendingDragOpToken.asBinder())).isTrue();
+
+        final TransitionInfo info = setupFullscreenTaskTransition(taskInfo);
+        SurfaceControl.Transaction startT = mock(SurfaceControl.Transaction.class);
+        SurfaceControl.Transaction finishT = mock(SurfaceControl.Transaction.class);
+        Transitions.TransitionFinishCallback finishCb = wct -> {};
+        ctb.startAnimation(ctb.mTransition, info, startT, finishT, finishCb);
+
+        // Verify that dragged task bounds are used for the position
+        verify(startT).setPosition(any(), eq((float) draggedTaskBounds.left),
+                eq((float) draggedTaskBounds.top));
+    }
+
+    @Test
     public void testConvertFromBubble() {
         ActivityManager.RunningTaskInfo taskInfo = setupBubble();
         final BubbleTransitions.BubbleTransition bt = mBubbleTransitions.startConvertFromBubble(
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandlerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandlerTest.kt
index 0b41952..77cd1e5 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandlerTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandlerTest.kt
@@ -58,6 +58,7 @@
 import org.junit.Before
 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
@@ -128,12 +129,21 @@
     @Test
     fun startMinimizedModeTransition_callsFreeformTaskTransitionHandler() {
         val wct = WindowContainerTransaction()
-        whenever(freeformTaskTransitionHandler.startMinimizedModeTransition(any()))
+        val taskId = 1
+        val isLastTask = false
+        whenever(
+                freeformTaskTransitionHandler.startMinimizedModeTransition(
+                    any(),
+                    anyInt(),
+                    anyBoolean(),
+                )
+            )
             .thenReturn(mock())
 
-        mixedHandler.startMinimizedModeTransition(wct)
+        mixedHandler.startMinimizedModeTransition(wct, taskId, isLastTask)
 
-        verify(freeformTaskTransitionHandler).startMinimizedModeTransition(wct)
+        verify(freeformTaskTransitionHandler)
+            .startMinimizedModeTransition(eq(wct), eq(taskId), eq(isLastTask))
     }
 
     @Test
@@ -531,6 +541,131 @@
     }
 
     @Test
+    @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_EXIT_BY_MINIMIZE_TRANSITION_BUGFIX)
+    fun startMinimizedModeTransition_exitByMinimizeTransitionFlagsDisabled_doesNotUseMixedHandler() {
+        val wct = WindowContainerTransaction()
+        val task = createTask(WINDOWING_MODE_FREEFORM)
+        whenever(
+                freeformTaskTransitionHandler.startMinimizedModeTransition(
+                    any(),
+                    anyInt(),
+                    anyBoolean(),
+                )
+            )
+            .thenReturn(mock())
+
+        mixedHandler.startMinimizedModeTransition(
+            wct = wct,
+            taskId = task.taskId,
+            isLastTask = true,
+        )
+
+        verify(freeformTaskTransitionHandler)
+            .startMinimizedModeTransition(eq(wct), eq(task.taskId), eq(true))
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_EXIT_BY_MINIMIZE_TRANSITION_BUGFIX)
+    fun startMinimizedModeTransition_exitByMinimizeTransitionFlagsEnabled_notLastTask_callsMinimizationHandler() {
+        val wct = WindowContainerTransaction()
+        val minimizingTask = createTask(WINDOWING_MODE_FREEFORM)
+        val minimizingTaskChange = createChange(minimizingTask)
+        val transition = Binder()
+        whenever(
+                transitions.startTransition(eq(Transitions.TRANSIT_MINIMIZE), eq(wct), anyOrNull())
+            )
+            .thenReturn(transition)
+        whenever(
+                desktopMinimizationTransitionHandler.startAnimation(
+                    any(),
+                    any(),
+                    any(),
+                    any(),
+                    any(),
+                )
+            )
+            .thenReturn(true)
+
+        mixedHandler.startMinimizedModeTransition(
+            wct = wct,
+            taskId = minimizingTask.taskId,
+            isLastTask = false,
+        )
+        val started =
+            mixedHandler.startAnimation(
+                transition = transition,
+                info =
+                    createCloseTransitionInfo(
+                        Transitions.TRANSIT_MINIMIZE,
+                        listOf(minimizingTaskChange),
+                    ),
+                startTransaction = mock(),
+                finishTransaction = mock(),
+                finishCallback = {},
+            )
+
+        assertTrue("Should delegate animation to minimization transition handler", started)
+        verify(desktopMinimizationTransitionHandler)
+            .startAnimation(
+                eq(transition),
+                argThat { info -> info.changes.contains(minimizingTaskChange) },
+                any(),
+                any(),
+                any(),
+            )
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_EXIT_BY_MINIMIZE_TRANSITION_BUGFIX)
+    fun startMinimizedModeTransition_exitByMinimizeTransitionFlagsEnabled_withMinimizingLastTask_dispatchesTransition() {
+        val wct = WindowContainerTransaction()
+        val minimizingTask = createTask(WINDOWING_MODE_FREEFORM)
+        val minimizingTaskChange = createChange(minimizingTask)
+        val transition = Binder()
+        whenever(
+                transitions.startTransition(eq(Transitions.TRANSIT_MINIMIZE), eq(wct), anyOrNull())
+            )
+            .thenReturn(transition)
+        whenever(
+                desktopMinimizationTransitionHandler.startAnimation(
+                    any(),
+                    any(),
+                    any(),
+                    any(),
+                    any(),
+                )
+            )
+            .thenReturn(true)
+
+        mixedHandler.startMinimizedModeTransition(
+            wct = wct,
+            taskId = minimizingTask.taskId,
+            isLastTask = true,
+        )
+        mixedHandler.startAnimation(
+            transition = transition,
+            info =
+                createCloseTransitionInfo(
+                    Transitions.TRANSIT_MINIMIZE,
+                    listOf(minimizingTaskChange),
+                ),
+            startTransaction = mock(),
+            finishTransaction = mock(),
+            finishCallback = {},
+        )
+
+        verify(transitions)
+            .dispatchTransition(
+                eq(transition),
+                argThat { info -> info.changes.contains(minimizingTaskChange) },
+                any(),
+                any(),
+                any(),
+                eq(mixedHandler),
+            )
+    }
+
+    @Test
     @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_APP_LAUNCH_TRANSITIONS_BUGFIX)
     fun addPendingAndAnimateLaunchTransition_noMinimizeChange_doesNotReparentMinimizeChange() {
         val wct = WindowContainerTransaction()
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeVisualIndicatorTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeVisualIndicatorTest.kt
index 8f45cf4d..20d50aa 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeVisualIndicatorTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeVisualIndicatorTest.kt
@@ -23,6 +23,7 @@
 import android.platform.test.annotations.EnableFlags
 import android.testing.AndroidTestingRunner
 import android.testing.TestableLooper.RunWithLooper
+import android.view.Display
 import android.view.SurfaceControl
 import androidx.test.filters.SmallTest
 import com.android.internal.policy.SystemBarUtils
@@ -30,6 +31,7 @@
 import com.android.wm.shell.R
 import com.android.wm.shell.RootTaskDisplayAreaOrganizer
 import com.android.wm.shell.ShellTestCase
+import com.android.wm.shell.TestShellExecutor
 import com.android.wm.shell.common.DisplayController
 import com.android.wm.shell.common.DisplayLayout
 import com.android.wm.shell.common.SyncTransactionQueue
@@ -60,18 +62,22 @@
     private lateinit var taskInfo: RunningTaskInfo
     @Mock private lateinit var syncQueue: SyncTransactionQueue
     @Mock private lateinit var displayController: DisplayController
+    @Mock private lateinit var display: Display
     @Mock private lateinit var taskSurface: SurfaceControl
     @Mock private lateinit var taskDisplayAreaOrganizer: RootTaskDisplayAreaOrganizer
     @Mock private lateinit var displayLayout: DisplayLayout
     @Mock private lateinit var bubbleBoundsProvider: BubbleDropTargetBoundsProvider
 
     private lateinit var visualIndicator: DesktopModeVisualIndicator
+    private val desktopExecutor = TestShellExecutor()
+    private val mainExecutor = TestShellExecutor()
 
     @Before
     fun setUp() {
         whenever(displayLayout.width()).thenReturn(DISPLAY_BOUNDS.width())
         whenever(displayLayout.height()).thenReturn(DISPLAY_BOUNDS.height())
         whenever(displayLayout.stableInsets()).thenReturn(STABLE_INSETS)
+        whenever(displayController.getDisplay(anyInt())).thenReturn(display)
         whenever(displayController.getDisplayLayout(anyInt())).thenReturn(displayLayout)
         whenever(displayController.getDisplay(anyInt())).thenReturn(mContext.display)
         whenever(bubbleBoundsProvider.getBubbleBarExpandedViewDropTargetBounds(any()))
@@ -305,7 +311,11 @@
         whenever(bubbleBoundsProvider.getBubbleBarExpandedViewDropTargetBounds(/* onLeft= */ true))
             .thenReturn(dropTargetBounds)
         createVisualIndicator(DesktopModeVisualIndicator.DragStartState.FROM_FULLSCREEN)
+        desktopExecutor.flushAll()
+        mainExecutor.flushAll()
         visualIndicator.updateIndicatorType(PointF(100f, 1500f))
+        desktopExecutor.flushAll()
+        mainExecutor.flushAll()
 
         animatorTestRule.advanceTimeBy(200)
 
@@ -322,7 +332,11 @@
         whenever(bubbleBoundsProvider.getBubbleBarExpandedViewDropTargetBounds(/* onLeft= */ false))
             .thenReturn(dropTargetBounds)
         createVisualIndicator(DesktopModeVisualIndicator.DragStartState.FROM_FULLSCREEN)
+        desktopExecutor.flushAll()
+        mainExecutor.flushAll()
         visualIndicator.updateIndicatorType(PointF(2300f, 1500f))
+        desktopExecutor.flushAll()
+        mainExecutor.flushAll()
 
         animatorTestRule.advanceTimeBy(200)
 
@@ -332,6 +346,8 @@
     private fun createVisualIndicator(dragStartState: DesktopModeVisualIndicator.DragStartState) {
         visualIndicator =
             DesktopModeVisualIndicator(
+                desktopExecutor,
+                mainExecutor,
                 syncQueue,
                 taskInfo,
                 displayController,
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 718bf32..08a4bb2 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
@@ -29,6 +29,7 @@
 import android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW
 import android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED
 import android.content.ComponentName
+import android.content.Context
 import android.content.Intent
 import android.content.pm.ActivityInfo
 import android.content.pm.ActivityInfo.CONFIG_DENSITY
@@ -51,6 +52,8 @@
 import android.platform.test.annotations.DisableFlags
 import android.platform.test.annotations.EnableFlags
 import android.platform.test.flag.junit.FlagsParameterization
+import android.testing.TestableContext
+import android.view.Display
 import android.view.Display.DEFAULT_DISPLAY
 import android.view.DragEvent
 import android.view.Gravity
@@ -147,8 +150,8 @@
 import com.android.wm.shell.transition.Transitions
 import com.android.wm.shell.transition.Transitions.ENABLE_SHELL_TRANSITIONS
 import com.android.wm.shell.transition.Transitions.TransitionHandler
-import com.android.wm.shell.windowdecor.DesktopModeWindowDecoration
-import com.android.wm.shell.windowdecor.tiling.DesktopTilingDecorViewModel
+import com.android.wm.shell.windowdecor.DesktopModeWindowDecorViewModelTestsBase.Companion.HOME_LAUNCHER_PACKAGE_NAME
+import com.android.wm.shell.windowdecor.tiling.SnapEventHandler
 import com.google.common.truth.Truth.assertThat
 import com.google.common.truth.Truth.assertWithMessage
 import java.util.Optional
@@ -175,6 +178,7 @@
 import org.mockito.ArgumentMatchers.isNull
 import org.mockito.Mock
 import org.mockito.Mockito
+import org.mockito.Mockito.anyBoolean
 import org.mockito.Mockito.anyInt
 import org.mockito.Mockito.clearInvocations
 import org.mockito.Mockito.mock
@@ -186,7 +190,6 @@
 import org.mockito.kotlin.argThat
 import org.mockito.kotlin.argumentCaptor
 import org.mockito.kotlin.atLeastOnce
-import org.mockito.kotlin.capture
 import org.mockito.kotlin.eq
 import org.mockito.kotlin.whenever
 import org.mockito.quality.Strictness
@@ -209,6 +212,7 @@
     @Mock lateinit var shellController: ShellController
     @Mock lateinit var displayController: DisplayController
     @Mock lateinit var displayLayout: DisplayLayout
+    @Mock lateinit var display: Display
     @Mock lateinit var shellTaskOrganizer: ShellTaskOrganizer
     @Mock lateinit var syncQueue: SyncTransactionQueue
     @Mock lateinit var rootTaskDisplayAreaOrganizer: RootTaskDisplayAreaOrganizer
@@ -229,6 +233,7 @@
     @Mock lateinit var multiInstanceHelper: MultiInstanceHelper
     @Mock lateinit var desktopModeVisualIndicator: DesktopModeVisualIndicator
     @Mock lateinit var recentTasksController: RecentTasksController
+    @Mock lateinit var snapEventHandler: SnapEventHandler
     @Mock private lateinit var mockInteractionJankMonitor: InteractionJankMonitor
     @Mock private lateinit var mockSurface: SurfaceControl
     @Mock private lateinit var taskbarDesktopTaskListener: TaskbarDesktopTaskListener
@@ -241,9 +246,7 @@
     @Mock lateinit var repositoryInitializer: DesktopRepositoryInitializer
     @Mock private lateinit var mockToast: Toast
     private lateinit var mockitoSession: StaticMockitoSession
-    @Mock private lateinit var desktopTilingDecorViewModel: DesktopTilingDecorViewModel
     @Mock private lateinit var bubbleController: BubbleController
-    @Mock private lateinit var desktopWindowDecoration: DesktopModeWindowDecoration
     @Mock private lateinit var resources: Resources
     @Mock
     lateinit var desktopModeEnterExitTransitionListener: DesktopModeEntryExitTransitionListener
@@ -256,6 +259,8 @@
     @Mock private lateinit var desksOrganizer: DesksOrganizer
     @Mock private lateinit var userProfileContexts: UserProfileContexts
     @Mock private lateinit var desksTransitionsObserver: DesksTransitionObserver
+    @Mock private lateinit var packageManager: PackageManager
+    @Mock private lateinit var mockDisplayContext: Context
 
     private lateinit var controller: DesktopTasksController
     private lateinit var shellInit: ShellInit
@@ -265,8 +270,10 @@
     private lateinit var recentsTransitionStateListener: RecentsTransitionStateListener
     private lateinit var testScope: CoroutineScope
     private lateinit var desktopModeCompatPolicy: DesktopModeCompatPolicy
+    private lateinit var spyContext: TestableContext
 
     private val shellExecutor = TestShellExecutor()
+    private val bgExecutor = TestShellExecutor()
 
     // Mock running tasks are registered here so we can get the list from mock shell task organizer
     private val runningTasks = mutableListOf<RunningTaskInfo>()
@@ -281,6 +288,7 @@
     private val UNRESIZABLE_LANDSCAPE_BOUNDS = Rect(25, 449, 1575, 1611)
     private val UNRESIZABLE_PORTRAIT_BOUNDS = Rect(830, 75, 1730, 1275)
     private val wallpaperToken = MockToken().token()
+    private val homeComponentName = ComponentName(HOME_LAUNCHER_PACKAGE_NAME, /* class */ "")
 
     @Before
     fun setUp() {
@@ -294,6 +302,7 @@
         doReturn(true).`when` { DesktopModeStatus.canEnterDesktopMode(any()) }
 
         testScope = CoroutineScope(Dispatchers.Unconfined + SupervisorJob())
+        spyContext = spy(mContext)
         shellInit = spy(ShellInit(testExecutor))
         userRepositories =
             DesktopUserRepositories(
@@ -315,12 +324,14 @@
                 mContext,
                 mockHandler,
             )
-        desktopModeCompatPolicy = spy(DesktopModeCompatPolicy(context))
+        desktopModeCompatPolicy = spy(DesktopModeCompatPolicy(spyContext))
 
         whenever(shellTaskOrganizer.getRunningTasks(anyInt())).thenAnswer { runningTasks }
         whenever(transitions.startTransition(anyInt(), any(), isNull())).thenAnswer { Binder() }
         whenever(enterDesktopTransitionHandler.moveToDesktop(any(), any())).thenAnswer { Binder() }
         whenever(displayController.getDisplayLayout(anyInt())).thenReturn(displayLayout)
+        whenever(displayController.getDisplayContext(anyInt())).thenReturn(mockDisplayContext)
+        whenever(displayController.getDisplay(anyInt())).thenReturn(display)
         whenever(displayLayout.getStableBounds(any())).thenAnswer { i ->
             (i.arguments.first() as Rect).set(STABLE_BOUNDS)
         }
@@ -367,12 +378,16 @@
         recentsTransitionStateListener = captor.firstValue
 
         controller.taskbarDesktopTaskListener = taskbarDesktopTaskListener
+        controller.setSnapEventHandler(snapEventHandler)
 
         assumeTrue(ENABLE_SHELL_TRANSITIONS)
 
         taskRepository = userRepositories.current
         taskRepository.addDesk(displayId = DEFAULT_DISPLAY, deskId = DEFAULT_DISPLAY)
         taskRepository.setActiveDesk(displayId = DEFAULT_DISPLAY, deskId = DEFAULT_DISPLAY)
+
+        spyContext.setMockPackageManager(packageManager)
+        whenever(packageManager.getHomeActivities(ArrayList())).thenReturn(homeComponentName)
     }
 
     private fun createController() =
@@ -400,13 +415,13 @@
             recentsTransitionHandler,
             multiInstanceHelper,
             shellExecutor,
+            bgExecutor,
             Optional.of(desktopTasksLimiter),
             recentTasksController,
             mockInteractionJankMonitor,
             mockHandler,
             desktopModeEventLogger,
             desktopModeUiEventLogger,
-            desktopTilingDecorViewModel,
             desktopWallpaperActivityTokenProvider,
             Optional.of(bubbleController),
             overviewToDesktopTransitionObserver,
@@ -2747,13 +2762,20 @@
     fun onDesktopWindowMinimize_noActiveTask_doesntRemoveWallpaper() {
         val task = setUpFreeformTask(active = false)
         val transition = Binder()
-        whenever(freeformTaskTransitionStarter.startMinimizedModeTransition(any()))
+        whenever(
+                freeformTaskTransitionStarter.startMinimizedModeTransition(
+                    any(),
+                    anyInt(),
+                    anyBoolean(),
+                )
+            )
             .thenReturn(transition)
 
         controller.minimizeTask(task, MinimizeReason.MINIMIZE_BUTTON)
 
         val captor = argumentCaptor<WindowContainerTransaction>()
-        verify(freeformTaskTransitionStarter).startMinimizedModeTransition(captor.capture())
+        verify(freeformTaskTransitionStarter)
+            .startMinimizedModeTransition(captor.capture(), eq(task.taskId), eq(false))
         captor.firstValue.hierarchyOps.none { hop ->
             hop.type == HIERARCHY_OP_TYPE_REMOVE_TASK && hop.container == wallpaperToken.asBinder()
         }
@@ -2769,18 +2791,26 @@
         controller.minimizeTask(task, MinimizeReason.MINIMIZE_BUTTON)
 
         verify(freeformTaskTransitionStarter).startPipTransition(any())
-        verify(freeformTaskTransitionStarter, never()).startMinimizedModeTransition(any())
+        verify(freeformTaskTransitionStarter, never())
+            .startMinimizedModeTransition(any(), anyInt(), anyBoolean())
     }
 
     @Test
     fun onPipTaskMinimize_autoEnterDisabled_startMinimizeTransition() {
         val task = setUpPipTask(autoEnterEnabled = false)
-        whenever(freeformTaskTransitionStarter.startMinimizedModeTransition(any()))
+        whenever(
+                freeformTaskTransitionStarter.startMinimizedModeTransition(
+                    any(),
+                    anyInt(),
+                    anyBoolean(),
+                )
+            )
             .thenReturn(Binder())
 
         controller.minimizeTask(task, MinimizeReason.MINIMIZE_BUTTON)
 
-        verify(freeformTaskTransitionStarter).startMinimizedModeTransition(any())
+        verify(freeformTaskTransitionStarter)
+            .startMinimizedModeTransition(any(), eq(task.taskId), anyBoolean())
         verify(freeformTaskTransitionStarter, never()).startPipTransition(any())
     }
 
@@ -2804,13 +2834,20 @@
     fun onDesktopWindowMinimize_singleActiveTask_noWallpaperActivityToken_doesntRemoveWallpaper() {
         val task = setUpFreeformTask(active = true)
         val transition = Binder()
-        whenever(freeformTaskTransitionStarter.startMinimizedModeTransition(any()))
+        whenever(
+                freeformTaskTransitionStarter.startMinimizedModeTransition(
+                    any(),
+                    anyInt(),
+                    anyBoolean(),
+                )
+            )
             .thenReturn(transition)
 
         controller.minimizeTask(task, MinimizeReason.MINIMIZE_BUTTON)
 
         val captor = argumentCaptor<WindowContainerTransaction>()
-        verify(freeformTaskTransitionStarter).startMinimizedModeTransition(captor.capture())
+        verify(freeformTaskTransitionStarter)
+            .startMinimizedModeTransition(captor.capture(), eq(task.taskId), eq(true))
         captor.firstValue.hierarchyOps.none { hop -> hop.type == HIERARCHY_OP_TYPE_REMOVE_TASK }
     }
 
@@ -2819,14 +2856,21 @@
     fun onTaskMinimize_singleActiveTask_hasWallpaperActivityToken_removesWallpaper() {
         val task = setUpFreeformTask()
         val transition = Binder()
-        whenever(freeformTaskTransitionStarter.startMinimizedModeTransition(any()))
+        whenever(
+                freeformTaskTransitionStarter.startMinimizedModeTransition(
+                    any(),
+                    anyInt(),
+                    anyBoolean(),
+                )
+            )
             .thenReturn(transition)
 
         // The only active task is being minimized.
         controller.minimizeTask(task, MinimizeReason.MINIMIZE_BUTTON)
 
         val captor = argumentCaptor<WindowContainerTransaction>()
-        verify(freeformTaskTransitionStarter).startMinimizedModeTransition(captor.capture())
+        verify(freeformTaskTransitionStarter)
+            .startMinimizedModeTransition(captor.capture(), eq(task.taskId), eq(true))
         // Adds remove wallpaper operation
         captor.firstValue.assertReorderAt(index = 0, wallpaperToken, toTop = false)
     }
@@ -2835,7 +2879,13 @@
     fun onDesktopWindowMinimize_singleActiveTask_alreadyMinimized_doesntRemoveWallpaper() {
         val task = setUpFreeformTask()
         val transition = Binder()
-        whenever(freeformTaskTransitionStarter.startMinimizedModeTransition(any()))
+        whenever(
+                freeformTaskTransitionStarter.startMinimizedModeTransition(
+                    any(),
+                    anyInt(),
+                    anyBoolean(),
+                )
+            )
             .thenReturn(transition)
         taskRepository.minimizeTask(DEFAULT_DISPLAY, task.taskId)
 
@@ -2843,7 +2893,8 @@
         controller.minimizeTask(task, MinimizeReason.MINIMIZE_BUTTON)
 
         val captor = argumentCaptor<WindowContainerTransaction>()
-        verify(freeformTaskTransitionStarter).startMinimizedModeTransition(captor.capture())
+        verify(freeformTaskTransitionStarter)
+            .startMinimizedModeTransition(captor.capture(), eq(task.taskId), eq(false))
         captor.firstValue.hierarchyOps.none { hop ->
             hop.type == HIERARCHY_OP_TYPE_REMOVE_TASK && hop.container == wallpaperToken.asBinder()
         }
@@ -2854,13 +2905,20 @@
         val task1 = setUpFreeformTask(active = true)
         setUpFreeformTask(active = true)
         val transition = Binder()
-        whenever(freeformTaskTransitionStarter.startMinimizedModeTransition(any()))
+        whenever(
+                freeformTaskTransitionStarter.startMinimizedModeTransition(
+                    any(),
+                    anyInt(),
+                    anyBoolean(),
+                )
+            )
             .thenReturn(transition)
 
         controller.minimizeTask(task1, MinimizeReason.MINIMIZE_BUTTON)
 
         val captor = argumentCaptor<WindowContainerTransaction>()
-        verify(freeformTaskTransitionStarter).startMinimizedModeTransition(captor.capture())
+        verify(freeformTaskTransitionStarter)
+            .startMinimizedModeTransition(captor.capture(), eq(task1.taskId), eq(false))
         captor.firstValue.hierarchyOps.none { hop ->
             hop.type == HIERARCHY_OP_TYPE_REMOVE_TASK && hop.container == wallpaperToken.asBinder()
         }
@@ -2872,7 +2930,13 @@
         val task1 = setUpFreeformTask(active = true)
         val task2 = setUpFreeformTask(active = true)
         val transition = Binder()
-        whenever(freeformTaskTransitionStarter.startMinimizedModeTransition(any()))
+        whenever(
+                freeformTaskTransitionStarter.startMinimizedModeTransition(
+                    any(),
+                    anyInt(),
+                    anyBoolean(),
+                )
+            )
             .thenReturn(transition)
         taskRepository.minimizeTask(DEFAULT_DISPLAY, task2.taskId)
 
@@ -2880,7 +2944,8 @@
         controller.minimizeTask(task1, MinimizeReason.MINIMIZE_BUTTON)
         // Adds remove wallpaper operation
         val captor = argumentCaptor<WindowContainerTransaction>()
-        verify(freeformTaskTransitionStarter).startMinimizedModeTransition(captor.capture())
+        verify(freeformTaskTransitionStarter)
+            .startMinimizedModeTransition(captor.capture(), eq(task1.taskId), eq(true))
         // Adds remove wallpaper operation
         captor.firstValue.assertReorderAt(index = 0, wallpaperToken, toTop = false)
     }
@@ -2889,7 +2954,13 @@
     fun onDesktopWindowMinimize_triesToExitImmersive() {
         val task = setUpFreeformTask()
         val transition = Binder()
-        whenever(freeformTaskTransitionStarter.startMinimizedModeTransition(any()))
+        whenever(
+                freeformTaskTransitionStarter.startMinimizedModeTransition(
+                    any(),
+                    anyInt(),
+                    anyBoolean(),
+                )
+            )
             .thenReturn(transition)
 
         controller.minimizeTask(task, MinimizeReason.MINIMIZE_BUTTON)
@@ -2902,7 +2973,13 @@
         val task = setUpFreeformTask()
         val transition = Binder()
         val runOnTransit = RunOnStartTransitionCallback()
-        whenever(freeformTaskTransitionStarter.startMinimizedModeTransition(any()))
+        whenever(
+                freeformTaskTransitionStarter.startMinimizedModeTransition(
+                    any(),
+                    anyInt(),
+                    anyBoolean(),
+                )
+            )
             .thenReturn(transition)
         whenever(mMockDesktopImmersiveController.exitImmersiveIfApplicable(any(), eq(task), any()))
             .thenReturn(
@@ -4404,7 +4481,6 @@
             validDragArea = Rect(0, 50, 2000, 2000),
             dragStartBounds = Rect(),
             motionEvent,
-            desktopWindowDecoration,
         )
         val rectAfterEnd = Rect(100, 50, 500, 1150)
         verify(transitions)
@@ -4442,7 +4518,6 @@
             validDragArea = Rect(0, 50, 2000, 2000),
             dragStartBounds = Rect(),
             motionEvent,
-            desktopWindowDecoration,
         )
 
         verify(transitions)
@@ -4482,7 +4557,6 @@
             validDragArea = Rect(0, 50, 2000, 2000),
             dragStartBounds = Rect(),
             motionEvent,
-            desktopWindowDecoration,
         )
 
         verify(transitions)
@@ -4523,7 +4597,6 @@
             validDragArea = Rect(0, 50, 2000, 2000),
             dragStartBounds = Rect(),
             motionEvent,
-            desktopWindowDecoration,
         )
 
         // Assert the task exits desktop mode
@@ -4561,7 +4634,6 @@
             validDragArea = Rect(0, 50, 2000, 2000),
             dragStartBounds = Rect(),
             motionEvent,
-            desktopWindowDecoration,
         )
 
         // Assert bounds set to stable bounds
@@ -4617,7 +4689,6 @@
             validDragArea = Rect(0, 50, 2000, 2000),
             dragStartBounds = Rect(),
             motionEvent,
-            desktopWindowDecoration,
         )
 
         // Assert that task is NOT updated via WCT
@@ -4849,7 +4920,7 @@
         val optionsCaptor = argumentCaptor<Bundle>()
         runOpenInstance(task, taskToRequest.taskId)
         verify(splitScreenController)
-            .startTask(anyInt(), anyInt(), optionsCaptor.capture(), anyOrNull())
+            .startTask(anyInt(), anyInt(), optionsCaptor.capture(), anyOrNull(), any())
         assertThat(ActivityOptions.fromBundle(optionsCaptor.firstValue).launchWindowingMode)
             .isEqualTo(WINDOWING_MODE_MULTI_WINDOW)
     }
@@ -4863,7 +4934,7 @@
         val optionsCaptor = argumentCaptor<Bundle>()
         runOpenInstance(task, taskToRequest.taskId)
         verify(splitScreenController)
-            .startTask(anyInt(), anyInt(), optionsCaptor.capture(), anyOrNull())
+            .startTask(anyInt(), anyInt(), optionsCaptor.capture(), anyOrNull(), any())
         assertThat(ActivityOptions.fromBundle(optionsCaptor.firstValue).launchWindowingMode)
             .isEqualTo(WINDOWING_MODE_MULTI_WINDOW)
     }
@@ -5037,7 +5108,6 @@
             SnapPosition.LEFT,
             ResizeTrigger.SNAP_LEFT_MENU,
             InputMethod.TOUCH,
-            desktopWindowDecoration,
         )
         // Assert bounds set to stable bounds
         val wct = getLatestToggleResizeDesktopTaskWct(currentDragBounds)
@@ -5083,7 +5153,6 @@
             SnapPosition.LEFT,
             ResizeTrigger.SNAP_LEFT_MENU,
             InputMethod.TOUCH,
-            desktopWindowDecoration,
         )
         // Assert that task is NOT updated via WCT
         verify(toggleResizeDesktopTaskTransitionHandler, never()).startTransition(any(), any())
@@ -5127,7 +5196,6 @@
             currentDragBounds,
             preDragBounds,
             motionEvent,
-            desktopWindowDecoration,
         )
         val wct = getLatestToggleResizeDesktopTaskWct(currentDragBounds)
         assertThat(findBoundsChange(wct, task)).isEqualTo(expectedBounds)
@@ -5157,7 +5225,6 @@
             currentDragBounds,
             preDragBounds,
             motionEvent,
-            desktopWindowDecoration,
         )
         verify(mReturnToDragStartAnimator)
             .start(
@@ -5182,7 +5249,6 @@
             SnapPosition.LEFT,
             ResizeTrigger.SNAP_LEFT_MENU,
             InputMethod.MOUSE,
-            desktopWindowDecoration,
         )
 
         // Assert that task is NOT updated via WCT
@@ -5209,7 +5275,6 @@
             SnapPosition.LEFT,
             ResizeTrigger.SNAP_LEFT_MENU,
             InputMethod.MOUSE,
-            desktopWindowDecoration,
         )
 
         // Assert bounds set to half of the stable bounds
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 1732875..85f6cd3 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
@@ -25,6 +25,8 @@
 import com.android.wm.shell.RootTaskDisplayAreaOrganizer
 import com.android.wm.shell.ShellTestCase
 import com.android.wm.shell.TestRunningTaskInfoBuilder
+import com.android.wm.shell.bubbles.BubbleController
+import com.android.wm.shell.bubbles.BubbleTransitions
 import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_DESKTOP_MODE_CANCEL_DRAG_TO_DESKTOP
 import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_DESKTOP_MODE_END_DRAG_TO_DESKTOP
 import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_DESKTOP_MODE_START_DRAG_TO_DESKTOP
@@ -34,6 +36,7 @@
 import com.android.wm.shell.splitscreen.SplitScreenController
 import com.android.wm.shell.transition.Transitions
 import com.android.wm.shell.windowdecor.MoveToDesktopAnimator
+import java.util.Optional
 import java.util.function.Supplier
 import junit.framework.Assert.assertEquals
 import junit.framework.Assert.assertFalse
@@ -48,6 +51,7 @@
 import org.mockito.ArgumentMatchers.eq
 import org.mockito.Mock
 import org.mockito.MockitoSession
+import org.mockito.kotlin.argThat
 import org.mockito.kotlin.mock
 import org.mockito.kotlin.never
 import org.mockito.kotlin.times
@@ -71,6 +75,7 @@
     @Mock private lateinit var draggedTaskLeash: SurfaceControl
     @Mock private lateinit var homeTaskLeash: SurfaceControl
     @Mock private lateinit var desktopUserRepositories: DesktopUserRepositories
+    @Mock private lateinit var bubbleController: BubbleController
 
     private val transactionSupplier = Supplier { mock<SurfaceControl.Transaction>() }
 
@@ -87,6 +92,7 @@
                     taskDisplayAreaOrganizer,
                     desktopUserRepositories,
                     mockInteractionJankMonitor,
+                    Optional.of(bubbleController),
                     transactionSupplier,
                 )
                 .apply { setSplitScreenController(splitScreenController) }
@@ -97,6 +103,7 @@
                     taskDisplayAreaOrganizer,
                     desktopUserRepositories,
                     mockInteractionJankMonitor,
+                    Optional.of(bubbleController),
                     transactionSupplier,
                 )
                 .apply { setSplitScreenController(splitScreenController) }
@@ -169,6 +176,32 @@
     }
 
     @Test
+    fun startDragToDesktop_cancelledBeforeReady_verifyBubbleLeftCancel() {
+        performEarlyCancel(
+            defaultHandler,
+            DragToDesktopTransitionHandler.CancelState.CANCEL_BUBBLE_LEFT,
+        )
+        verify(bubbleController)
+            .expandStackAndSelectBubble(
+                any<RunningTaskInfo>(),
+                argThat<BubbleTransitions.DragData> { isReleasedOnLeft },
+            )
+    }
+
+    @Test
+    fun startDragToDesktop_cancelledBeforeReady_verifyBubbleRightCancel() {
+        performEarlyCancel(
+            defaultHandler,
+            DragToDesktopTransitionHandler.CancelState.CANCEL_BUBBLE_RIGHT,
+        )
+        verify(bubbleController)
+            .expandStackAndSelectBubble(
+                any<RunningTaskInfo>(),
+                argThat<BubbleTransitions.DragData> { !isReleasedOnLeft },
+            )
+    }
+
+    @Test
     fun startDragToDesktop_aborted_finishDropped() {
         val task = createTask()
         // Simulate transition is started.
@@ -343,6 +376,40 @@
     }
 
     @Test
+    fun cancelDragToDesktop_bubbleLeftCancelType_bubbleRequested() {
+        startDrag(defaultHandler)
+
+        // Then user cancelled it, requesting bubble.
+        defaultHandler.cancelDragToDesktopTransition(
+            DragToDesktopTransitionHandler.CancelState.CANCEL_BUBBLE_LEFT
+        )
+
+        // Verify the request went through bubble controller.
+        verify(bubbleController)
+            .expandStackAndSelectBubble(
+                any<RunningTaskInfo>(),
+                argThat<BubbleTransitions.DragData> { isReleasedOnLeft },
+            )
+    }
+
+    @Test
+    fun cancelDragToDesktop_bubbleRightCancelType_bubbleRequested() {
+        startDrag(defaultHandler)
+
+        // Then user cancelled it, requesting bubble.
+        defaultHandler.cancelDragToDesktopTransition(
+            DragToDesktopTransitionHandler.CancelState.CANCEL_BUBBLE_RIGHT
+        )
+
+        // Verify the request went through bubble controller.
+        verify(bubbleController)
+            .expandStackAndSelectBubble(
+                any<RunningTaskInfo>(),
+                argThat<BubbleTransitions.DragData> { !isReleasedOnLeft },
+            )
+    }
+
+    @Test
     fun cancelDragToDesktop_startWasNotReady_animateCancel() {
         val task = createTask()
         // Simulate transition is started and is ready to animate.
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/VisualIndicatorViewContainerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/VisualIndicatorViewContainerTest.kt
new file mode 100644
index 0000000..79b0f1c
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/VisualIndicatorViewContainerTest.kt
@@ -0,0 +1,250 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.desktopmode
+
+import android.app.ActivityManager
+import android.app.ActivityManager.RunningTaskInfo
+import android.graphics.Rect
+import android.graphics.drawable.Drawable
+import android.graphics.drawable.LayerDrawable
+import android.platform.test.annotations.EnableFlags
+import android.testing.AndroidTestingRunner
+import android.testing.TestableLooper.RunWithLooper
+import android.view.Display
+import android.view.SurfaceControl
+import android.view.SurfaceControlViewHost
+import android.view.View
+import androidx.test.filters.SmallTest
+import com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE
+import com.android.wm.shell.ShellTestCase
+import com.android.wm.shell.TestRunningTaskInfoBuilder
+import com.android.wm.shell.TestShellExecutor
+import com.android.wm.shell.common.DisplayController
+import com.android.wm.shell.common.DisplayLayout
+import com.android.wm.shell.common.SyncTransactionQueue
+import com.android.wm.shell.shared.bubbles.BubbleDropTargetBoundsProvider
+import com.android.wm.shell.windowdecor.WindowDecoration.SurfaceControlViewHostFactory
+import com.google.common.truth.Truth.assertThat
+import kotlin.test.Test
+import org.junit.Before
+import org.junit.runner.RunWith
+import org.mockito.ArgumentMatchers.anyInt
+import org.mockito.Mock
+import org.mockito.Mockito.mock
+import org.mockito.kotlin.any
+import org.mockito.kotlin.anyOrNull
+import org.mockito.kotlin.eq
+import org.mockito.kotlin.spy
+import org.mockito.kotlin.verify
+import org.mockito.kotlin.verifyZeroInteractions
+import org.mockito.kotlin.whenever
+
+/**
+ * Test class for [VisualIndicatorViewContainer] and [VisualIndicatorAnimator]
+ *
+ * Usage: atest WMShellUnitTests:VisualIndicatorViewContainerTest
+ */
+@SmallTest
+@RunWithLooper
+@RunWith(AndroidTestingRunner::class)
+@EnableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_MODE)
+class VisualIndicatorViewContainerTest : ShellTestCase() {
+    @Mock private lateinit var view: View
+    @Mock private lateinit var displayLayout: DisplayLayout
+    @Mock private lateinit var displayController: DisplayController
+    @Mock private lateinit var taskSurface: SurfaceControl
+    @Mock private lateinit var syncQueue: SyncTransactionQueue
+    @Mock private lateinit var mockSurfaceControlViewHostFactory: SurfaceControlViewHostFactory
+    @Mock private lateinit var mockBackground: LayerDrawable
+    @Mock private lateinit var bubbleDropTargetBoundsProvider: BubbleDropTargetBoundsProvider
+    private val taskInfo: RunningTaskInfo = createTaskInfo()
+    private val mainExecutor = TestShellExecutor()
+    private val desktopExecutor = TestShellExecutor()
+
+    @Before
+    fun setUp() {
+        whenever(displayController.getDisplayLayout(anyInt())).thenReturn(displayLayout)
+        whenever(displayLayout.getStableBounds(any())).thenAnswer { i ->
+            (i.arguments.first() as Rect).set(DISPLAY_BOUNDS)
+        }
+        whenever(mockSurfaceControlViewHostFactory.create(any(), any(), any()))
+            .thenReturn(mock(SurfaceControlViewHost::class.java))
+    }
+
+    @Test
+    fun testTransitionIndicator_sameTypeReturnsEarly() {
+        val spyViewContainer = setupSpyViewContainer()
+        // Test early return on startType == endType.
+        spyViewContainer.transitionIndicator(
+            taskInfo,
+            displayController,
+            DesktopModeVisualIndicator.IndicatorType.TO_FULLSCREEN_INDICATOR,
+            DesktopModeVisualIndicator.IndicatorType.TO_FULLSCREEN_INDICATOR,
+        )
+        desktopExecutor.flushAll()
+        verify(spyViewContainer)
+            .transitionIndicator(
+                eq(taskInfo),
+                eq(displayController),
+                eq(DesktopModeVisualIndicator.IndicatorType.TO_FULLSCREEN_INDICATOR),
+                eq(DesktopModeVisualIndicator.IndicatorType.TO_FULLSCREEN_INDICATOR),
+            )
+        // Assert fadeIn, fadeOut, and animateIndicatorType were not called.
+        verifyZeroInteractions(spyViewContainer)
+    }
+
+    @Test
+    fun testTransitionIndicator_firstTypeNoIndicator_callsFadeIn() {
+        val spyViewContainer = setupSpyViewContainer()
+        spyViewContainer.transitionIndicator(
+            taskInfo,
+            displayController,
+            DesktopModeVisualIndicator.IndicatorType.NO_INDICATOR,
+            DesktopModeVisualIndicator.IndicatorType.TO_FULLSCREEN_INDICATOR,
+        )
+        desktopExecutor.flushAll()
+        verify(spyViewContainer).fadeInIndicator(any(), any())
+    }
+
+    @Test
+    fun testTransitionIndicator_secondTypeNoIndicator_callsFadeOut() {
+        val spyViewContainer = setupSpyViewContainer()
+        spyViewContainer.transitionIndicator(
+            taskInfo,
+            displayController,
+            DesktopModeVisualIndicator.IndicatorType.TO_FULLSCREEN_INDICATOR,
+            DesktopModeVisualIndicator.IndicatorType.NO_INDICATOR,
+        )
+        desktopExecutor.flushAll()
+        verify(spyViewContainer)
+            .fadeOutIndicator(
+                any(),
+                eq(DesktopModeVisualIndicator.IndicatorType.TO_FULLSCREEN_INDICATOR),
+                anyOrNull(),
+            )
+    }
+
+    @Test
+    fun testTransitionIndicator_differentTypes_callsTransitionIndicator() {
+        val spyViewContainer = setupSpyViewContainer()
+        spyViewContainer.transitionIndicator(
+            taskInfo,
+            displayController,
+            DesktopModeVisualIndicator.IndicatorType.TO_FULLSCREEN_INDICATOR,
+            DesktopModeVisualIndicator.IndicatorType.TO_SPLIT_LEFT_INDICATOR,
+        )
+        desktopExecutor.flushAll()
+        verify(spyViewContainer)
+            .transitionIndicator(
+                any(),
+                any(),
+                eq(DesktopModeVisualIndicator.IndicatorType.TO_FULLSCREEN_INDICATOR),
+                eq(DesktopModeVisualIndicator.IndicatorType.TO_SPLIT_LEFT_INDICATOR),
+            )
+    }
+
+    @Test
+    fun testFadeInBoundsCalculation() {
+        val spyIndicator = setupSpyViewContainer()
+        val animator =
+            spyIndicator.indicatorView?.let {
+                VisualIndicatorViewContainer.VisualIndicatorAnimator.fadeBoundsIn(
+                    it,
+                    DesktopModeVisualIndicator.IndicatorType.TO_FULLSCREEN_INDICATOR,
+                    displayLayout,
+                    bubbleDropTargetBoundsProvider,
+                )
+            }
+        assertThat(animator?.indicatorStartBounds).isEqualTo(Rect(15, 15, 985, 985))
+        assertThat(animator?.indicatorEndBounds).isEqualTo(Rect(0, 0, 1000, 1000))
+    }
+
+    @Test
+    fun testFadeOutBoundsCalculation() {
+        val spyIndicator = setupSpyViewContainer()
+        val animator =
+            spyIndicator.indicatorView?.let {
+                VisualIndicatorViewContainer.VisualIndicatorAnimator.fadeBoundsOut(
+                    it,
+                    DesktopModeVisualIndicator.IndicatorType.TO_FULLSCREEN_INDICATOR,
+                    displayLayout,
+                    bubbleDropTargetBoundsProvider,
+                )
+            }
+        assertThat(animator?.indicatorStartBounds).isEqualTo(Rect(0, 0, 1000, 1000))
+        assertThat(animator?.indicatorEndBounds).isEqualTo(Rect(15, 15, 985, 985))
+    }
+
+    @Test
+    fun testChangeIndicatorTypeBoundsCalculation() {
+        // Test fullscreen to split-left bounds.
+        var animator =
+            VisualIndicatorViewContainer.VisualIndicatorAnimator.animateIndicatorType(
+                view,
+                displayLayout,
+                DesktopModeVisualIndicator.IndicatorType.TO_FULLSCREEN_INDICATOR,
+                DesktopModeVisualIndicator.IndicatorType.TO_SPLIT_LEFT_INDICATOR,
+                bubbleDropTargetBoundsProvider,
+            )
+        // Test desktop to split-right bounds.
+        animator =
+            VisualIndicatorViewContainer.VisualIndicatorAnimator.animateIndicatorType(
+                view,
+                displayLayout,
+                DesktopModeVisualIndicator.IndicatorType.TO_DESKTOP_INDICATOR,
+                DesktopModeVisualIndicator.IndicatorType.TO_SPLIT_RIGHT_INDICATOR,
+                bubbleDropTargetBoundsProvider,
+            )
+    }
+
+    private fun setupSpyViewContainer(): VisualIndicatorViewContainer {
+        val viewContainer =
+            VisualIndicatorViewContainer(
+                desktopExecutor,
+                mainExecutor,
+                SurfaceControl.Builder(),
+                syncQueue,
+                mockSurfaceControlViewHostFactory,
+                bubbleDropTargetBoundsProvider,
+            )
+        viewContainer.createView(
+            context,
+            mock(Display::class.java),
+            displayLayout,
+            taskInfo,
+            taskSurface,
+        )
+        desktopExecutor.flushAll()
+        viewContainer.indicatorView?.background = mockBackground
+        whenever(mockBackground.findDrawableByLayerId(anyInt()))
+            .thenReturn(mock(Drawable::class.java))
+        return spy(viewContainer)
+    }
+
+    private fun createTaskInfo(): RunningTaskInfo {
+        val taskDescriptionBuilder = ActivityManager.TaskDescription.Builder()
+        return TestRunningTaskInfoBuilder()
+            .setDisplayId(Display.DEFAULT_DISPLAY)
+            .setTaskDescriptionBuilder(taskDescriptionBuilder)
+            .setVisible(true)
+            .build()
+    }
+
+    companion object {
+        private val DISPLAY_BOUNDS = Rect(0, 0, 1000, 1000)
+    }
+}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/compatui/SystemModalsTransitionHandlerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/compatui/SystemModalsTransitionHandlerTest.kt
index dfb1b0c..9cb2a05 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/compatui/SystemModalsTransitionHandlerTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/compatui/SystemModalsTransitionHandlerTest.kt
@@ -16,9 +16,12 @@
 
 package com.android.wm.shell.desktopmode.compatui
 
+import android.content.ComponentName
 import android.content.Intent
+import android.content.pm.PackageManager
 import android.os.Binder
 import android.testing.AndroidTestingRunner
+import android.testing.TestableContext
 import android.view.SurfaceControl
 import android.view.WindowManager.TRANSIT_CHANGE
 import android.view.WindowManager.TRANSIT_CLOSE
@@ -37,6 +40,7 @@
 import com.android.wm.shell.sysui.ShellInit
 import com.android.wm.shell.transition.TransitionInfoBuilder
 import com.android.wm.shell.transition.Transitions
+import com.android.wm.shell.windowdecor.DesktopModeWindowDecorViewModelTestsBase.Companion.HOME_LAUNCHER_PACKAGE_NAME
 import com.google.common.truth.Truth.assertThat
 import org.junit.Before
 import org.junit.Test
@@ -44,6 +48,7 @@
 import org.mockito.ArgumentMatchers.anyInt
 import org.mockito.kotlin.any
 import org.mockito.kotlin.mock
+import org.mockito.kotlin.spy
 import org.mockito.kotlin.verify
 import org.mockito.kotlin.whenever
 
@@ -62,16 +67,23 @@
     private val desktopRepository = mock<DesktopRepository>()
     private val startT = mock<SurfaceControl.Transaction>()
     private val finishT = mock<SurfaceControl.Transaction>()
+    private val packageManager = mock<PackageManager>()
+    private val componentName = mock<ComponentName>()
 
+    private lateinit var spyContext: TestableContext
     private lateinit var transitionHandler: SystemModalsTransitionHandler
     private lateinit var desktopModeCompatPolicy: DesktopModeCompatPolicy
 
     @Before
     fun setUp() {
+        spyContext = spy(mContext)
         // Simulate having one Desktop task so that we see Desktop Mode as active
         whenever(desktopUserRepositories.current).thenReturn(desktopRepository)
         whenever(desktopRepository.getVisibleTaskCount(anyInt())).thenReturn(1)
-        desktopModeCompatPolicy = DesktopModeCompatPolicy(context)
+        whenever(spyContext.packageManager).thenReturn(packageManager)
+        whenever(componentName.packageName).thenReturn(HOME_LAUNCHER_PACKAGE_NAME)
+        whenever(packageManager.getHomeActivities(ArrayList())).thenReturn(componentName)
+        desktopModeCompatPolicy = DesktopModeCompatPolicy(spyContext)
         transitionHandler = createTransitionHandler()
     }
 
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/education/AppHandleEducationControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/education/AppHandleEducationControllerTest.kt
index 86e8142..08b9e04 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/education/AppHandleEducationControllerTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/education/AppHandleEducationControllerTest.kt
@@ -26,6 +26,8 @@
 import com.android.window.flags.Flags
 import com.android.wm.shell.ShellTestCase
 import com.android.wm.shell.desktopmode.CaptionState
+import com.android.wm.shell.desktopmode.DesktopModeUiEventLogger
+import com.android.wm.shell.desktopmode.DesktopModeUiEventLogger.DesktopUiEventEnum
 import com.android.wm.shell.desktopmode.WindowDecorCaptionHandleRepository
 import com.android.wm.shell.desktopmode.education.AppHandleEducationController.Companion.APP_HANDLE_EDUCATION_DELAY_MILLIS
 import com.android.wm.shell.desktopmode.education.AppHandleEducationController.Companion.TOOLTIP_VISIBLE_DURATION_MILLIS
@@ -86,6 +88,7 @@
     @Mock private lateinit var mockDataStoreRepository: AppHandleEducationDatastoreRepository
     @Mock private lateinit var mockCaptionHandleRepository: WindowDecorCaptionHandleRepository
     @Mock private lateinit var mockTooltipController: DesktopWindowingEducationTooltipController
+    @Mock private lateinit var mockDesktopModeUiEventLogger: DesktopModeUiEventLogger
 
     @Before
     fun setUp() {
@@ -105,6 +108,7 @@
                 mockTooltipController,
                 testScope.backgroundScope,
                 Dispatchers.Main,
+                mockDesktopModeUiEventLogger,
             )
     }
 
@@ -123,6 +127,8 @@
             verify(mockTooltipController, times(1)).showEducationTooltip(any(), any())
             verify(mockDataStoreRepository, times(1))
                 .updateAppHandleHintViewedTimestampMillis(eq(true))
+            verify(mockDesktopModeUiEventLogger, times(1))
+                .log(any(), eq(DesktopUiEventEnum.APP_HANDLE_EDUCATION_TOOLTIP_SHOWN))
         }
 
     @Test
@@ -155,6 +161,8 @@
             verify(mockTooltipController, times(1)).showEducationTooltip(any(), any())
             verify(mockDataStoreRepository, times(1))
                 .updateEnterDesktopModeHintViewedTimestampMillis(eq(true))
+            verify(mockDesktopModeUiEventLogger, times(1))
+                .log(any(), eq(DesktopUiEventEnum.ENTER_DESKTOP_MODE_EDUCATION_TOOLTIP_SHOWN))
         }
 
     @Test
@@ -170,6 +178,8 @@
             verify(mockTooltipController, times(1)).showEducationTooltip(any(), any())
             verify(mockDataStoreRepository, times(1))
                 .updateExitDesktopModeHintViewedTimestampMillis(eq(true))
+            verify(mockDesktopModeUiEventLogger, times(1))
+                .log(any(), eq(DesktopUiEventEnum.EXIT_DESKTOP_MODE_EDUCATION_TOOLTIP_SHOWN))
         }
 
     @Test
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/RecentsTransitionHandlerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/RecentsTransitionHandlerTest.java
index 439be91..fd5e567 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/RecentsTransitionHandlerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/RecentsTransitionHandlerTest.java
@@ -34,6 +34,7 @@
 import static org.junit.Assert.assertNull;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
@@ -293,6 +294,31 @@
 
     @Test
     @EnableFlags(FLAG_ENABLE_DESKTOP_RECENTS_TRANSITIONS_CORNERS_BUGFIX)
+    public void testMerge_openingTasks_callsOnTasksAppeared() throws Exception {
+        final IRecentsAnimationRunner animationRunner = mock(IRecentsAnimationRunner.class);
+        TransitionInfo mergeTransitionInfo = new TransitionInfoBuilder(TRANSIT_OPEN)
+                .addChange(TRANSIT_OPEN, new TestRunningTaskInfoBuilder().build())
+                .build();
+        final IBinder transition = startRecentsTransition(/* synthetic= */ false, animationRunner);
+        SurfaceControl.Transaction finishT = mock(SurfaceControl.Transaction.class);
+        mRecentsTransitionHandler.startAnimation(
+                transition, createTransitionInfo(), new StubTransaction(), new StubTransaction(),
+                mock(Transitions.TransitionFinishCallback.class));
+
+        mRecentsTransitionHandler.findController(transition).merge(
+                mergeTransitionInfo,
+                new StubTransaction(),
+                finishT,
+                transition,
+                mock(Transitions.TransitionFinishCallback.class));
+        mMainExecutor.flushAll();
+
+        verify(animationRunner).onTasksAppeared(
+                /* appearedTargets= */ any(), eq(mergeTransitionInfo));
+    }
+
+    @Test
+    @EnableFlags(FLAG_ENABLE_DESKTOP_RECENTS_TRANSITIONS_CORNERS_BUGFIX)
     public void testMergeAndFinish_openingFreeformTasks_setsCornerRadius() {
         ActivityManager.RunningTaskInfo freeformTask =
                 new TestRunningTaskInfoBuilder().setWindowingMode(WINDOWING_MODE_FREEFORM).build();
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/desktopmode/DesktopModeCompatPolicyTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/desktopmode/DesktopModeCompatPolicyTest.kt
index 55e9de5..f69bf34 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/desktopmode/DesktopModeCompatPolicyTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/desktopmode/DesktopModeCompatPolicyTest.kt
@@ -30,6 +30,7 @@
 import com.android.window.flags.Flags
 import com.android.wm.shell.ShellTestCase
 import com.android.wm.shell.desktopmode.DesktopTestHelpers.createFreeformTask
+import com.android.wm.shell.windowdecor.DesktopModeWindowDecorViewModelTestsBase.Companion.HOME_LAUNCHER_PACKAGE_NAME
 import libcore.junit.util.compat.CoreCompatChangeRule.DisableCompatChanges
 import libcore.junit.util.compat.CoreCompatChangeRule.EnableCompatChanges
 import org.junit.Assert.assertFalse
@@ -52,10 +53,14 @@
 class DesktopModeCompatPolicyTest : ShellTestCase() {
     @get:Rule val compatRule = PlatformCompatChangeRule()
     private lateinit var desktopModeCompatPolicy: DesktopModeCompatPolicy
+    private val packageManager: PackageManager = mock()
+    private val homeActivities = ComponentName(HOME_LAUNCHER_PACKAGE_NAME, /* class */ "")
 
     @Before
     fun setUp() {
         desktopModeCompatPolicy = DesktopModeCompatPolicy(mContext)
+        whenever(packageManager.getHomeActivities(any())).thenReturn(homeActivities)
+        mContext.setMockPackageManager(packageManager)
     }
 
     @Test
@@ -128,10 +133,6 @@
 
     @Test
     fun testIsTopActivityExemptFromDesktopWindowing_defaultHomePackage() {
-        val packageManager: PackageManager = mock()
-        val homeActivities = ComponentName("defaultHomePackage", /* class */ "")
-        whenever(packageManager.getHomeActivities(any())).thenReturn(homeActivities)
-        mContext.setMockPackageManager(packageManager)
         assertTrue(desktopModeCompatPolicy.isTopActivityExemptFromDesktopWindowing(
             createFreeformTask(/* displayId */ 0)
                 .apply {
@@ -142,10 +143,6 @@
 
     @Test
     fun testIsTopActivityExemptFromDesktopWindowing_defaultHomePackage_notDisplayed() {
-        val packageManager: PackageManager = mock()
-        val homeActivities = ComponentName("defaultHomePackage", /* class */ "")
-        whenever(packageManager.getHomeActivities(any())).thenReturn(homeActivities)
-        mContext.setMockPackageManager(packageManager)
         assertFalse(desktopModeCompatPolicy.isTopActivityExemptFromDesktopWindowing(
             createFreeformTask(/* displayId */ 0)
                 .apply {
@@ -155,6 +152,21 @@
     }
 
     @Test
+    fun testIsTopActivityExemptFromDesktopWindowing_defaultHomePackage_notYetAvailable() {
+        val emptyHomeActivities: ComponentName = mock()
+        mContext.setMockPackageManager(packageManager)
+
+        whenever(emptyHomeActivities.packageName).thenReturn(null)
+        whenever(packageManager.getHomeActivities(any())).thenReturn(emptyHomeActivities)
+
+        assertTrue(desktopModeCompatPolicy.isTopActivityExemptFromDesktopWindowing(
+            createFreeformTask(/* displayId */ 0)
+                .apply {
+                    isTopActivityNoDisplay = false
+                }))
+    }
+
+    @Test
     @EnableFlags(Flags.FLAG_EXCLUDE_CAPTION_FROM_APP_BOUNDS)
     @DisableCompatChanges(ActivityInfo.INSETS_DECOUPLED_CONFIGURATION_ENFORCED)
     fun testShouldExcludeCaptionFromAppBounds_resizeable_false() {
@@ -181,6 +193,17 @@
         )
     }
 
+
+    @Test
+    @EnableFlags(Flags.FLAG_EXCLUDE_CAPTION_FROM_APP_BOUNDS)
+    @DisableCompatChanges(ActivityInfo.INSETS_DECOUPLED_CONFIGURATION_ENFORCED)
+    @EnableCompatChanges(ActivityInfo.OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS)
+    fun testShouldExcludeCaptionFromAppBounds_resizeable_overridden_true() {
+        assertTrue(desktopModeCompatPolicy.shouldExcludeCaptionFromAppBounds(
+            setUpFreeformTask().apply { isResizeable = true })
+        )
+    }
+
     fun setUpFreeformTask(): TaskInfo =
         createFreeformTask().apply {
             val componentName =
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/desktopmode/DesktopModeStatusTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/desktopmode/DesktopModeStatusTest.kt
index 391d462..741a0fd 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/desktopmode/DesktopModeStatusTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/desktopmode/DesktopModeStatusTest.kt
@@ -157,23 +157,40 @@
     }
 
     @Test
-    fun isInternalDisplayEligibleToHostDesktops_configDEModeOn_returnsTrue() {
+    fun isDeviceEligibleForDesktopMode_configDEModeOnAndIntDispHostsDesktop_returnsTrue() {
+        doReturn(true).whenever(mockResources).getBoolean(eq(R.bool.config_isDesktopModeSupported))
         doReturn(true).whenever(mockResources).getBoolean(eq(R.bool.config_canInternalDisplayHostDesktops))
 
-        assertThat(DesktopModeStatus.isInternalDisplayEligibleToHostDesktops(mockContext)).isTrue()
+        assertThat(DesktopModeStatus.isDeviceEligibleForDesktopMode(mockContext)).isTrue()
+    }
+
+    @Test
+    fun isDeviceEligibleForDesktopMode_configDEModeOffAndIntDispHostsDesktop_returnsFalse() {
+        doReturn(false).whenever(mockResources).getBoolean(eq(R.bool.config_isDesktopModeSupported))
+        doReturn(true).whenever(mockResources).getBoolean(eq(R.bool.config_canInternalDisplayHostDesktops))
+
+        assertThat(DesktopModeStatus.isDeviceEligibleForDesktopMode(mockContext)).isFalse()
+    }
+
+    @Test
+    fun isDeviceEligibleForDesktopMode_configDEModeOnAndIntDispHostsDesktopOff_returnsFalse() {
+        doReturn(true).whenever(mockResources).getBoolean(eq(R.bool.config_isDesktopModeSupported))
+        doReturn(false).whenever(mockResources).getBoolean(eq(R.bool.config_canInternalDisplayHostDesktops))
+
+        assertThat(DesktopModeStatus.isDeviceEligibleForDesktopMode(mockContext)).isFalse()
     }
 
     @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE)
     @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_MODE_THROUGH_DEV_OPTION)
     @Test
     fun isInternalDisplayEligibleToHostDesktops_supportFlagOff_returnsFalse() {
-        assertThat(DesktopModeStatus.isInternalDisplayEligibleToHostDesktops(mockContext)).isFalse()
+        assertThat(DesktopModeStatus.isDeviceEligibleForDesktopMode(mockContext)).isFalse()
     }
 
     @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_MODE_THROUGH_DEV_OPTION)
     @Test
     fun isInternalDisplayEligibleToHostDesktops_supportFlagOn_returnsFalse() {
-        assertThat(DesktopModeStatus.isInternalDisplayEligibleToHostDesktops(mockContext)).isFalse()
+        assertThat(DesktopModeStatus.isDeviceEligibleForDesktopMode(mockContext)).isFalse()
     }
 
     @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_MODE_THROUGH_DEV_OPTION)
@@ -183,7 +200,7 @@
             eq(R.bool.config_isDesktopModeDevOptionSupported)
         )
 
-        assertThat(DesktopModeStatus.isInternalDisplayEligibleToHostDesktops(mockContext)).isTrue()
+        assertThat(DesktopModeStatus.isDeviceEligibleForDesktopMode(mockContext)).isTrue()
     }
 
     @DisableFlags(Flags.FLAG_SHOW_DESKTOP_EXPERIENCE_DEV_OPTION)
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/DefaultTransitionHandlerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/DefaultTransitionHandlerTest.java
index 82392e0..18fdbef 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/DefaultTransitionHandlerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/DefaultTransitionHandlerTest.java
@@ -48,6 +48,7 @@
 import androidx.test.filters.SmallTest;
 import androidx.test.platform.app.InstrumentationRegistry;
 
+import com.android.internal.jank.InteractionJankMonitor;
 import com.android.wm.shell.RootTaskDisplayAreaOrganizer;
 import com.android.wm.shell.ShellTestCase;
 import com.android.wm.shell.TestShellExecutor;
@@ -96,7 +97,7 @@
         mTransitionHandler = new DefaultTransitionHandler(
                 mContext, mShellInit, mDisplayController,
                 mTransactionPool, mMainExecutor, mMainHandler, mAnimExecutor,
-                mRootTaskDisplayAreaOrganizer);
+                mRootTaskDisplayAreaOrganizer, mock(InteractionJankMonitor.class));
         mShellInit.init();
     }
 
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt
index 49812d3..d8d45c0 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt
@@ -28,7 +28,6 @@
 import android.content.Context
 import android.content.Intent
 import android.content.Intent.ACTION_MAIN
-import android.content.pm.PackageManager
 import android.graphics.Rect
 import android.graphics.Region
 import android.hardware.display.DisplayManager
@@ -310,14 +309,10 @@
     @Test
     @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODALS_POLICY)
     fun testDecorationIsNotCreatedForDefaultHomePackage() {
-        val packageManager: PackageManager = org.mockito.kotlin.mock()
-        val homeActivities = ComponentName("defaultHomePackage", /* class */ "")
         val task = createTask(windowingMode = WINDOWING_MODE_FULLSCREEN).apply {
-            baseActivity = homeActivities
+            baseActivity = homeComponentName
             isTopActivityNoDisplay = false
         }
-        mContext.setMockPackageManager(packageManager)
-        whenever(packageManager.getHomeActivities(any())).thenReturn(homeActivities)
 
         onTaskOpening(task)
 
@@ -489,7 +484,6 @@
             eq(SnapPosition.LEFT),
             eq(ResizeTrigger.SNAP_LEFT_MENU),
             eq(InputMethod.UNKNOWN_INPUT_METHOD),
-            eq(decor)
         )
     }
 
@@ -525,7 +519,6 @@
             eq(SnapPosition.LEFT),
             eq(ResizeTrigger.SNAP_LEFT_MENU),
             eq(InputMethod.UNKNOWN_INPUT_METHOD),
-            eq(decor),
         )
     }
 
@@ -547,7 +540,6 @@
                 eq(decor.mTaskInfo), any(), eq(currentBounds), eq(SnapPosition.LEFT),
                 eq(ResizeTrigger.MAXIMIZE_BUTTON),
                 eq(InputMethod.UNKNOWN_INPUT_METHOD),
-                eq(decor),
             )
     }
 
@@ -567,7 +559,6 @@
             eq(SnapPosition.RIGHT),
             eq(ResizeTrigger.SNAP_RIGHT_MENU),
             eq(InputMethod.UNKNOWN_INPUT_METHOD),
-            eq(decor),
         )
     }
 
@@ -603,7 +594,6 @@
             eq(SnapPosition.RIGHT),
             eq(ResizeTrigger.SNAP_RIGHT_MENU),
             eq(InputMethod.UNKNOWN_INPUT_METHOD),
-            eq(decor),
         )
     }
 
@@ -625,7 +615,6 @@
                 eq(decor.mTaskInfo), any(), eq(currentBounds), eq(SnapPosition.RIGHT),
                 eq(ResizeTrigger.MAXIMIZE_BUTTON),
                 eq(InputMethod.UNKNOWN_INPUT_METHOD),
-                eq(decor),
             )
     }
 
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTestsBase.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTestsBase.kt
index 9f106da..8cccdb2 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTestsBase.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTestsBase.kt
@@ -20,7 +20,9 @@
 import android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD
 import android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW
 import android.app.WindowConfiguration.WindowingMode
+import android.content.ComponentName
 import android.content.pm.ActivityInfo
+import android.content.pm.PackageManager
 import android.graphics.Rect
 import android.hardware.input.InputManager
 import android.os.Handler
@@ -79,6 +81,7 @@
 import com.android.wm.shell.windowdecor.common.WindowDecorTaskResourceLoader
 import com.android.wm.shell.windowdecor.common.viewhost.WindowDecorViewHost
 import com.android.wm.shell.windowdecor.common.viewhost.WindowDecorViewHostSupplier
+import com.android.wm.shell.windowdecor.tiling.DesktopTilingDecorViewModel
 import com.android.wm.shell.windowdecor.viewholder.AppHeaderViewHolder
 import org.junit.After
 import org.mockito.Mockito
@@ -145,9 +148,12 @@
     protected val mockCaptionHandleRepository = mock<WindowDecorCaptionHandleRepository>()
     protected val mockDesktopRepository: DesktopRepository = mock<DesktopRepository>()
     protected val mockRecentsTransitionHandler = mock<RecentsTransitionHandler>()
+    protected val mockTilingWindowDecoration = mock<DesktopTilingDecorViewModel>()
     protected val motionEvent = mock<MotionEvent>()
-    val displayLayout = mock<DisplayLayout>()
-    val display = mock<Display>()
+    private val displayLayout = mock<DisplayLayout>()
+    private val display = mock<Display>()
+    private val packageManager = mock<PackageManager>()
+    protected val homeComponentName = ComponentName(HOME_LAUNCHER_PACKAGE_NAME, /* class */ "")
     protected lateinit var spyContext: TestableContext
     private lateinit var desktopModeEventLogger: DesktopModeEventLogger
 
@@ -178,7 +184,7 @@
         whenever(mockDisplayController.getDisplay(any())).thenReturn(display)
         whenever(mockDesktopUserRepositories.getProfile(anyInt()))
             .thenReturn(mockDesktopRepository)
-        desktopModeCompatPolicy = DesktopModeCompatPolicy(context)
+        desktopModeCompatPolicy = DesktopModeCompatPolicy(spyContext)
         desktopModeWindowDecorViewModel = DesktopModeWindowDecorViewModel(
             spyContext,
             testShellExecutor,
@@ -222,6 +228,7 @@
             mock<WindowDecorTaskResourceLoader>(),
             mockRecentsTransitionHandler,
             desktopModeCompatPolicy,
+            mockTilingWindowDecoration,
         )
         desktopModeWindowDecorViewModel.setSplitScreenController(mockSplitScreenController)
         whenever(mockDisplayController.getDisplayLayout(any())).thenReturn(mockDisplayLayout)
@@ -273,6 +280,8 @@
         whenever(displayLayout.getStableBounds(any())).thenAnswer { i ->
             (i.arguments.first() as Rect).set(STABLE_BOUNDS)
         }
+        spyContext.setMockPackageManager(packageManager)
+        whenever(packageManager.getHomeActivities(ArrayList())).thenReturn(homeComponentName)
     }
 
     @After
@@ -354,5 +363,6 @@
         val STABLE_INSETS = Rect(0, 100, 0, 0)
         val INITIAL_BOUNDS = Rect(0, 0, 100, 100)
         val STABLE_BOUNDS = Rect(0, 0, 1000, 1000)
+        val HOME_LAUNCHER_PACKAGE_NAME = "com.android.launcher"
     }
 }
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/MultiDisplayVeiledResizeTaskPositionerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/MultiDisplayVeiledResizeTaskPositionerTest.kt
index 63babc5..937938d 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/MultiDisplayVeiledResizeTaskPositionerTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/MultiDisplayVeiledResizeTaskPositionerTest.kt
@@ -249,6 +249,25 @@
     }
 
     @Test
+    fun testDragResize_movesTaskOnSameDisplay_noPxDpConversion() = runOnUiThread {
+        taskPositioner.onDragPositioningStart(
+            CTRL_TYPE_UNDEFINED,
+            DISPLAY_ID_0,
+            STARTING_BOUNDS.left.toFloat(),
+            STARTING_BOUNDS.top.toFloat(),
+        )
+
+        taskPositioner.onDragPositioningEnd(
+            DISPLAY_ID_0,
+            STARTING_BOUNDS.left.toFloat() + 70,
+            STARTING_BOUNDS.top.toFloat() + 20,
+        )
+
+        verify(spyDisplayLayout0, never()).localPxToGlobalDp(any(), any())
+        verify(spyDisplayLayout0, never()).globalDpToLocalPx(any(), any())
+    }
+
+    @Test
     fun testDragResize_movesTaskToNewDisplay() = runOnUiThread {
         taskPositioner.onDragPositioningStart(
             CTRL_TYPE_UNDEFINED,
diff --git a/libs/androidfw/ApkAssets.cpp b/libs/androidfw/ApkAssets.cpp
index dbb8914..e693fcf 100644
--- a/libs/androidfw/ApkAssets.cpp
+++ b/libs/androidfw/ApkAssets.cpp
@@ -162,10 +162,13 @@
   return assets_provider_->GetDebugName();
 }
 
-bool ApkAssets::IsUpToDate() const {
+UpToDate ApkAssets::IsUpToDate() const {
   // Loaders are invalidated by the app, not the system, so assume they are up to date.
-  return IsLoader() || ((!loaded_idmap_ || loaded_idmap_->IsUpToDate())
-                        && assets_provider_->IsUpToDate());
+  if (IsLoader()) {
+    return UpToDate::Always;
+  }
+  const auto idmap_res = loaded_idmap_ ? loaded_idmap_->IsUpToDate() : UpToDate::Always;
+  return combine(idmap_res, [this] { return assets_provider_->IsUpToDate(); });
 }
 
 }  // namespace android
diff --git a/libs/androidfw/AssetsProvider.cpp b/libs/androidfw/AssetsProvider.cpp
index 2d3c065..8085091 100644
--- a/libs/androidfw/AssetsProvider.cpp
+++ b/libs/androidfw/AssetsProvider.cpp
@@ -24,9 +24,27 @@
 #include <ziparchive/zip_archive.h>
 
 namespace android {
-namespace {
-constexpr const char* kEmptyDebugString = "<empty>";
-} // namespace
+
+static constexpr std::string_view kEmptyDebugString = "<empty>";
+
+std::unique_ptr<AssetsProvider> AssetsProvider::CreateWithOverride(
+    std::unique_ptr<AssetsProvider> provider, std::unique_ptr<AssetsProvider> override) {
+  if (provider == nullptr) {
+    return {};
+  }
+  if (override == nullptr) {
+    return provider;
+  }
+  return MultiAssetsProvider::Create(std::move(override), std::move(provider));
+}
+
+std::unique_ptr<AssetsProvider> AssetsProvider::CreateFromNullable(
+    std::unique_ptr<AssetsProvider> nullable) {
+  if (nullable) {
+    return nullable;
+  }
+  return EmptyAssetsProvider::Create();
+}
 
 std::unique_ptr<Asset> AssetsProvider::Open(const std::string& path, Asset::AccessMode mode,
                                             bool* file_exists) const {
@@ -86,11 +104,9 @@
 }
 
 ZipAssetsProvider::ZipAssetsProvider(ZipArchiveHandle handle, PathOrDebugName&& path,
-                                     package_property_t flags, time_t last_mod_time)
-    : zip_handle_(handle),
-      name_(std::move(path)),
-      flags_(flags),
-      last_mod_time_(last_mod_time) {}
+                                     package_property_t flags, ModDate last_mod_time)
+    : zip_handle_(handle), name_(std::move(path)), flags_(flags), last_mod_time_(last_mod_time) {
+}
 
 std::unique_ptr<ZipAssetsProvider> ZipAssetsProvider::Create(std::string path,
                                                              package_property_t flags,
@@ -104,10 +120,10 @@
     return {};
   }
 
-  struct stat sb{.st_mtime = -1};
+  ModDate mod_date = kInvalidModDate;
   // Skip all up-to-date checks if the file won't ever change.
-  if (!isReadonlyFilesystem(path.c_str())) {
-    if ((released_fd < 0 ? stat(path.c_str(), &sb) : fstat(released_fd, &sb)) < 0) {
+  if (isKnownWritablePath(path.c_str()) || !isReadonlyFilesystem(GetFileDescriptor(handle))) {
+    if (mod_date = getFileModDate(GetFileDescriptor(handle)); mod_date == kInvalidModDate) {
       // Stat requires execute permissions on all directories path to the file. If the process does
       // not have execute permissions on this file, allow the zip to be opened but IsUpToDate() will
       // always have to return true.
@@ -116,7 +132,7 @@
   }
 
   return std::unique_ptr<ZipAssetsProvider>(
-      new ZipAssetsProvider(handle, PathOrDebugName::Path(std::move(path)), flags, sb.st_mtime));
+      new ZipAssetsProvider(handle, PathOrDebugName::Path(std::move(path)), flags, mod_date));
 }
 
 std::unique_ptr<ZipAssetsProvider> ZipAssetsProvider::Create(base::unique_fd fd,
@@ -137,10 +153,10 @@
     return {};
   }
 
-  struct stat sb{.st_mtime = -1};
+  ModDate mod_date = kInvalidModDate;
   // Skip all up-to-date checks if the file won't ever change.
   if (!isReadonlyFilesystem(released_fd)) {
-    if (fstat(released_fd, &sb) < 0) {
+    if (mod_date = getFileModDate(released_fd); mod_date == kInvalidModDate) {
       // Stat requires execute permissions on all directories path to the file. If the process does
       // not have execute permissions on this file, allow the zip to be opened but IsUpToDate() will
       // always have to return true.
@@ -150,7 +166,7 @@
   }
 
   return std::unique_ptr<ZipAssetsProvider>(new ZipAssetsProvider(
-      handle, PathOrDebugName::DebugName(std::move(friendly_name)), flags, sb.st_mtime));
+      handle, PathOrDebugName::DebugName(std::move(friendly_name)), flags, mod_date));
 }
 
 std::unique_ptr<Asset> ZipAssetsProvider::OpenInternal(const std::string& path,
@@ -282,21 +298,16 @@
   return name_.GetDebugName();
 }
 
-bool ZipAssetsProvider::IsUpToDate() const {
-  if (last_mod_time_ == -1) {
-    return true;
+UpToDate ZipAssetsProvider::IsUpToDate() const {
+  if (last_mod_time_ == kInvalidModDate) {
+    return UpToDate::Always;
   }
-  struct stat sb{};
-  if (fstat(GetFileDescriptor(zip_handle_.get()), &sb) < 0) {
-    // If fstat fails on the zip archive, return true so the zip archive the resource system does
-    // attempt to refresh the ApkAsset.
-    return true;
-  }
-  return last_mod_time_ == sb.st_mtime;
+  return fromBool(last_mod_time_ == getFileModDate(GetFileDescriptor(zip_handle_.get())));
 }
 
-DirectoryAssetsProvider::DirectoryAssetsProvider(std::string&& path, time_t last_mod_time)
-    : dir_(std::move(path)), last_mod_time_(last_mod_time) {}
+DirectoryAssetsProvider::DirectoryAssetsProvider(std::string&& path, ModDate last_mod_time)
+    : dir_(std::move(path)), last_mod_time_(last_mod_time) {
+}
 
 std::unique_ptr<DirectoryAssetsProvider> DirectoryAssetsProvider::Create(std::string path) {
   struct stat sb;
@@ -317,7 +328,7 @@
 
   const bool isReadonly = isReadonlyFilesystem(path.c_str());
   return std::unique_ptr<DirectoryAssetsProvider>(
-      new DirectoryAssetsProvider(std::move(path), isReadonly ? -1 : sb.st_mtime));
+      new DirectoryAssetsProvider(std::move(path), isReadonly ? kInvalidModDate : getModDate(sb)));
 }
 
 std::unique_ptr<Asset> DirectoryAssetsProvider::OpenInternal(const std::string& path,
@@ -346,17 +357,11 @@
   return dir_;
 }
 
-bool DirectoryAssetsProvider::IsUpToDate() const {
-  if (last_mod_time_ == -1) {
-    return true;
+UpToDate DirectoryAssetsProvider::IsUpToDate() const {
+  if (last_mod_time_ == kInvalidModDate) {
+    return UpToDate::Always;
   }
-  struct stat sb;
-  if (stat(dir_.c_str(), &sb) < 0) {
-    // If stat fails on the zip archive, return true so the zip archive the resource system does
-    // attempt to refresh the ApkAsset.
-    return true;
-  }
-  return last_mod_time_ == sb.st_mtime;
+  return fromBool(last_mod_time_ == getFileModDate(dir_.c_str()));
 }
 
 MultiAssetsProvider::MultiAssetsProvider(std::unique_ptr<AssetsProvider>&& primary,
@@ -397,8 +402,8 @@
   return debug_name_;
 }
 
-bool MultiAssetsProvider::IsUpToDate() const {
-  return primary_->IsUpToDate() && secondary_->IsUpToDate();
+UpToDate MultiAssetsProvider::IsUpToDate() const {
+  return combine(primary_->IsUpToDate(), [this] { return secondary_->IsUpToDate(); });
 }
 
 EmptyAssetsProvider::EmptyAssetsProvider(std::optional<std::string>&& path) :
@@ -438,12 +443,12 @@
   if (path_.has_value()) {
     return *path_;
   }
-  const static std::string kEmpty = kEmptyDebugString;
+  constexpr static std::string kEmpty{kEmptyDebugString};
   return kEmpty;
 }
 
-bool EmptyAssetsProvider::IsUpToDate() const {
-  return true;
+UpToDate EmptyAssetsProvider::IsUpToDate() const {
+  return UpToDate::Always;
 }
 
 }  // namespace android
diff --git a/libs/androidfw/Idmap.cpp b/libs/androidfw/Idmap.cpp
index 095be57..f0ef97e5 100644
--- a/libs/androidfw/Idmap.cpp
+++ b/libs/androidfw/Idmap.cpp
@@ -22,9 +22,10 @@
 #include "android-base/logging.h"
 #include "android-base/stringprintf.h"
 #include "android-base/utf8.h"
-#include "androidfw/misc.h"
+#include "androidfw/AssetManager.h"
 #include "androidfw/ResourceTypes.h"
 #include "androidfw/Util.h"
+#include "androidfw/misc.h"
 #include "utils/ByteOrder.h"
 #include "utils/Trace.h"
 
@@ -280,11 +281,16 @@
       configurations_(configs),
       overlay_entries_(overlay_entries),
       string_pool_(std::move(string_pool)),
-      idmap_fd_(
-          android::base::utf8::open(idmap_path.c_str(), O_RDONLY | O_CLOEXEC | O_BINARY | O_PATH)),
       overlay_apk_path_(overlay_apk_path),
       target_apk_path_(target_apk_path),
-      idmap_last_mod_time_(getFileModDate(idmap_fd_.get())) {
+      idmap_last_mod_time_(kInvalidModDate) {
+  if (!isReadonlyFilesystem(std::string(overlay_apk_path_).c_str()) ||
+      !(target_apk_path_ == AssetManager::TARGET_APK_PATH ||
+        isReadonlyFilesystem(std::string(target_apk_path_).c_str()))) {
+    idmap_fd_.reset(
+        android::base::utf8::open(idmap_path.c_str(), O_RDONLY | O_CLOEXEC | O_BINARY | O_PATH));
+    idmap_last_mod_time_ = getFileModDate(idmap_fd_);
+  }
 }
 
 std::unique_ptr<LoadedIdmap> LoadedIdmap::Load(StringPiece idmap_path, StringPiece idmap_data) {
@@ -405,8 +411,11 @@
                       std::move(idmap_string_pool),*overlay_path, *target_path));
 }
 
-bool LoadedIdmap::IsUpToDate() const {
-  return idmap_last_mod_time_ == getFileModDate(idmap_fd_.get());
+UpToDate LoadedIdmap::IsUpToDate() const {
+  if (idmap_last_mod_time_ == kInvalidModDate) {
+    return UpToDate::Always;
+  }
+  return fromBool(idmap_last_mod_time_ == getFileModDate(idmap_fd_.get()));
 }
 
 }  // namespace android
diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp
index 978bc76..a18c5f5 100644
--- a/libs/androidfw/ResourceTypes.cpp
+++ b/libs/androidfw/ResourceTypes.cpp
@@ -152,12 +152,11 @@
     patch->colorsOffset = patch->yDivsOffset + (patch->numYDivs * sizeof(int32_t));
 }
 
-void Res_value::copyFrom_dtoh(const Res_value& src)
-{
-    size = dtohs(src.size);
-    res0 = src.res0;
-    dataType = src.dataType;
-    data = dtohl(src.data);
+void Res_value::copyFrom_dtoh_slow(const Res_value& src) {
+  size = dtohs(src.size);
+  res0 = src.res0;
+  dataType = src.dataType;
+  data = dtohl(src.data);
 }
 
 void Res_png_9patch::deviceToFile()
@@ -2035,16 +2034,6 @@
 // --------------------------------------------------------------------
 // --------------------------------------------------------------------
 
-void ResTable_config::copyFromDeviceNoSwap(const ResTable_config& o) {
-    const size_t size = dtohl(o.size);
-    if (size >= sizeof(ResTable_config)) {
-        *this = o;
-    } else {
-        memcpy(this, &o, size);
-        memset(((uint8_t*)this)+size, 0, sizeof(ResTable_config)-size);
-    }
-}
-
 /* static */ size_t unpackLanguageOrRegion(const char in[2], const char base,
         char out[4]) {
   if (in[0] & 0x80) {
@@ -2109,34 +2098,33 @@
     return unpackLanguageOrRegion(this->country, '0', region);
 }
 
-
-void ResTable_config::copyFromDtoH(const ResTable_config& o) {
-    copyFromDeviceNoSwap(o);
-    size = sizeof(ResTable_config);
-    mcc = dtohs(mcc);
-    mnc = dtohs(mnc);
-    density = dtohs(density);
-    screenWidth = dtohs(screenWidth);
-    screenHeight = dtohs(screenHeight);
-    sdkVersion = dtohs(sdkVersion);
-    minorVersion = dtohs(minorVersion);
-    smallestScreenWidthDp = dtohs(smallestScreenWidthDp);
-    screenWidthDp = dtohs(screenWidthDp);
-    screenHeightDp = dtohs(screenHeightDp);
+void ResTable_config::copyFromDtoH_slow(const ResTable_config& o) {
+  copyFromDeviceNoSwap(o);
+  size = sizeof(ResTable_config);
+  mcc = dtohs(mcc);
+  mnc = dtohs(mnc);
+  density = dtohs(density);
+  screenWidth = dtohs(screenWidth);
+  screenHeight = dtohs(screenHeight);
+  sdkVersion = dtohs(sdkVersion);
+  minorVersion = dtohs(minorVersion);
+  smallestScreenWidthDp = dtohs(smallestScreenWidthDp);
+  screenWidthDp = dtohs(screenWidthDp);
+  screenHeightDp = dtohs(screenHeightDp);
 }
 
-void ResTable_config::swapHtoD() {
-    size = htodl(size);
-    mcc = htods(mcc);
-    mnc = htods(mnc);
-    density = htods(density);
-    screenWidth = htods(screenWidth);
-    screenHeight = htods(screenHeight);
-    sdkVersion = htods(sdkVersion);
-    minorVersion = htods(minorVersion);
-    smallestScreenWidthDp = htods(smallestScreenWidthDp);
-    screenWidthDp = htods(screenWidthDp);
-    screenHeightDp = htods(screenHeightDp);
+void ResTable_config::swapHtoD_slow() {
+  size = htodl(size);
+  mcc = htods(mcc);
+  mnc = htods(mnc);
+  density = htods(density);
+  screenWidth = htods(screenWidth);
+  screenHeight = htods(screenHeight);
+  sdkVersion = htods(sdkVersion);
+  minorVersion = htods(minorVersion);
+  smallestScreenWidthDp = htods(smallestScreenWidthDp);
+  screenWidthDp = htods(screenWidthDp);
+  screenHeightDp = htods(screenHeightDp);
 }
 
 /* static */ inline int compareLocales(const ResTable_config &l, const ResTable_config &r) {
@@ -2149,7 +2137,7 @@
     // systems should happen very infrequently (if at all.)
     // The comparison code relies on memcmp low-level optimizations that make it
     // more efficient than strncmp.
-    const char emptyScript[sizeof(l.localeScript)] = {'\0', '\0', '\0', '\0'};
+    static constexpr char emptyScript[sizeof(l.localeScript)] = {'\0', '\0', '\0', '\0'};
     const char *lScript = l.localeScriptWasComputed ? emptyScript : l.localeScript;
     const char *rScript = r.localeScriptWasComputed ? emptyScript : r.localeScript;
 
diff --git a/libs/androidfw/Util.cpp b/libs/androidfw/Util.cpp
index be55fe8..86c459f 100644
--- a/libs/androidfw/Util.cpp
+++ b/libs/androidfw/Util.cpp
@@ -32,13 +32,18 @@
 namespace util {
 
 void ReadUtf16StringFromDevice(const uint16_t* src, size_t len, std::string* out) {
-  char buf[5];
-  while (*src && len != 0) {
-    char16_t c = static_cast<char16_t>(dtohs(*src));
-    utf16_to_utf8(&c, 1, buf, sizeof(buf));
-    out->append(buf, strlen(buf));
-    ++src;
-    --len;
+  static constexpr bool kDeviceEndiannessSame = dtohs(0x1001) == 0x1001;
+  if constexpr (kDeviceEndiannessSame) {
+    *out = Utf16ToUtf8({(const char16_t*)src, strnlen16((const char16_t*)src, len)});
+  } else {
+    char buf[5];
+    while (*src && len != 0) {
+      char16_t c = static_cast<char16_t>(dtohs(*src));
+      utf16_to_utf8(&c, 1, buf, sizeof(buf));
+      out->append(buf, strlen(buf));
+      ++src;
+      --len;
+    }
   }
 }
 
@@ -63,8 +68,10 @@
   }
 
   std::string utf8;
-  utf8.resize(utf8_length);
-  utf16_to_utf8(utf16.data(), utf16.length(), &*utf8.begin(), utf8_length + 1);
+  utf8.resize_and_overwrite(utf8_length, [&utf16](char* data, size_t size) {
+    utf16_to_utf8(utf16.data(), utf16.length(), data, size + 1);
+    return size;
+  });
   return utf8;
 }
 
diff --git a/libs/androidfw/include/androidfw/ApkAssets.h b/libs/androidfw/include/androidfw/ApkAssets.h
index 231808b..3f6f466 100644
--- a/libs/androidfw/include/androidfw/ApkAssets.h
+++ b/libs/androidfw/include/androidfw/ApkAssets.h
@@ -116,7 +116,7 @@
     return resources_asset_ != nullptr && resources_asset_->isAllocated();
   }
 
-  bool IsUpToDate() const;
+  UpToDate IsUpToDate() const;
 
   // DANGER!
   // This is a destructive method that rips the assets provider out of ApkAssets object.
diff --git a/libs/androidfw/include/androidfw/AssetsProvider.h b/libs/androidfw/include/androidfw/AssetsProvider.h
index d33c325..037f684 100644
--- a/libs/androidfw/include/androidfw/AssetsProvider.h
+++ b/libs/androidfw/include/androidfw/AssetsProvider.h
@@ -14,8 +14,7 @@
  * limitations under the License.
  */
 
-#ifndef ANDROIDFW_ASSETSPROVIDER_H
-#define ANDROIDFW_ASSETSPROVIDER_H
+#pragma once
 
 #include <memory>
 #include <string>
@@ -37,6 +36,12 @@
 struct AssetsProvider {
   static constexpr off64_t kUnknownLength = -1;
 
+  static std::unique_ptr<AssetsProvider> CreateWithOverride(
+      std::unique_ptr<AssetsProvider> provider, std::unique_ptr<AssetsProvider> override);
+
+  static std::unique_ptr<AssetsProvider> CreateFromNullable(
+      std::unique_ptr<AssetsProvider> nullable);
+
   // Opens a file for reading. If `file_exists` is not null, it will be set to `true` if the file
   // exists. This is useful for determining if the file exists but was unable to be opened due to
   // an I/O error.
@@ -58,7 +63,7 @@
   WARN_UNUSED virtual const std::string& GetDebugName() const = 0;
 
   // Returns whether the interface provides the most recent version of its files.
-  WARN_UNUSED virtual bool IsUpToDate() const = 0;
+  WARN_UNUSED virtual UpToDate IsUpToDate() const = 0;
 
   // Creates an Asset from a file on disk.
   static std::unique_ptr<Asset> CreateAssetFromFile(const std::string& path);
@@ -95,7 +100,7 @@
 
   WARN_UNUSED std::optional<std::string_view> GetPath() const override;
   WARN_UNUSED const std::string& GetDebugName() const override;
-  WARN_UNUSED bool IsUpToDate() const override;
+  WARN_UNUSED UpToDate IsUpToDate() const override;
   WARN_UNUSED std::optional<uint32_t> GetCrc(std::string_view path) const;
 
   ~ZipAssetsProvider() override = default;
@@ -106,7 +111,7 @@
  private:
   struct PathOrDebugName;
   ZipAssetsProvider(ZipArchive* handle, PathOrDebugName&& path, package_property_t flags,
-                    time_t last_mod_time);
+                    ModDate last_mod_time);
 
   struct PathOrDebugName {
     static PathOrDebugName Path(std::string value) {
@@ -135,7 +140,7 @@
   std::unique_ptr<ZipArchive, ZipCloser> zip_handle_;
   PathOrDebugName name_;
   package_property_t flags_;
-  time_t last_mod_time_;
+  ModDate last_mod_time_;
 };
 
 // Supplies assets from a root directory.
@@ -147,7 +152,7 @@
 
   WARN_UNUSED std::optional<std::string_view> GetPath() const override;
   WARN_UNUSED const std::string& GetDebugName() const override;
-  WARN_UNUSED bool IsUpToDate() const override;
+  WARN_UNUSED UpToDate IsUpToDate() const override;
 
   ~DirectoryAssetsProvider() override = default;
  protected:
@@ -156,9 +161,9 @@
                                       bool* file_exists) const override;
 
  private:
-  explicit DirectoryAssetsProvider(std::string&& path, time_t last_mod_time);
+  explicit DirectoryAssetsProvider(std::string&& path, ModDate last_mod_time);
   std::string dir_;
-  time_t last_mod_time_;
+  ModDate last_mod_time_;
 };
 
 // Supplies assets from a `primary` asset provider and falls back to supplying assets from the
@@ -172,7 +177,7 @@
 
   WARN_UNUSED std::optional<std::string_view> GetPath() const override;
   WARN_UNUSED const std::string& GetDebugName() const override;
-  WARN_UNUSED bool IsUpToDate() const override;
+  WARN_UNUSED UpToDate IsUpToDate() const override;
 
   ~MultiAssetsProvider() override = default;
  protected:
@@ -199,7 +204,7 @@
 
   WARN_UNUSED std::optional<std::string_view> GetPath() const override;
   WARN_UNUSED const std::string& GetDebugName() const override;
-  WARN_UNUSED bool IsUpToDate() const override;
+  WARN_UNUSED UpToDate IsUpToDate() const override;
 
   ~EmptyAssetsProvider() override = default;
  protected:
@@ -212,5 +217,3 @@
 };
 
 }  // namespace android
-
-#endif /* ANDROIDFW_ASSETSPROVIDER_H */
diff --git a/libs/androidfw/include/androidfw/Idmap.h b/libs/androidfw/include/androidfw/Idmap.h
index d1db13f..0c08563 100644
--- a/libs/androidfw/include/androidfw/Idmap.h
+++ b/libs/androidfw/include/androidfw/Idmap.h
@@ -14,8 +14,7 @@
  * limitations under the License.
  */
 
-#ifndef IDMAP_H_
-#define IDMAP_H_
+#pragma once
 
 #include <memory>
 #include <string>
@@ -32,6 +31,31 @@
 
 namespace android {
 
+// An enum that tracks more states than just 'up to date' or 'not' for a resources container:
+// there are several cases where we know for sure that the object can't change and won't get
+// out of date. Reporting those states to the managed layer allows it to stop checking here
+// completely, speeding up the cache lookups by dozens of milliseconds.
+enum class UpToDate : int { False, True, Always };
+
+// Combines two UpToDate values, and only accesses the second one if it matters to the result.
+template <class Getter>
+UpToDate combine(UpToDate first, Getter secondGetter) {
+  switch (first) {
+    case UpToDate::False:
+      return UpToDate::False;
+    case UpToDate::True: {
+      const auto second = secondGetter();
+      return second == UpToDate::False ? UpToDate::False : UpToDate::True;
+    }
+    case UpToDate::Always:
+      return secondGetter();
+  }
+}
+
+inline UpToDate fromBool(bool value) {
+  return value ? UpToDate::True : UpToDate::False;
+}
+
 class LoadedIdmap;
 class IdmapResMap;
 struct Idmap_header;
@@ -197,7 +221,7 @@
 
   // Returns whether the idmap file on disk has not been modified since the construction of this
   // LoadedIdmap.
-  bool IsUpToDate() const;
+  UpToDate IsUpToDate() const;
 
  protected:
   // Exposed as protected so that tests can subclass and mock this class out.
@@ -237,5 +261,3 @@
 };
 
 }  // namespace android
-
-#endif  // IDMAP_H_
diff --git a/libs/androidfw/include/androidfw/ResourceTypes.h b/libs/androidfw/include/androidfw/ResourceTypes.h
index 8b2871c..30594dc 100644
--- a/libs/androidfw/include/androidfw/ResourceTypes.h
+++ b/libs/androidfw/include/androidfw/ResourceTypes.h
@@ -47,6 +47,8 @@
 
 namespace android {
 
+constexpr const bool kDeviceEndiannessSame = dtohs(0x1001) == 0x1001;
+
 constexpr const uint32_t kIdmapMagic = 0x504D4449u;
 constexpr const uint32_t kIdmapCurrentVersion = 0x0000000Bu;
 
@@ -408,7 +410,16 @@
     typedef uint32_t data_type;
     data_type data;
 
-    void copyFrom_dtoh(const Res_value& src);
+    void copyFrom_dtoh(const Res_value& src) {
+      if constexpr (kDeviceEndiannessSame) {
+        *this = src;
+      } else {
+        copyFrom_dtoh_slow(src);
+      }
+    }
+
+   private:
+    void copyFrom_dtoh_slow(const Res_value& src);
 };
 
 /**
@@ -1254,11 +1265,32 @@
     // Varies in length from 3 to 8 chars. Zero-filled value.
     char localeNumberingSystem[8];
 
-    void copyFromDeviceNoSwap(const ResTable_config& o);
-    
-    void copyFromDtoH(const ResTable_config& o);
-    
-    void swapHtoD();
+    void copyFromDeviceNoSwap(const ResTable_config& o) {
+      const auto o_size = dtohl(o.size);
+      if (o_size >= sizeof(ResTable_config)) [[likely]] {
+        *this = o;
+      } else {
+        memcpy(this, &o, o_size);
+        memset(((uint8_t*)this) + o_size, 0, sizeof(ResTable_config) - o_size);
+      }
+      this->size = sizeof(*this);
+    }
+
+    void copyFromDtoH(const ResTable_config& o) {
+      if constexpr (kDeviceEndiannessSame) {
+        copyFromDeviceNoSwap(o);
+      } else {
+        copyFromDtoH_slow(o);
+      }
+    }
+
+    void swapHtoD() {
+      if constexpr (kDeviceEndiannessSame) {
+        ;  // noop
+      } else {
+        swapHtoD_slow();
+      }
+    }
 
     int compare(const ResTable_config& o) const;
     int compareLogical(const ResTable_config& o) const;
@@ -1384,6 +1416,10 @@
     bool isBetterThanBeforeLocale(const ResTable_config& o, const ResTable_config* requested) const;
 
     String8 toString() const;
+
+   private:
+    void copyFromDtoH_slow(const ResTable_config& o);
+    void swapHtoD_slow();
 };
 
 /**
diff --git a/libs/androidfw/include/androidfw/misc.h b/libs/androidfw/include/androidfw/misc.h
index c9ba8a0..d8ca64a 100644
--- a/libs/androidfw/include/androidfw/misc.h
+++ b/libs/androidfw/include/androidfw/misc.h
@@ -15,6 +15,7 @@
  */
 #pragma once
 
+#include <sys/stat.h>
 #include <time.h>
 
 //
@@ -64,10 +65,15 @@
 /* same, but also returns -1 if the file has already been deleted */
 ModDate getFileModDate(int fd);
 
+// Extract the modification date from the stat structure.
+ModDate getModDate(const struct ::stat& st);
+
 // Check if |path| or |fd| resides on a readonly filesystem.
 bool isReadonlyFilesystem(const char* path);
 bool isReadonlyFilesystem(int fd);
 
+bool isKnownWritablePath(const char* path);
+
 }  // namespace android
 
 // Whoever uses getFileModDate() will need this as well
diff --git a/libs/androidfw/misc.cpp b/libs/androidfw/misc.cpp
index 32f3624..26eb320 100644
--- a/libs/androidfw/misc.cpp
+++ b/libs/androidfw/misc.cpp
@@ -16,10 +16,10 @@
 
 #define LOG_TAG "misc"
 
-//
-// Miscellaneous utility functions.
-//
-#include <androidfw/misc.h>
+#include "androidfw/misc.h"
+
+#include <errno.h>
+#include <sys/stat.h>
 
 #include "android-base/logging.h"
 
@@ -28,9 +28,7 @@
 #include <sys/vfs.h>
 #endif  // __linux__
 
-#include <errno.h>
-#include <sys/stat.h>
-
+#include <array>
 #include <cstdio>
 #include <cstring>
 #include <tuple>
@@ -40,28 +38,26 @@
 /*
  * Get a file's type.
  */
-FileType getFileType(const char* fileName)
-{
-    struct stat sb;
-
-    if (stat(fileName, &sb) < 0) {
-        if (errno == ENOENT || errno == ENOTDIR)
-            return kFileTypeNonexistent;
-        else {
-            PLOG(ERROR) << "getFileType(): stat(" << fileName << ") failed";
-            return kFileTypeUnknown;
-        }
-    } else {
-        if (S_ISREG(sb.st_mode))
-            return kFileTypeRegular;
-        else if (S_ISDIR(sb.st_mode))
-            return kFileTypeDirectory;
-        else if (S_ISCHR(sb.st_mode))
-            return kFileTypeCharDev;
-        else if (S_ISBLK(sb.st_mode))
-            return kFileTypeBlockDev;
-        else if (S_ISFIFO(sb.st_mode))
-            return kFileTypeFifo;
+FileType getFileType(const char* fileName) {
+  struct stat sb;
+  if (stat(fileName, &sb) < 0) {
+    if (errno == ENOENT || errno == ENOTDIR)
+      return kFileTypeNonexistent;
+    else {
+      PLOG(ERROR) << "getFileType(): stat(" << fileName << ") failed";
+      return kFileTypeUnknown;
+    }
+  } else {
+    if (S_ISREG(sb.st_mode))
+      return kFileTypeRegular;
+    else if (S_ISDIR(sb.st_mode))
+      return kFileTypeDirectory;
+    else if (S_ISCHR(sb.st_mode))
+      return kFileTypeCharDev;
+    else if (S_ISBLK(sb.st_mode))
+      return kFileTypeBlockDev;
+    else if (S_ISFIFO(sb.st_mode))
+      return kFileTypeFifo;
 #if defined(S_ISLNK)
         else if (S_ISLNK(sb.st_mode))
             return kFileTypeSymlink;
@@ -75,7 +71,7 @@
     }
 }
 
-static ModDate getModDate(const struct stat& st) {
+ModDate getModDate(const struct stat& st) {
 #ifdef _WIN32
   return st.st_mtime;
 #elif defined(__APPLE__)
@@ -113,8 +109,14 @@
 bool isReadonlyFilesystem(int) {
     return false;
 }
+bool isKnownWritablePath(const char*) {
+  return false;
+}
 #else   // __linux__
 bool isReadonlyFilesystem(const char* path) {
+  if (isKnownWritablePath(path)) {
+    return false;
+  }
     struct statfs sfs;
     if (::statfs(path, &sfs)) {
         PLOG(ERROR) << "isReadonlyFilesystem(): statfs(" << path << ") failed";
@@ -131,6 +133,13 @@
     }
     return (sfs.f_flags & ST_RDONLY) != 0;
 }
+
+bool isKnownWritablePath(const char* path) {
+  // We know that all paths in /data/ are writable.
+  static constexpr char kRwPrefix[] = "/data/";
+  return strncmp(kRwPrefix, path, std::size(kRwPrefix) - 1) == 0;
+}
+
 #endif  // __linux__
 
 }  // namespace android
diff --git a/libs/androidfw/tests/Idmap_test.cpp b/libs/androidfw/tests/Idmap_test.cpp
index cb2e56f..22b9e69 100644
--- a/libs/androidfw/tests/Idmap_test.cpp
+++ b/libs/androidfw/tests/Idmap_test.cpp
@@ -218,10 +218,11 @@
 
   auto apk_assets = ApkAssets::LoadOverlay(temp_file.path);
   ASSERT_NE(nullptr, apk_assets);
-  ASSERT_TRUE(apk_assets->IsUpToDate());
+  ASSERT_TRUE(apk_assets->IsOverlay());
+  ASSERT_EQ(UpToDate::True, apk_assets->IsUpToDate());
 
   unlink(temp_file.path);
-  ASSERT_FALSE(apk_assets->IsUpToDate());
+  ASSERT_EQ(UpToDate::False, apk_assets->IsUpToDate());
 
   const auto sleep_duration =
       std::chrono::nanoseconds(std::max(kModDateResolutionNs, 1'000'000ull));
@@ -230,7 +231,27 @@
   base::WriteStringToFile("hello", temp_file.path);
   std::this_thread::sleep_for(sleep_duration);
 
-  ASSERT_FALSE(apk_assets->IsUpToDate());
+  ASSERT_EQ(UpToDate::False, apk_assets->IsUpToDate());
+}
+
+TEST(IdmapTestUpToDate, Combine) {
+  ASSERT_EQ(UpToDate::False, combine(UpToDate::False, [] {
+              ADD_FAILURE();  // Shouldn't get called at all.
+              return UpToDate::False;
+            }));
+
+  ASSERT_EQ(UpToDate::False, combine(UpToDate::True, [] { return UpToDate::False; }));
+
+  ASSERT_EQ(UpToDate::True, combine(UpToDate::True, [] { return UpToDate::True; }));
+  ASSERT_EQ(UpToDate::True, combine(UpToDate::True, [] { return UpToDate::Always; }));
+  ASSERT_EQ(UpToDate::True, combine(UpToDate::Always, [] { return UpToDate::True; }));
+
+  ASSERT_EQ(UpToDate::Always, combine(UpToDate::Always, [] { return UpToDate::Always; }));
+}
+
+TEST(IdmapTestUpToDate, FromBool) {
+  ASSERT_EQ(UpToDate::False, fromBool(false));
+  ASSERT_EQ(UpToDate::True, fromBool(true));
 }
 
 }  // namespace
diff --git a/libs/hwui/FrameInfo.cpp b/libs/hwui/FrameInfo.cpp
index a958a09..36feabd 100644
--- a/libs/hwui/FrameInfo.cpp
+++ b/libs/hwui/FrameInfo.cpp
@@ -32,8 +32,9 @@
                                 "PerformTraversalsStart",
                                 "DrawStart",
                                 "FrameDeadline",
-                                "FrameInterval",
                                 "FrameStartTime",
+                                "FrameInterval",
+                                "WorkloadTarget",
                                 "SyncQueued",
                                 "SyncStart",
                                 "IssueDrawCommandsStart",
@@ -48,7 +49,7 @@
 
 };
 
-static_assert(static_cast<int>(FrameInfoIndex::NumIndexes) == 23,
+static_assert(static_cast<int>(FrameInfoIndex::NumIndexes) == 24,
               "Must update value in FrameMetrics.java#FRAME_STATS_COUNT (and here)");
 
 void FrameInfo::importUiThreadInfo(int64_t* info) {
diff --git a/libs/hwui/FrameInfo.h b/libs/hwui/FrameInfo.h
index f7ad139..61c30b8 100644
--- a/libs/hwui/FrameInfo.h
+++ b/libs/hwui/FrameInfo.h
@@ -30,7 +30,8 @@
 namespace android {
 namespace uirenderer {
 
-static constexpr size_t UI_THREAD_FRAME_INFO_SIZE = 12;
+// This value must be in sync with `FRAME_INFO_SIZE` in FrameInfo.Java
+static constexpr size_t UI_THREAD_FRAME_INFO_SIZE = 13;
 
 enum class FrameInfoIndex {
     Flags = 0,
@@ -47,6 +48,11 @@
     FrameInterval,
     // End of UI frame info
 
+    // The target workload duration based on the original frame deadline and
+    // and intended vsync. Counted in UI_THREAD_FRAME_INFO_SIZE so its value
+    // can be set in setVsync().
+    WorkloadTarget,
+
     SyncQueued,
 
     SyncStart,
@@ -109,6 +115,7 @@
         set(FrameInfoIndex::FrameStartTime) = vsyncTime;
         set(FrameInfoIndex::FrameDeadline) = frameDeadline;
         set(FrameInfoIndex::FrameInterval) = frameInterval;
+        set(FrameInfoIndex::WorkloadTarget) = frameDeadline - intendedVsync;
         return *this;
     }
 
diff --git a/libs/hwui/JankTracker.cpp b/libs/hwui/JankTracker.cpp
index 638a060..80eb6bc 100644
--- a/libs/hwui/JankTracker.cpp
+++ b/libs/hwui/JankTracker.cpp
@@ -201,7 +201,7 @@
     // If we are in triple buffering, we have enough buffers in queue to sustain a single frame
     // drop without jank, so adjust the frame interval to the deadline.
     if (isTripleBuffered) {
-        int64_t originalDeadlineDuration = deadline - frame[FrameInfoIndex::IntendedVsync];
+        int64_t originalDeadlineDuration = frame[FrameInfoIndex::WorkloadTarget];
         deadline = mNextFrameStartUnstuffed + originalDeadlineDuration;
         frame.set(FrameInfoIndex::FrameDeadline) = deadline;
     }
diff --git a/libs/hwui/Properties.cpp b/libs/hwui/Properties.cpp
index 7d01dfb..21430f7 100644
--- a/libs/hwui/Properties.cpp
+++ b/libs/hwui/Properties.cpp
@@ -57,6 +57,9 @@
 constexpr bool early_preload_gl_context() {
     return false;
 }
+constexpr bool calc_workload_orig_deadline() {
+    return false;
+}
 }  // namespace hwui_flags
 #endif
 
@@ -299,5 +302,10 @@
                                  hwui_flags::early_preload_gl_context());
 }
 
+bool Properties::calcWorkloadOrigDeadline() {
+    static bool sCalcWorkloadOrigDeadline = base::GetBoolProperty(
+            "debug.hwui.calc_workload_orig_deadline", hwui_flags::calc_workload_orig_deadline());
+    return sCalcWorkloadOrigDeadline;
+}
 }  // namespace uirenderer
 }  // namespace android
diff --git a/libs/hwui/Properties.h b/libs/hwui/Properties.h
index 280a75a..a7a5644 100644
--- a/libs/hwui/Properties.h
+++ b/libs/hwui/Properties.h
@@ -384,6 +384,7 @@
     static bool initializeGlAlways();
     static bool resampleGainmapRegions();
     static bool earlyPreloadGlContext();
+    static bool calcWorkloadOrigDeadline();
 
 private:
     static StretchEffectBehavior stretchEffectBehavior;
diff --git a/libs/hwui/aconfig/hwui_flags.aconfig b/libs/hwui/aconfig/hwui_flags.aconfig
index 2851dd8..d3fc91b 100644
--- a/libs/hwui/aconfig/hwui_flags.aconfig
+++ b/libs/hwui/aconfig/hwui_flags.aconfig
@@ -137,6 +137,14 @@
 }
 
 flag {
+  name: "shader_color_space"
+  is_exported: true
+  namespace: "core_graphics"
+  description: "API to set the working colorspace of a Shader or ColorFilter"
+  bug: "299670828"
+}
+
+flag {
   name: "query_global_priority"
   namespace: "core_graphics"
   description: "Attempt to query whether the vulkan driver supports the requested global priority before queue creation."
@@ -174,6 +182,25 @@
 flag {
   name: "early_preload_gl_context"
   namespace: "core_graphics"
-  description: "Initialize GL context and GraphicBufferAllocater init on renderThread preload. This improves app startup time for apps using GL."
+  description: "Preload GL context on renderThread preload. This improves app startup time for apps using GL."
   bug: "383612849"
+}
+
+flag {
+  name: "calc_workload_orig_deadline"
+  namespace: "window_surfaces"
+  description: "Use original frame deadline to calculate the workload target deadline for jank tracking"
+  bug: "389939827"
+  is_fixed_read_only: true
+  metadata {
+    purpose: PURPOSE_BUGFIX
+  }
+}
+
+flag {
+  name: "early_preinit_buffer_allocator"
+  namespace: "core_graphics"
+  description: "Initialize GraphicBufferAllocater on ViewRootImpl init, to avoid blocking on init during buffer allocation, improving app launch latency."
+  bug: "389908734"
+  is_fixed_read_only: true
 }
\ No newline at end of file
diff --git a/libs/hwui/jni/Shader.cpp b/libs/hwui/jni/Shader.cpp
index eadb9de..c025089 100644
--- a/libs/hwui/jni/Shader.cpp
+++ b/libs/hwui/jni/Shader.cpp
@@ -266,11 +266,17 @@
     return static_cast<jlong>(reinterpret_cast<uintptr_t>(&SkRuntimeShaderBuilder_delete));
 }
 
-static jlong RuntimeShader_create(JNIEnv* env, jobject, jlong shaderBuilder, jlong matrixPtr) {
+static jlong RuntimeShader_create(JNIEnv* env, jobject, jlong shaderBuilder, jlong matrixPtr,
+                                  jlong colorSpacePtr) {
     SkRuntimeShaderBuilder* builder = reinterpret_cast<SkRuntimeShaderBuilder*>(shaderBuilder);
     const SkMatrix* matrix = reinterpret_cast<const SkMatrix*>(matrixPtr);
+    auto colorSpace = GraphicsJNI::getNativeColorSpace(colorSpacePtr);
     sk_sp<SkShader> shader = builder->makeShader(matrix);
     ThrowIAE_IfNull(env, shader);
+    if (colorSpace) {
+        shader = shader->makeWithWorkingColorSpace(colorSpace);
+        ThrowIAE_IfNull(env, shader);
+    }
     return reinterpret_cast<jlong>(shader.release());
 }
 
@@ -379,7 +385,7 @@
 
 static const JNINativeMethod gRuntimeShaderMethods[] = {
         {"nativeGetFinalizer", "()J", (void*)RuntimeShader_getNativeFinalizer},
-        {"nativeCreateShader", "(JJ)J", (void*)RuntimeShader_create},
+        {"nativeCreateShader", "(JJJ)J", (void*)RuntimeShader_create},
         {"nativeCreateBuilder", "(Ljava/lang/String;)J", (void*)RuntimeShader_createShaderBuilder},
         {"nativeUpdateUniforms", "(JLjava/lang/String;[FZ)V",
          (void*)RuntimeShader_updateFloatArrayUniforms},
diff --git a/libs/hwui/jni/android_graphics_HardwareRenderer.cpp b/libs/hwui/jni/android_graphics_HardwareRenderer.cpp
index df9f830..99e7740 100644
--- a/libs/hwui/jni/android_graphics_HardwareRenderer.cpp
+++ b/libs/hwui/jni/android_graphics_HardwareRenderer.cpp
@@ -52,6 +52,9 @@
 #include <renderthread/RenderThread.h>
 #include <src/image/SkImage_Base.h>
 #include <thread/CommonPool.h>
+#ifdef __ANDROID__
+#include <ui/GraphicBufferAllocator.h>
+#endif
 #include <utils/Color.h>
 #include <utils/RefBase.h>
 #include <utils/StrongPointer.h>
@@ -849,6 +852,17 @@
     RenderProxy::preload();
 }
 
+static void android_view_ThreadedRenderer_preInitBufferAllocator(JNIEnv*, jclass) {
+#ifdef __ANDROID__
+    CommonPool::async([] {
+        ATRACE_NAME("preInitBufferAllocator:GraphicBufferAllocator");
+        // This involves several binder calls which we do not want blocking
+        // critical path of the activity that is launching.
+        GraphicBufferAllocator::getInstance();
+    });
+#endif
+}
+
 static void android_view_ThreadedRenderer_setRtAnimationsEnabled(JNIEnv* env, jobject clazz,
                                                                  jboolean enabled) {
     RenderProxy::setRtAnimationsEnabled(enabled);
@@ -1040,6 +1054,8 @@
          (void*)android_view_ThreadedRenderer_setDisplayDensityDpi},
         {"nInitDisplayInfo", "(IIFIJJZZZ)V", (void*)android_view_ThreadedRenderer_initDisplayInfo},
         {"preload", "()V", (void*)android_view_ThreadedRenderer_preload},
+        {"preInitBufferAllocator", "()V",
+         (void*)android_view_ThreadedRenderer_preInitBufferAllocator},
         {"isWebViewOverlaysEnabled", "()Z",
          (void*)android_view_ThreadedRenderer_isWebViewOverlaysEnabled},
         {"nSetDrawingEnabled", "(Z)V", (void*)android_view_ThreadedRenderer_setDrawingEnabled},
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp
index b36b8be..e3e393c 100644
--- a/libs/hwui/renderthread/CanvasContext.cpp
+++ b/libs/hwui/renderthread/CanvasContext.cpp
@@ -789,7 +789,13 @@
     int64_t frameDeadline = mCurrentFrameInfo->get(FrameInfoIndex::FrameDeadline);
     int64_t dequeueBufferDuration = mCurrentFrameInfo->get(FrameInfoIndex::DequeueBufferDuration);
 
-    mHintSessionWrapper->updateTargetWorkDuration(frameDeadline - intendedVsync);
+    if (Properties::calcWorkloadOrigDeadline()) {
+        // Uses the unmodified frame deadline in calculating workload target duration
+        mHintSessionWrapper->updateTargetWorkDuration(
+                mCurrentFrameInfo->get(FrameInfoIndex::WorkloadTarget));
+    } else {
+        mHintSessionWrapper->updateTargetWorkDuration(frameDeadline - intendedVsync);
+    }
 
     if (didDraw) {
         int64_t frameStartTime = mCurrentFrameInfo->get(FrameInfoIndex::FrameStartTime);
diff --git a/libs/hwui/tests/unit/JankTrackerTests.cpp b/libs/hwui/tests/unit/JankTrackerTests.cpp
index b67e419..c289d67 100644
--- a/libs/hwui/tests/unit/JankTrackerTests.cpp
+++ b/libs/hwui/tests/unit/JankTrackerTests.cpp
@@ -45,6 +45,7 @@
     info->set(FrameInfoIndex::FrameCompleted) = 115_ms;
     info->set(FrameInfoIndex::FrameInterval) = 16_ms;
     info->set(FrameInfoIndex::FrameDeadline) = 120_ms;
+    info->set(FrameInfoIndex::WorkloadTarget) = 20_ms;
     jankTracker.finishFrame(*info, reporter, frameNumber, surfaceId);
 
     info = jankTracker.startFrame();
@@ -55,6 +56,7 @@
     info->set(FrameInfoIndex::FrameCompleted) = 131_ms;
     info->set(FrameInfoIndex::FrameInterval) = 16_ms;
     info->set(FrameInfoIndex::FrameDeadline) = 136_ms;
+    info->set(FrameInfoIndex::WorkloadTarget) = 20_ms;
     jankTracker.finishFrame(*info, reporter, frameNumber, surfaceId);
 
     ASSERT_EQ(2, container.get()->totalFrameCount());
@@ -79,6 +81,7 @@
     info->set(FrameInfoIndex::FrameCompleted) = 121_ms;
     info->set(FrameInfoIndex::FrameInterval) = 16_ms;
     info->set(FrameInfoIndex::FrameDeadline) = 120_ms;
+    info->set(FrameInfoIndex::WorkloadTarget) = 20_ms;
     jankTracker.finishFrame(*info, reporter, frameNumber, surfaceId);
 
     ASSERT_EQ(1, container.get()->totalFrameCount());
@@ -102,6 +105,7 @@
     info->set(FrameInfoIndex::FrameCompleted) = 118_ms;
     info->set(FrameInfoIndex::FrameInterval) = 16_ms;
     info->set(FrameInfoIndex::FrameDeadline) = 120_ms;
+    info->set(FrameInfoIndex::WorkloadTarget) = 20_ms;
     jankTracker.finishFrame(*info, reporter, frameNumber, surfaceId);
 
     ASSERT_EQ(1, container.get()->totalFrameCount());
@@ -127,6 +131,7 @@
     info->set(FrameInfoIndex::FrameCompleted) = 121_ms;
     info->set(FrameInfoIndex::FrameInterval) = 16_ms;
     info->set(FrameInfoIndex::FrameDeadline) = 120_ms;
+    info->set(FrameInfoIndex::WorkloadTarget) = 20_ms;
     jankTracker.finishFrame(*info, reporter, frameNumber, surfaceId);
 
     ASSERT_EQ(1, container.get()->jankFrameCount());
@@ -140,6 +145,7 @@
     info->set(FrameInfoIndex::FrameCompleted) = 137_ms;
     info->set(FrameInfoIndex::FrameInterval) = 16_ms;
     info->set(FrameInfoIndex::FrameDeadline) = 136_ms;
+    info->set(FrameInfoIndex::WorkloadTarget) = 20_ms;
     jankTracker.finishFrame(*info, reporter, frameNumber, surfaceId);
 
     ASSERT_EQ(2, container.get()->totalFrameCount());
@@ -164,6 +170,7 @@
     info->set(FrameInfoIndex::FrameCompleted) = 121_ms;
     info->set(FrameInfoIndex::FrameInterval) = 16_ms;
     info->set(FrameInfoIndex::FrameDeadline) = 120_ms;
+    info->set(FrameInfoIndex::WorkloadTarget) = 20_ms;
     jankTracker.finishFrame(*info, reporter, frameNumber, surfaceId);
 
     ASSERT_EQ(1, container.get()->jankFrameCount());
@@ -177,6 +184,7 @@
     info->set(FrameInfoIndex::FrameCompleted) = 137_ms;
     info->set(FrameInfoIndex::FrameInterval) = 16_ms;
     info->set(FrameInfoIndex::FrameDeadline) = 136_ms;
+    info->set(FrameInfoIndex::WorkloadTarget) = 20_ms;
     jankTracker.finishFrame(*info, reporter, frameNumber, surfaceId);
 
     ASSERT_EQ(1, container.get()->jankFrameCount());
@@ -190,6 +198,7 @@
     info->set(FrameInfoIndex::FrameCompleted) = 169_ms;
     info->set(FrameInfoIndex::FrameInterval) = 16_ms;
     info->set(FrameInfoIndex::FrameDeadline) = 168_ms;
+    info->set(FrameInfoIndex::WorkloadTarget) = 20_ms;
     jankTracker.finishFrame(*info, reporter, frameNumber, surfaceId);
 
     ASSERT_EQ(3, container.get()->totalFrameCount());
@@ -214,6 +223,7 @@
     info->set(FrameInfoIndex::FrameCompleted) = 117_ms;
     info->set(FrameInfoIndex::FrameInterval) = 16_ms;
     info->set(FrameInfoIndex::FrameDeadline) = 116_ms;
+    info->set(FrameInfoIndex::WorkloadTarget) = 16_ms;
     jankTracker.finishFrame(*info, reporter, frameNumber, surfaceId);
 
     ASSERT_EQ(1, container.get()->jankFrameCount());
@@ -228,6 +238,7 @@
     info->set(FrameInfoIndex::FrameCompleted) = 133_ms;
     info->set(FrameInfoIndex::FrameInterval) = 16_ms;
     info->set(FrameInfoIndex::FrameDeadline) = 132_ms;
+    info->set(FrameInfoIndex::WorkloadTarget) = 16_ms;
     jankTracker.finishFrame(*info, reporter, frameNumber, surfaceId);
 
     ASSERT_EQ(1, container.get()->jankFrameCount());
@@ -242,6 +253,7 @@
     info->set(FrameInfoIndex::FrameCompleted) = 165_ms;
     info->set(FrameInfoIndex::FrameInterval) = 16_ms;
     info->set(FrameInfoIndex::FrameDeadline) = 148_ms;
+    info->set(FrameInfoIndex::WorkloadTarget) = 16_ms;
     jankTracker.finishFrame(*info, reporter, frameNumber, surfaceId);
 
     ASSERT_EQ(2, container.get()->jankFrameCount());
@@ -256,6 +268,7 @@
     info->set(FrameInfoIndex::FrameCompleted) = 181_ms;
     info->set(FrameInfoIndex::FrameInterval) = 16_ms;
     info->set(FrameInfoIndex::FrameDeadline) = 164_ms;
+    info->set(FrameInfoIndex::WorkloadTarget) = 16_ms;
     jankTracker.finishFrame(*info, reporter, frameNumber, surfaceId);
 
     ASSERT_EQ(2, container.get()->jankFrameCount());
diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java
index fb1b5b5..15c8323 100644
--- a/media/java/android/media/MediaCodec.java
+++ b/media/java/android/media/MediaCodec.java
@@ -4060,6 +4060,7 @@
          * Finish building a queue request and queue the buffers with tunings.
          */
         public void queue() {
+            Trace.traceBegin(Trace.TRACE_TAG_VIDEO, "MediaCodec::queueRequest-queue#java");
             if (!isAccessible()) {
                 throw new IllegalStateException("The request is stale");
             }
@@ -4088,6 +4089,7 @@
                         mTuningKeys, mTuningValues);
             }
             clear();
+            Trace.traceEnd(Trace.TRACE_TAG_VIDEO);
         }
 
         @NonNull QueueRequest clear() {
diff --git a/media/java/android/media/MediaRoute2ProviderService.java b/media/java/android/media/MediaRoute2ProviderService.java
index 3104f9d..e94fb7d 100644
--- a/media/java/android/media/MediaRoute2ProviderService.java
+++ b/media/java/android/media/MediaRoute2ProviderService.java
@@ -55,6 +55,7 @@
 import java.util.Collection;
 import java.util.Deque;
 import java.util.List;
+import java.util.Objects;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
@@ -96,12 +97,10 @@
      * system media, as described by {@link MediaRoute2Info#getSupportedRoutingTypes()}.
      *
      * @see #onCreateSystemRoutingSession
-     * @hide
      */
-    // TODO: b/362507305 - Unhide once the implementation and CTS are in place.
     @FlaggedApi(Flags.FLAG_ENABLE_MIRRORING_IN_MEDIA_ROUTER_2)
     @SdkConstant(SdkConstant.SdkConstantType.INTENT_CATEGORY)
-    public static final String SERVICE_INTERFACE_SYSTEM_MEDIA =
+    public static final String CATEGORY_SYSTEM_MEDIA =
             "android.media.MediaRoute2ProviderService.SYSTEM_MEDIA";
 
     /**
@@ -165,9 +164,7 @@
      * The request has failed because the requested operation is not implemented by the provider.
      *
      * @see #notifyRequestFailed
-     * @hide
      */
-    // TODO: b/362507305 - Unhide once the implementation and CTS are in place.
     @FlaggedApi(Flags.FLAG_ENABLE_MIRRORING_IN_MEDIA_ROUTER_2)
     public static final int REASON_UNIMPLEMENTED = 5;
 
@@ -175,9 +172,7 @@
      * The request has failed because the provider has failed to route system media.
      *
      * @see #notifyRequestFailed
-     * @hide
      */
-    // TODO: b/362507305 - Unhide once the implementation and CTS are in place.
     @FlaggedApi(Flags.FLAG_ENABLE_MIRRORING_IN_MEDIA_ROUTER_2)
     public static final int REASON_FAILED_TO_REROUTE_SYSTEM_MEDIA = 6;
 
@@ -217,7 +212,7 @@
      * package (for example, if they affect the entire system).
      */
     @GuardedBy("mRequestIdsLock")
-    private final LongSparseArray<Integer> mSystemMediaSessionCreationRequests =
+    private final LongSparseArray<Integer> mSystemRoutingSessionCreationRequests =
             new LongSparseArray<>();
 
     @GuardedBy("mSessionLock")
@@ -350,7 +345,7 @@
     /**
      * Notifies the system of the successful creation of a system media routing session.
      *
-     * <p>This method can only be called as the result of a prior call to {@link
+     * <p>This method must only be called as the result of a prior call to {@link
      * #onCreateSystemRoutingSession}.
      *
      * @param requestId the ID of the {@link #onCreateSystemRoutingSession} request which this call
@@ -365,13 +360,13 @@
      *     where you can clean up this session. {@link AudioRecord#startRecording()} must be called
      *     immediately on {@link MediaStreams#getAudioRecord()} after calling this method, in order
      *     to start streaming audio to the receiver.
-     * @hide
+     * @throws IllegalStateException If the provided {@code requestId} doesn't correspond to a
+     *     previous call to {@link #onCreateSystemRoutingSession}.
      */
-    // TODO: b/362507305 - Unhide once the implementation and CTS are in place.
     @FlaggedApi(Flags.FLAG_ENABLE_MIRRORING_IN_MEDIA_ROUTER_2)
     @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     @Nullable
-    public final MediaStreams notifySystemMediaSessionCreated(
+    public final MediaStreams notifySystemRoutingSessionCreated(
             long requestId,
             @NonNull RoutingSessionInfo sessionInfo,
             @NonNull MediaStreamsFormats formats) {
@@ -380,7 +375,7 @@
         if (DEBUG) {
             Log.d(
                     TAG,
-                    "notifySystemMediaSessionCreated: Creating a session. requestId="
+                    "notifySystemRoutingSessionCreated: Creating a session. requestId="
                             + requestId
                             + ", sessionInfo="
                             + sessionInfo);
@@ -388,8 +383,8 @@
 
         Integer uid;
         synchronized (mRequestIdsLock) {
-            uid = mSystemMediaSessionCreationRequests.get(requestId);
-            mSystemMediaSessionCreationRequests.remove(requestId);
+            uid = mSystemRoutingSessionCreationRequests.get(requestId);
+            mSystemRoutingSessionCreationRequests.remove(requestId);
         }
 
         if (uid == null) {
@@ -656,37 +651,34 @@
     /**
      * Called when the service receives a request to create a system routing session.
      *
-     * <p>This method will only be called for routes that support routing of the system media, as
-     * described by {@link MediaRoute2Info#getSupportedRoutingTypes()}.
+     * <p>This method must be overridden by subclasses that support routes that support routing
+     * {@link MediaRoute2Info#getSupportedRoutingTypes() system media}. The provided {@code routeId}
+     * will always correspond to a route that supports routing of the system media, as per {@link
+     * MediaRoute2Info#getSupportedRoutingTypes()}.
      *
-     * <p>Implementors of this method must call {@link #notifySystemMediaSessionCreated} with the
+     * <p>Implementors of this method must call {@link #notifySystemRoutingSessionCreated} with the
      * given {@code requestId} to indicate a successful session creation. If the session creation
      * fails (for example, if the connection to the receiver device fails), the implementor must
      * call {@link #notifyRequestFailed}, passing the {@code requestId}.
      *
      * <p>Unlike {@link #onCreateSession}, system sessions route the system media (for example,
      * audio and/or video) which is to be retrieved by calling {@link
-     * #notifySystemMediaSessionCreated}.
+     * #notifySystemRoutingSessionCreated}.
      *
      * <p>Changes to the session can be notified by calling {@link #notifySessionUpdated}.
      *
      * @param requestId the ID of this request
-     * @param packageName the package name of the application whose media to route.
      * @param routeId the ID of the route initially being {@link
      *     RoutingSessionInfo#getSelectedRoutes() selected}.
-     * @param sessionHints an optional bundle of arguments sent by {@link MediaRouter2}, or null if
-     *     none.
+     * @param parameters {@link SystemRoutingSessionParams} for the session creation.
      * @see RoutingSessionInfo.Builder
-     * @see #notifySystemMediaSessionCreated
-     * @hide
+     * @see #notifySystemRoutingSessionCreated
      */
-    // TODO: b/362507305 - Unhide once the implementation and CTS are in place.
     @FlaggedApi(Flags.FLAG_ENABLE_MIRRORING_IN_MEDIA_ROUTER_2)
     public void onCreateSystemRoutingSession(
             long requestId,
-            @NonNull String packageName,
             @NonNull String routeId,
-            @Nullable Bundle sessionHints) {
+            @NonNull SystemRoutingSessionParams parameters) {
         mHandler.post(() -> notifyRequestFailed(requestId, REASON_UNIMPLEMENTED));
     }
 
@@ -974,24 +966,29 @@
                 int uid,
                 String packageName,
                 String routeId,
-                @Nullable Bundle sessionHints) {
-            if (!checkCallerIsSystem()) {
+                @Nullable Bundle extras) {
+            if (!Flags.enableMirroringInMediaRouter2() || !checkCallerIsSystem()) {
                 return;
             }
             if (!checkRouteIdIsValid(routeId, "requestCreateSession")) {
                 return;
             }
             synchronized (mRequestIdsLock) {
-                mSystemMediaSessionCreationRequests.put(requestId, uid);
+                mSystemRoutingSessionCreationRequests.put(requestId, uid);
             }
+            var sessionParamsBuilder =
+                    new SystemRoutingSessionParams.Builder().setPackageName(packageName);
+            if (extras != null) {
+                sessionParamsBuilder.setExtras(extras);
+            }
+            var sessionParams = sessionParamsBuilder.build();
             mHandler.sendMessage(
                     obtainMessage(
                             MediaRoute2ProviderService::onCreateSystemRoutingSession,
                             MediaRoute2ProviderService.this,
                             requestId,
-                            packageName,
                             routeId,
-                            sessionHints));
+                            sessionParams));
         }
 
         @Override
@@ -1072,14 +1069,12 @@
     }
 
     /**
-     * Holds the streams to be routed as part of a system media routing session.
+     * Holds the streams to be routed as part of a {@link #onCreateSystemRoutingSession system media
+     * routing session}.
      *
-     * <p>The encoded data format matches the {@link MediaStreamsFormats} passed to {@link
-     * #notifySystemMediaSessionCreated}.
-     *
-     * @hide
+     * <p>The encoded data format will match the {@link MediaStreamsFormats} passed to {@link
+     * #notifySystemRoutingSessionCreated}.
      */
-    // TODO: b/362507305 - Unhide once the implementation and CTS are in place.
     @FlaggedApi(Flags.FLAG_ENABLE_MIRRORING_IN_MEDIA_ROUTER_2)
     public static final class MediaStreams {
 
@@ -1088,8 +1083,6 @@
 
         /**
          * Holds the last {@link RoutingSessionInfo} associated with these streams.
-         *
-         * @hide
          */
         @NonNull
         // Access guarded by mSessionsLock, but it's not convenient to enforce through @GuardedBy.
@@ -1147,15 +1140,91 @@
         }
     }
 
+    /**
+     * Holds parameters associated with a {@link #onCreateSystemRoutingSession session creation
+     * request}.
+     */
+    @FlaggedApi(Flags.FLAG_ENABLE_MIRRORING_IN_MEDIA_ROUTER_2)
+    public static final class SystemRoutingSessionParams {
+
+        private final String mPackageName;
+        private final Bundle mExtras;
+
+        private SystemRoutingSessionParams(Builder builder) {
+            this.mPackageName = builder.mPackageName;
+            this.mExtras = builder.mExtras;
+        }
+
+        /**
+         * Returns the name of the package associated with the session, or an empty string if not
+         * applicable.
+         *
+         * <p>The package name is not applicable if the session is not associated with a specific
+         * package, for example is the session affects the entire system.
+         */
+        @FlaggedApi(Flags.FLAG_ENABLE_MIRRORING_IN_MEDIA_ROUTER_2)
+        @NonNull
+        public String getPackageName() {
+            return mPackageName;
+        }
+
+        /** Returns a bundle provided by the client that triggered the session creation request. */
+        @FlaggedApi(Flags.FLAG_ENABLE_MIRRORING_IN_MEDIA_ROUTER_2)
+        @NonNull
+        public Bundle getExtras() {
+            return mExtras;
+        }
+
+        /** A builder for {@link SystemRoutingSessionParams}. */
+        public static final class Builder {
+            private String mPackageName;
+            private Bundle mExtras;
+
+            /** Constructor. */
+            public Builder() {
+                mPackageName = "";
+                mExtras = Bundle.EMPTY;
+            }
+
+            /**
+             * Sets the {@link #getExtras() extras}.
+             *
+             * <p>The default value is an empty {@link Bundle}.
+             *
+             * <p>Note that this bundle is not copied, so avoiding mutating the given {@link Bundle}
+             * after passing it to this method.
+             */
+            @NonNull
+            public Builder setExtras(@NonNull Bundle extras) {
+                mExtras = Objects.requireNonNull(extras);
+                return this;
+            }
+
+            /**
+             * Sets the {@link #getPackageName()}.
+             *
+             * <p>The default value is an empty string.
+             */
+            @NonNull
+            public Builder setPackageName(@NonNull String packageName) {
+                mPackageName = Objects.requireNonNull(packageName);
+                return this;
+            }
+
+            /** Returns a new {@link SystemRoutingSessionParams} instance. */
+            @NonNull
+            public SystemRoutingSessionParams build() {
+                return new SystemRoutingSessionParams(this);
+            }
+        }
+    }
 
     /**
      * Holds the formats to encode media data to be read from {@link MediaStreams}.
      *
      * @see MediaStreams
-     * @see #notifySystemMediaSessionCreated
-     * @hide
+     * @see #notifySystemRoutingSessionCreated
      */
-    // TODO: b/362507305 - Unhide once the implementation and CTS are in place.
     @FlaggedApi(Flags.FLAG_ENABLE_MIRRORING_IN_MEDIA_ROUTER_2)
     public static final class MediaStreamsFormats {
 
@@ -1169,29 +1238,25 @@
 
         /**
          * Returns the audio format to use for creating the {@link MediaStreams#getAudioRecord} to
-         * return from {@link #notifySystemMediaSessionCreated}.
-         *
-         * @hide
+         * return from {@link #notifySystemRoutingSessionCreated}. May be null if the session
+         * doesn't support system audio.
          */
-        // TODO: b/362507305 - Unhide once the implementation and CTS are in place.
         @FlaggedApi(Flags.FLAG_ENABLE_MIRRORING_IN_MEDIA_ROUTER_2)
+        @Nullable
         public AudioFormat getAudioFormat() {
             return mAudioFormat;
         }
 
         /**
          * Builder for {@link MediaStreamsFormats}
-         *
-         * @hide
          */
-        // TODO: b/362507305 - Unhide once the implementation and CTS are in place.
         @FlaggedApi(Flags.FLAG_ENABLE_MIRRORING_IN_MEDIA_ROUTER_2)
         public static final class Builder {
             private AudioFormat mAudioFormat;
 
             /**
              * Sets the audio format to use for creating the {@link MediaStreams#getAudioRecord} to
-             * return from {@link #notifySystemMediaSessionCreated}.
+             * return from {@link #notifySystemRoutingSessionCreated}.
              *
              * @param audioFormat the audio format
              * @return this builder
diff --git a/media/jni/Android.bp b/media/jni/Android.bp
index f09dc72..6b72173 100644
--- a/media/jni/Android.bp
+++ b/media/jni/Android.bp
@@ -25,8 +25,6 @@
     min_sdk_version: "",
 
     srcs: [
-        "android_media_ImageWriter.cpp",
-        "android_media_ImageReader.cpp",
         "android_media_JetPlayer.cpp",
         "android_media_MediaCrypto.cpp",
         "android_media_MediaCodec.cpp",
@@ -42,7 +40,6 @@
         "android_media_MediaProfiles.cpp",
         "android_media_MediaRecorder.cpp",
         "android_media_MediaSync.cpp",
-        "android_media_PublicFormatUtils.cpp",
         "android_media_ResampleInputStream.cpp",
         "android_media_Streams.cpp",
         "android_media_SyncParams.cpp",
@@ -64,7 +61,6 @@
         "libbinder",
         "libmedia",
         "libmedia_codeclist",
-        "libmedia_jni_utils",
         "libmedia_omx",
         "libmediametrics",
         "libmediadrm",
@@ -133,38 +129,6 @@
 }
 
 cc_library_shared {
-    name: "libmedia_jni_utils",
-    srcs: [
-        ":libgui_frame_event_aidl",
-        "android_media_Utils.cpp",
-    ],
-
-    header_libs: [
-        "libgui_headers",
-    ],
-
-    shared_libs: [
-        "liblog",
-        "libui",
-        "libutils",
-    ],
-
-    include_dirs: [
-        "system/media/camera/include",
-    ],
-
-    export_include_dirs: ["."],
-
-    cflags: [
-        "-Wall",
-        "-Werror",
-        "-Wno-error=deprecated-declarations",
-        "-Wunused",
-        "-Wunreachable-code",
-    ],
-}
-
-cc_library_shared {
     name: "libmedia_tv_tuner",
     min_sdk_version: "",
     srcs: [
diff --git a/media/jni/android_media_MediaPlayer.cpp b/media/jni/android_media_MediaPlayer.cpp
index a942300..9d197f4 100644
--- a/media/jni/android_media_MediaPlayer.cpp
+++ b/media/jni/android_media_MediaPlayer.cpp
@@ -1378,7 +1378,7 @@
     }
     jint* values = env->GetIntArrayElements(result, 0);
     for (unsigned int i = 0; i < deviceIds.size(); i++) {
-        values[i++] = static_cast<jint>(deviceIds[i]);
+        values[i] = static_cast<jint>(deviceIds[i]);
     }
     env->ReleaseIntArrayElements(result, values, 0);
     return result;
@@ -1476,8 +1476,6 @@
     return AndroidRuntime::registerNativeMethods(env,
                 "android/media/MediaPlayer", gMethods, NELEM(gMethods));
 }
-extern int register_android_media_ImageReader(JNIEnv *env);
-extern int register_android_media_ImageWriter(JNIEnv *env);
 extern int register_android_media_JetPlayer(JNIEnv *env);
 extern int register_android_media_Crypto(JNIEnv *env);
 extern int register_android_media_Drm(JNIEnv *env);
@@ -1490,7 +1488,6 @@
 extern int register_android_media_MediaMuxer(JNIEnv *env);
 extern int register_android_media_MediaRecorder(JNIEnv *env);
 extern int register_android_media_MediaSync(JNIEnv *env);
-extern int register_android_media_PublicFormatUtils(JNIEnv *env);
 extern int register_android_media_ResampleInputStream(JNIEnv *env);
 extern int register_android_media_MediaProfiles(JNIEnv *env);
 extern int register_android_mtp_MtpDatabase(JNIEnv *env);
@@ -1508,16 +1505,6 @@
     }
     assert(env != NULL);
 
-    if (register_android_media_ImageWriter(env) != JNI_OK) {
-        ALOGE("ERROR: ImageWriter native registration failed");
-        goto bail;
-    }
-
-    if (register_android_media_ImageReader(env) < 0) {
-        ALOGE("ERROR: ImageReader native registration failed");
-        goto bail;
-    }
-
     if (register_android_media_JetPlayer(env) < 0) {
         ALOGE("ERROR: JetPlayer native registration failed");
         goto bail;
@@ -1538,11 +1525,6 @@
         goto bail;
     }
 
-    if (register_android_media_PublicFormatUtils(env) < 0) {
-        ALOGE("ERROR: PublicFormatUtils native registration failed\n");
-        goto bail;
-    }
-
     if (register_android_media_ResampleInputStream(env) < 0) {
         ALOGE("ERROR: ResampleInputStream native registration failed\n");
         goto bail;
diff --git a/media/jni/android_media_MediaRecorder.cpp b/media/jni/android_media_MediaRecorder.cpp
index 643fc8a..2975a39 100644
--- a/media/jni/android_media_MediaRecorder.cpp
+++ b/media/jni/android_media_MediaRecorder.cpp
@@ -743,7 +743,7 @@
     }
     jint* values = env->GetIntArrayElements(result, 0);
     for (unsigned int i = 0; i < deviceIds.size(); i++) {
-        values[i++] = static_cast<jint>(deviceIds[i]);
+        values[i] = static_cast<jint>(deviceIds[i]);
     }
     env->ReleaseIntArrayElements(result, values, 0);
     return result;
diff --git a/nfc-extras/OWNERS b/nfc-extras/OWNERS
index 35e9713..2b82bc8 100644
--- a/nfc-extras/OWNERS
+++ b/nfc-extras/OWNERS
@@ -1,2 +1,2 @@
 # Bug component: 48448
-include platform/packages/apps/Nfc:/OWNERS
+include platform/packages/modules/Nfc:/OWNERS
diff --git a/nfc-non-updatable/OWNERS b/nfc-non-updatable/OWNERS
index f46dccd..47f209f 100644
--- a/nfc-non-updatable/OWNERS
+++ b/nfc-non-updatable/OWNERS
@@ -1,2 +1,2 @@
 # Bug component: 48448
-include platform/packages/apps/Nfc:/OWNERS
\ No newline at end of file
+include platform/packages/modules/Nfc:/OWNERS
\ No newline at end of file
diff --git a/nfc-non-updatable/java/android/nfc/cardemulation/ApduServiceInfo.java b/nfc-non-updatable/java/android/nfc/cardemulation/ApduServiceInfo.java
index e83b9f1..f2a68af 100644
--- a/nfc-non-updatable/java/android/nfc/cardemulation/ApduServiceInfo.java
+++ b/nfc-non-updatable/java/android/nfc/cardemulation/ApduServiceInfo.java
@@ -70,6 +70,11 @@
 public final class ApduServiceInfo implements Parcelable {
     private static final String TAG = "ApduServiceInfo";
 
+    private static final Pattern PLPF_PATTERN =
+            Pattern.compile("[0-9A-Fa-f]{2,}[0-9A-Fa-f,\\?,\\*\\.]*");
+    private static final Pattern PLF_PATTERN =
+            Pattern.compile("[0-9A-Fa-f]{2,}");
+
     /**
      * Component level {@link android.content.pm.PackageManager.Property PackageManager
      * .Property} for a system application to change its icon and label
@@ -472,7 +477,12 @@
                     boolean autoTransact = a.getBoolean(
                             com.android.internal.R.styleable.PollingLoopFilter_autoTransact,
                             false);
-                    if (!mOnHost && !autoTransact) {
+                    boolean isValidFilter = PLF_PATTERN.matcher(plf).matches()
+                            && plf.length() % 2 == 0;
+                    if (!isValidFilter) {
+                        Log.e(TAG, "Ignoring polling-loop-filter " + plf
+                                + " it is not a valid filter");
+                    } else if (!mOnHost && !autoTransact) {
                         Log.e(TAG, "Ignoring polling-loop-filter " + plf
                                 + " for offhost service that isn't autoTransact");
                     } else {
@@ -489,8 +499,12 @@
                     boolean autoTransact = a.getBoolean(
                             com.android.internal.R.styleable.PollingLoopFilter_autoTransact,
                             false);
-                    if (!mOnHost && !autoTransact) {
-                        Log.e(TAG, "Ignoring polling-loop-filter " + plf
+                    boolean isValidFilter = PLPF_PATTERN.matcher(plf).matches();
+                    if (!isValidFilter) {
+                        Log.e(TAG, "Ignoring polling-loop-pattern-filter " + plf
+                                + " it is not a valid pattern filter");
+                    } else if (!mOnHost && !autoTransact) {
+                        Log.e(TAG, "Ignoring polling-loop-pattern-filter " + plf
                                 + " for offhost service that isn't autoTransact");
                     } else {
                         mAutoTransactPatterns.put(Pattern.compile(plf), autoTransact);
@@ -814,10 +828,16 @@
     @FlaggedApi(Flags.FLAG_NFC_READ_POLLING_LOOP)
     public void addPollingLoopFilter(@NonNull String pollingLoopFilter,
             boolean autoTransact) {
+        if (!PLF_PATTERN.matcher(pollingLoopFilter).matches()
+                || pollingLoopFilter.length() % 2 != 0) {
+            throw new IllegalArgumentException(
+                    "Polling loop filter must contain an even number of characters 0-9 or A-F"
+            );
+        }
         if (!mOnHost && !autoTransact) {
             return;
         }
-        mAutoTransact.put(pollingLoopFilter, autoTransact);
+        mAutoTransact.put(pollingLoopFilter.toUpperCase(Locale.ROOT), autoTransact);
     }
 
     /**
@@ -842,10 +862,16 @@
     @FlaggedApi(Flags.FLAG_NFC_READ_POLLING_LOOP)
     public void addPollingLoopPatternFilter(@NonNull String pollingLoopPatternFilter,
             boolean autoTransact) {
+        if (!PLPF_PATTERN.matcher(pollingLoopPatternFilter).matches()) {
+            throw new IllegalArgumentException(
+                    "Polling loop pattern filter is invalid"
+            );
+        }
         if (!mOnHost && !autoTransact) {
             return;
         }
-        mAutoTransactPatterns.put(Pattern.compile(pollingLoopPatternFilter), autoTransact);
+        mAutoTransactPatterns.put(Pattern.compile(
+                pollingLoopPatternFilter.toUpperCase(Locale.ROOT)), autoTransact);
     }
 
     /**
diff --git a/omapi/OWNERS b/omapi/OWNERS
index 39c5c5b..375d643 100644
--- a/omapi/OWNERS
+++ b/omapi/OWNERS
@@ -1,2 +1,2 @@
 # Bug component: 456592
-include platform/packages/apps/Nfc:/OWNERS
+include platform/packages/modules/Nfc:/OWNERS
diff --git a/omapi/java/android/se/OWNERS b/omapi/java/android/se/OWNERS
index 39c5c5b..375d643 100644
--- a/omapi/java/android/se/OWNERS
+++ b/omapi/java/android/se/OWNERS
@@ -1,2 +1,2 @@
 # Bug component: 456592
-include platform/packages/apps/Nfc:/OWNERS
+include platform/packages/modules/Nfc:/OWNERS
diff --git a/omapi/java/android/se/omapi/OWNERS b/omapi/java/android/se/omapi/OWNERS
index 39c5c5b..375d643 100644
--- a/omapi/java/android/se/omapi/OWNERS
+++ b/omapi/java/android/se/omapi/OWNERS
@@ -1,2 +1,2 @@
 # Bug component: 456592
-include platform/packages/apps/Nfc:/OWNERS
+include platform/packages/modules/Nfc:/OWNERS
diff --git a/packages/CompanionDeviceManager/res/values-ar/strings.xml b/packages/CompanionDeviceManager/res/values-ar/strings.xml
index efbc6d9..5b6ea65 100644
--- a/packages/CompanionDeviceManager/res/values-ar/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ar/strings.xml
@@ -18,7 +18,7 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="4470785958457506021">"تطبيق \"مدير الجهاز المصاحب\""</string>
     <string name="confirmation_title" msgid="2244241995958340998">"‏هل تريد السماح لـ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; بالوصول إلى &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;؟"</string>
-    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"يُرجى التأكّد من أنّ <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> مفعَّل في <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>، وجعل <xliff:g id="PROFILE_NAME">%3$s</xliff:g> بالقرب منك."</string>
+    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"يُرجى التأكّد من تفعيل <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> في <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>، وإبقاء <xliff:g id="PROFILE_NAME">%3$s</xliff:g> بالقرب منك."</string>
     <string name="message_discovery_hard_timeout" msgid="677514663495711424">"لم يتم العثور على أي أجهزة. يُرجى إعادة المحاولة لاحقًا."</string>
     <string name="discovery_bluetooth" msgid="5693557668470016164">"البلوتوث"</string>
     <string name="discovery_wifi" msgid="1551782459721758773">"Wi-Fi"</string>
@@ -63,7 +63,7 @@
     <string name="permission_microphone" msgid="2152206421428732949">"الميكروفون"</string>
     <string name="permission_call_logs" msgid="5546761417694586041">"سجلّ المكالمات"</string>
     <string name="permission_nearby_devices" msgid="7530973297737123481">"الأجهزة المجاورة"</string>
-    <string name="permission_media_routing_control" msgid="5498639511586715253">"تغيير جهاز إخراج الوسائط"</string>
+    <string name="permission_media_routing_control" msgid="5498639511586715253">"تغيير جهاز بث الوسائط"</string>
     <string name="permission_storage" msgid="6831099350839392343">"الصور والوسائط"</string>
     <string name="permission_notifications" msgid="4099418516590632909">"الإشعارات"</string>
     <string name="permission_phone_summary" msgid="8246321093970051702">"إجراء المكالمات الهاتفية وإدارتها"</string>
@@ -77,7 +77,7 @@
     <string name="permission_notifications_summary" msgid="2272810466047367030">"‏• قراءة كل الإشعارات بما فيها المعلومات، مثل جهات الاتصال والرسائل والصور&lt;br/&gt;• إرسال الإشعارات&lt;br/&gt;&lt;br/&gt;يمكنك إدارة الإذن الممنوح لهذا التطبيق بقراءة الإشعارات وإرسالها في أي وقت من خلال الإعدادات &gt; الإشعارات."</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_media_routing_control_summary" msgid="2714631092321412250">"يتيح لك هذا الإذن الاطّلاع على مجموعة من الأجهزة المتاحة وتحديد الجهاز المسموح له بتشغيل الصوت أو الفيديو أو بثّهما من التطبيقات الأخرى."</string>
-    <string name="device_type" product="default" msgid="8268703872070046263">"هاتف"</string>
+    <string name="device_type" product="default" msgid="8268703872070046263">"الهاتف"</string>
     <string name="device_type" product="tablet" msgid="5038791954983067774">"جهاز لوحي"</string>
     <string name="device_type" product="tv" msgid="5355611506659405636">"تلفزيون"</string>
     <string name="device_type" product="device" msgid="1526125965802507189">"جهاز"</string>
diff --git a/packages/CompanionDeviceManager/res/values-b+sr+Latn/strings.xml b/packages/CompanionDeviceManager/res/values-b+sr+Latn/strings.xml
index ab52c39..dfe3cbe 100644
--- a/packages/CompanionDeviceManager/res/values-b+sr+Latn/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-b+sr+Latn/strings.xml
@@ -18,16 +18,16 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="4470785958457506021">"Menadžer pridruženog uređaja"</string>
     <string name="confirmation_title" msgid="2244241995958340998">"Dozvolite da aplikacija &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; pristupa uređaju &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Uverite se da je za <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> uključen <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> i da u blizini imate <xliff:g id="PROFILE_NAME">%3$s</xliff:g>."</string>
+    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Uverite se da je na <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> uključen <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> i da u blizini imate <xliff:g id="PROFILE_NAME">%3$s</xliff:g>."</string>
     <string name="message_discovery_hard_timeout" msgid="677514663495711424">"Nije pronađen nijedan uređaj. Probajte ponovo kasnije."</string>
     <string name="discovery_bluetooth" msgid="5693557668470016164">"Bluetooth"</string>
     <string name="discovery_wifi" msgid="1551782459721758773">"WiFi"</string>
     <string name="discovery_mixed" msgid="7071466134150760127">"Bluetooth i WiFi"</string>
     <string name="profile_name_watch" msgid="576290739483672360">"sat"</string>
     <string name="chooser_title_non_profile" msgid="6035023914517087400">"Odaberite uređaj kojim će upravljati aplikacija &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="chooser_title" msgid="2235819929238267637">"Odaberite profil <xliff:g id="PROFILE_NAME">%1$s</xliff:g> koji želite da podesite"</string>
+    <string name="chooser_title" msgid="2235819929238267637">"Odaberite <xliff:g id="PROFILE_NAME">%1$s</xliff:g> koji želite da podesite"</string>
     <string name="single_device_title" msgid="4199861437545438606">"Traži se <xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
-    <string name="summary_watch" msgid="8134580124808507407">"Ovoj aplikaciji će biti dozvoljeno da sinhronizuje podatke, poput imena pozivaoca, i pristupa tim dozvolama na uređaju <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
+    <string name="summary_watch" msgid="8134580124808507407">"Ovoj aplikaciji će biti dozvoljeno da sinhronizuje podatke, poput imena pozivaoca, i pristupa sledećim dozvolama na <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Želite li da dozvolite da &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; upravlja uređajem &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"uređaj"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Ovoj aplikaciji će biti dozvoljeno da pristupa ovim dozvolama na uređaju <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
diff --git a/packages/CompanionDeviceManager/res/values-be/strings.xml b/packages/CompanionDeviceManager/res/values-be/strings.xml
index 884101f..6e5e1b5 100644
--- a/packages/CompanionDeviceManager/res/values-be/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-be/strings.xml
@@ -18,15 +18,15 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="4470785958457506021">"Менеджар спадарожнай прылады"</string>
     <string name="confirmation_title" msgid="2244241995958340998">"Дазволіць праграме &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; доступ да прылады &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Упэўніцеся, што на гэтай прыладзе (<xliff:g id="DEVICE_TYPE">%1$s</xliff:g>) уключаны <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g>, і трымайце <xliff:g id="PROFILE_NAME">%3$s</xliff:g> паблізу."</string>
+    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Упэўніцеся, што на гэтай прыладзе (<xliff:g id="DEVICE_TYPE">%1$s</xliff:g>) уключаны <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g>, а <xliff:g id="PROFILE_NAME">%3$s</xliff:g> знаходзіцца паблізу."</string>
     <string name="message_discovery_hard_timeout" msgid="677514663495711424">"Прылады не знойдзены. Паўтарыце спробу пазней."</string>
     <string name="discovery_bluetooth" msgid="5693557668470016164">"Bluetooth"</string>
     <string name="discovery_wifi" msgid="1551782459721758773">"Wi-Fi"</string>
     <string name="discovery_mixed" msgid="7071466134150760127">"Bluetooth і Wi-Fi"</string>
     <string name="profile_name_watch" msgid="576290739483672360">"гадзіннік"</string>
     <string name="chooser_title_non_profile" msgid="6035023914517087400">"Выберыце прыладу (<xliff:g id="APP_NAME">%1$s</xliff:g>), якой будзе кіраваць праграма &lt;strong&gt;&lt;/strong&gt;"</string>
-    <string name="chooser_title" msgid="2235819929238267637">"Выберыце імя <xliff:g id="PROFILE_NAME">%1$s</xliff:g> для наладжвання"</string>
-    <string name="single_device_title" msgid="4199861437545438606">"<xliff:g id="PROFILE_NAME">%1$s</xliff:g>: ідзе пошук"</string>
+    <string name="chooser_title" msgid="2235819929238267637">"<xliff:g id="PROFILE_NAME">%1$s</xliff:g>: выберыце, каб наладзіць"</string>
+    <string name="single_device_title" msgid="4199861437545438606">"Ідзе пошук: <xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
     <string name="summary_watch" msgid="8134580124808507407">"Гэта праграма зможа сінхранізаваць інфармацыю (напрыклад, імя таго, хто звоніць) на вашай прыладзе тыпу \"<xliff:g id="DEVICE_TYPE">%1$s</xliff:g>\" і атрымае наступныя дазволы"</string>
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Дазволіць праграме &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; кіраваць прыладай &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"прылада"</string>
@@ -63,7 +63,7 @@
     <string name="permission_microphone" msgid="2152206421428732949">"Мікрафон"</string>
     <string name="permission_call_logs" msgid="5546761417694586041">"Журналы выклікаў"</string>
     <string name="permission_nearby_devices" msgid="7530973297737123481">"Прылады паблізу"</string>
-    <string name="permission_media_routing_control" msgid="5498639511586715253">"Змяніць прыладу вываду медыя"</string>
+    <string name="permission_media_routing_control" msgid="5498639511586715253">"Змяненне прылады вываду медыя"</string>
     <string name="permission_storage" msgid="6831099350839392343">"Фота і медыяфайлы"</string>
     <string name="permission_notifications" msgid="4099418516590632909">"Апавяшчэнні"</string>
     <string name="permission_phone_summary" msgid="8246321093970051702">"Ажыццяўленне тэлефонных выклікаў і кіраванне імі"</string>
diff --git a/packages/CompanionDeviceManager/res/values-bs/strings.xml b/packages/CompanionDeviceManager/res/values-bs/strings.xml
index e7f9b14..bc74b1a 100644
--- a/packages/CompanionDeviceManager/res/values-bs/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-bs/strings.xml
@@ -25,7 +25,7 @@
     <string name="discovery_mixed" msgid="7071466134150760127">"Bluetooth i WiFi"</string>
     <string name="profile_name_watch" msgid="576290739483672360">"sat"</string>
     <string name="chooser_title_non_profile" msgid="6035023914517087400">"Odaberite uređaj kojim će upravljati aplikacija &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="chooser_title" msgid="2235819929238267637">"Odaberite <xliff:g id="PROFILE_NAME">%1$s</xliff:g> da postavite"</string>
+    <string name="chooser_title" msgid="2235819929238267637">"Odaberite <xliff:g id="PROFILE_NAME">%1$s</xliff:g> za postavljanje"</string>
     <string name="single_device_title" msgid="4199861437545438606">"Traži se <xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
     <string name="summary_watch" msgid="8134580124808507407">"Aplikaciji će biti dozvoljeno da sinhronizira informacije, kao što je ime osobe koja upućuje poziv, i pristupa ovim odobrenjima koje sadržava vaš <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Dozvoliti aplikaciji &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; da upravlja uređajem &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
diff --git a/packages/CompanionDeviceManager/res/values-da/strings.xml b/packages/CompanionDeviceManager/res/values-da/strings.xml
index 08a1ae1..1062af8 100644
--- a/packages/CompanionDeviceManager/res/values-da/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-da/strings.xml
@@ -26,7 +26,7 @@
     <string name="profile_name_watch" msgid="576290739483672360">"ur"</string>
     <string name="chooser_title_non_profile" msgid="6035023914517087400">"Vælg en enhed, som skal administreres af &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;"</string>
     <string name="chooser_title" msgid="2235819929238267637">"Vælg en <xliff:g id="PROFILE_NAME">%1$s</xliff:g>, som du vil konfigurere"</string>
-    <string name="single_device_title" msgid="4199861437545438606">"Søger efter et <xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
+    <string name="single_device_title" msgid="4199861437545438606">"Søger efter <xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
     <string name="summary_watch" msgid="8134580124808507407">"Denne app får tilladelse til at synkronisere oplysninger, f.eks. navne på dem, der ringer, og adgang til disse tilladelser på din <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Vil du tillade, at &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; administrerer &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"enhed"</string>
diff --git a/packages/CompanionDeviceManager/res/values-de/strings.xml b/packages/CompanionDeviceManager/res/values-de/strings.xml
index 30528c5..6f8a902 100644
--- a/packages/CompanionDeviceManager/res/values-de/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-de/strings.xml
@@ -18,7 +18,7 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="4470785958457506021">"Begleitgerät-Manager"</string>
     <string name="confirmation_title" msgid="2244241995958340998">"Zulassen, dass &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; auf &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; zugreifen darf?"</string>
-    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Achte darauf, dass die Option „<xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g>“ auf diesem <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> aktiviert ist und dein Begleitgerät vom Typ „<xliff:g id="PROFILE_NAME">%3$s</xliff:g>“ in der Nähe ist."</string>
+    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"<xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> muss auf diesem <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> aktiviert und dein Gerät „<xliff:g id="PROFILE_NAME">%3$s</xliff:g>“ in der Nähe sein."</string>
     <string name="message_discovery_hard_timeout" msgid="677514663495711424">"Keine Geräte gefunden. Bitte versuche es später noch einmal."</string>
     <string name="discovery_bluetooth" msgid="5693557668470016164">"Bluetooth"</string>
     <string name="discovery_wifi" msgid="1551782459721758773">"WLAN"</string>
@@ -26,7 +26,7 @@
     <string name="profile_name_watch" msgid="576290739483672360">"Smartwatch"</string>
     <string name="chooser_title_non_profile" msgid="6035023914517087400">"Gerät auswählen, das von &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; verwaltet werden soll"</string>
     <string name="chooser_title" msgid="2235819929238267637">"<xliff:g id="PROFILE_NAME">%1$s</xliff:g> zum Einrichten auswählen"</string>
-    <string name="single_device_title" msgid="4199861437545438606">"Nach einem Begleitgerät vom Typ „<xliff:g id="PROFILE_NAME">%1$s</xliff:g>“ suchen"</string>
+    <string name="single_device_title" msgid="4199861437545438606">"<xliff:g id="PROFILE_NAME">%1$s</xliff:g> wird gesucht"</string>
     <string name="summary_watch" msgid="8134580124808507407">"Diese App darf dann Daten wie den Namen eines Anrufers synchronisieren und auf diese Berechtigungen auf deinem Gerät (<xliff:g id="DEVICE_TYPE">%1$s</xliff:g>) zugreifen"</string>
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Zulassen, dass &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; das Gerät &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; verwalten darf?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"Gerät"</string>
diff --git a/packages/CompanionDeviceManager/res/values-el/strings.xml b/packages/CompanionDeviceManager/res/values-el/strings.xml
index cffb365..c90bf21 100644
--- a/packages/CompanionDeviceManager/res/values-el/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-el/strings.xml
@@ -18,16 +18,16 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="4470785958457506021">"Διαχείριση συνοδευτικής εφαρμογής"</string>
     <string name="confirmation_title" msgid="2244241995958340998">"Να επιτρέπεται στην εφαρμογή &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; να έχει πρόσβαση στη συσκευή &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;;"</string>
-    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Βεβαιωθείτε ότι αυτή η συσκευή <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> έχει ενεργοποιημένο το <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> και κρατήστε τη συσκευή <xliff:g id="PROFILE_NAME">%3$s</xliff:g> κοντά."</string>
+    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Βεβαιωθείτε ότι αυτό το <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> έχει ενεργοποιημένο το <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> και κρατήστε το <xliff:g id="PROFILE_NAME">%3$s</xliff:g> κοντά."</string>
     <string name="message_discovery_hard_timeout" msgid="677514663495711424">"Δεν βρέθηκαν συσκευές. Δοκιμάστε ξανά αργότερα."</string>
     <string name="discovery_bluetooth" msgid="5693557668470016164">"Bluetooth"</string>
     <string name="discovery_wifi" msgid="1551782459721758773">"Wi-Fi"</string>
     <string name="discovery_mixed" msgid="7071466134150760127">"Bluetooth και Wi-Fi"</string>
     <string name="profile_name_watch" msgid="576290739483672360">"ρολόι"</string>
     <string name="chooser_title_non_profile" msgid="6035023914517087400">"Επιλέξτε μια συσκευή για διαχείριση μέσω της εφαρμογής &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="chooser_title" msgid="2235819929238267637">"Επιλέξτε ένα προφίλ <xliff:g id="PROFILE_NAME">%1$s</xliff:g> για ρύθμιση"</string>
+    <string name="chooser_title" msgid="2235819929238267637">"Επιλέξτε ένα <xliff:g id="PROFILE_NAME">%1$s</xliff:g> για ρύθμιση"</string>
     <string name="single_device_title" msgid="4199861437545438606">"Αναζήτηση για <xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
-    <string name="summary_watch" msgid="8134580124808507407">"Αυτή η εφαρμογή θα μπορεί να συγχρονίζει πληροφορίες, όπως το όνομα ενός ατόμου που σας καλεί, και να αποκτά πρόσβαση σε αυτές τις άδειες στη συσκευή <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
+    <string name="summary_watch" msgid="8134580124808507407">"Αυτή η εφαρμογή θα μπορεί να συγχρονίζει πληροφορίες, όπως το όνομα ενός ατόμου που σας καλεί, και να αποκτά πρόσβαση σε αυτές τις άδειες στο <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Να επιτρέπεται στην εφαρμογή &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; να διαχειρίζεται τη συσκευή &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; ;"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"συσκευή"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Αυτή η εφαρμογή θα μπορεί να έχει πρόσβαση σε αυτές τις άδειες στη συσκευή <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
diff --git a/packages/CompanionDeviceManager/res/values-es/strings.xml b/packages/CompanionDeviceManager/res/values-es/strings.xml
index ac8c79a..a309d7c 100644
--- a/packages/CompanionDeviceManager/res/values-es/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-es/strings.xml
@@ -46,7 +46,7 @@
     <string name="summary_sensor_device_streaming" msgid="3413105061195145547">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> tendrá acceso a todo lo que se reproduzca en tu <xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_2">%1$s</xliff:g> podrá emitir audio en <xliff:g id="DEVICE_NAME_3">%3$s</xliff:g> hasta que quites el acceso a este permiso."</string>
     <string name="helper_summary_sensor_device_streaming" msgid="8860174545653786353">"<xliff:g id="APP_NAME">%1$s</xliff:g> está pidiendo permiso en nombre de <xliff:g id="DEVICE_NAME">%2$s</xliff:g> para emitir audio y funciones del sistema en otros dispositivos tuyos."</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>
+    <string name="summary_generic" msgid="1761976003668044801">"Esta aplicación podrá sincronizar información, como el nombre de la persona que llama, entre tu teléfono y el dispositivo que elijas"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Permitir"</string>
     <string name="consent_no" msgid="2640796915611404382">"No permitir"</string>
     <string name="consent_cancel" msgid="5655005528379285841">"Cancelar"</string>
diff --git a/packages/CompanionDeviceManager/res/values-et/strings.xml b/packages/CompanionDeviceManager/res/values-et/strings.xml
index 9c22847..91d1b69 100644
--- a/packages/CompanionDeviceManager/res/values-et/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-et/strings.xml
@@ -18,16 +18,16 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="4470785958457506021">"Kaasseadme haldur"</string>
     <string name="confirmation_title" msgid="2244241995958340998">"Kas anda rakendusele &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; juurdepääs seadmele &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Veenduge, et seadmes <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> oleks <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> sisse lülitatud, ja hoidke oma seade <xliff:g id="PROFILE_NAME">%3$s</xliff:g> läheduses."</string>
+    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Veenduge, et seadmes <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> oleks <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> sisse lülitatud, ja hoidke oma <xliff:g id="PROFILE_NAME">%3$s</xliff:g> läheduses."</string>
     <string name="message_discovery_hard_timeout" msgid="677514663495711424">"Seadmeid ei leitud. Proovige hiljem uuesti."</string>
     <string name="discovery_bluetooth" msgid="5693557668470016164">"Bluetooth"</string>
     <string name="discovery_wifi" msgid="1551782459721758773">"WiFi"</string>
     <string name="discovery_mixed" msgid="7071466134150760127">"Bluetooth ja WiFi"</string>
     <string name="profile_name_watch" msgid="576290739483672360">"käekell"</string>
-    <string name="chooser_title_non_profile" msgid="6035023914517087400">"Valige seade, mida haldab rakendus &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="chooser_title" msgid="2235819929238267637">"Valige <xliff:g id="PROFILE_NAME">%1$s</xliff:g>, mis seadistada"</string>
-    <string name="single_device_title" msgid="4199861437545438606">"Seadme <xliff:g id="PROFILE_NAME">%1$s</xliff:g> otsimine"</string>
-    <string name="summary_watch" msgid="8134580124808507407">"Sellel rakendusel lubatakse sünkroonida teavet (nt helistaja nime) ja antakse juurdepääs nendele lubadele, mille asukoht on teie <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
+    <string name="chooser_title_non_profile" msgid="6035023914517087400">"Valige seade, mida rakendus &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; hakkab haldama"</string>
+    <string name="chooser_title" msgid="2235819929238267637">"Valige seadistatav <xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
+    <string name="single_device_title" msgid="4199861437545438606">"Otsimine: <xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
+    <string name="summary_watch" msgid="8134580124808507407">"Sellel rakendusel lubatakse sünkroonida teavet (nt helistaja nime) ja antakse juurdepääs nendele teie seadme <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> lubadele."</string>
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Lubage rakendusel &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; hallata seadet &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"seade"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Sellel rakendusel lubatakse juurde pääseda nendele lubadele, mille asukoht on teie <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
@@ -46,7 +46,7 @@
     <string name="summary_sensor_device_streaming" msgid="3413105061195145547">"Rakendus <xliff:g id="APP_NAME_0">%1$s</xliff:g> saab juurdepääsu kõigele, mida teie seadmes <xliff:g id="DEVICE_NAME_1">%3$s</xliff:g> esitatakse.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_2">%1$s</xliff:g> saab edastada heli seadmesse <xliff:g id="DEVICE_NAME_3">%3$s</xliff:g>, kuni selle loa eemaldate."</string>
     <string name="helper_summary_sensor_device_streaming" msgid="8860174545653786353">"<xliff:g id="APP_NAME">%1$s</xliff:g> taotleb teie seadme <xliff:g id="DEVICE_NAME">%2$s</xliff:g> nimel luba teie seadmete vahel heli ja süsteemifunktsioonide edastamiseks."</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>
+    <string name="summary_generic" msgid="1761976003668044801">"See rakendus saab sünkroonida teavet (näiteks helistaja nime) teie telefoni ja valitud seadme vahel."</string>
     <string name="consent_yes" msgid="8344487259618762872">"Luba"</string>
     <string name="consent_no" msgid="2640796915611404382">"Ära luba"</string>
     <string name="consent_cancel" msgid="5655005528379285841">"Tühista"</string>
diff --git a/packages/CompanionDeviceManager/res/values-fa/strings.xml b/packages/CompanionDeviceManager/res/values-fa/strings.xml
index 2f4f938..048bf3e 100644
--- a/packages/CompanionDeviceManager/res/values-fa/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-fa/strings.xml
@@ -24,7 +24,7 @@
     <string name="discovery_wifi" msgid="1551782459721758773">"Wi-Fi"</string>
     <string name="discovery_mixed" msgid="7071466134150760127">"‏بلوتوث و Wi-Fi"</string>
     <string name="profile_name_watch" msgid="576290739483672360">"ساعت"</string>
-    <string name="chooser_title_non_profile" msgid="6035023914517087400">"‏انتخاب دستگاه برای مدیریت کردن با &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;"</string>
+    <string name="chooser_title_non_profile" msgid="6035023914517087400">"‏انتخاب دستگاه برای مدیریت شدن توسط &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;"</string>
     <string name="chooser_title" msgid="2235819929238267637">"انتخاب <xliff:g id="PROFILE_NAME">%1$s</xliff:g> برای راه‌اندازی"</string>
     <string name="single_device_title" msgid="4199861437545438606">"درحال یافتن <xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
     <string name="summary_watch" msgid="8134580124808507407">"به این برنامه اجازه داده می‌شود اطلاعاتی مثل نام تماس‌گیرنده را همگام‌سازی کند و به این اجازه‌ها در <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> شما دسترسی داشته باشد"</string>
diff --git a/packages/CompanionDeviceManager/res/values-fi/strings.xml b/packages/CompanionDeviceManager/res/values-fi/strings.xml
index be4076a..3f4a9d3 100644
--- a/packages/CompanionDeviceManager/res/values-fi/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-fi/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="app_label" msgid="4470785958457506021">"Companion Device Manager"</string>
-    <string name="confirmation_title" msgid="2244241995958340998">"Sallitaanko, että soellus (&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;) saa pääsyn laitteeseen: &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
+    <string name="confirmation_title" msgid="2244241995958340998">"Sallitaanko, että sovellus (&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;) saa pääsyn laitteeseen: &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Varmista, että <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> on päällä laitteella (<xliff:g id="DEVICE_TYPE">%1$s</xliff:g>), ja pidä <xliff:g id="PROFILE_NAME">%3$s</xliff:g> lähellä."</string>
     <string name="message_discovery_hard_timeout" msgid="677514663495711424">"Laitteita ei löydy. Yritä myöhemmin uudelleen."</string>
     <string name="discovery_bluetooth" msgid="5693557668470016164">"Bluetooth"</string>
diff --git a/packages/CompanionDeviceManager/res/values-fr-rCA/strings.xml b/packages/CompanionDeviceManager/res/values-fr-rCA/strings.xml
index 0aa462b..52b136c 100644
--- a/packages/CompanionDeviceManager/res/values-fr-rCA/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-fr-rCA/strings.xml
@@ -18,15 +18,15 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="4470785958457506021">"Gestionnaire d\'appareil compagnon"</string>
     <string name="confirmation_title" msgid="2244241995958340998">"Autoriser l\'appli &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; à accéder à &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Assurez-vous que le <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> est activé sur cet appareil (<xliff:g id="DEVICE_TYPE">%1$s</xliff:g>) et gardez votre <xliff:g id="PROFILE_NAME">%3$s</xliff:g> à proximité."</string>
+    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Assurez-vous que le <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> est activé sur votre <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> et gardez votre <xliff:g id="PROFILE_NAME">%3$s</xliff:g> à proximité."</string>
     <string name="message_discovery_hard_timeout" msgid="677514663495711424">"Aucun appareil détecté. Veuillez réessayer plus tard."</string>
     <string name="discovery_bluetooth" msgid="5693557668470016164">"Bluetooth"</string>
     <string name="discovery_wifi" msgid="1551782459721758773">"Wi-Fi"</string>
     <string name="discovery_mixed" msgid="7071466134150760127">"Bluetooth et Wi-Fi"</string>
     <string name="profile_name_watch" msgid="576290739483672360">"montre"</string>
     <string name="chooser_title_non_profile" msgid="6035023914517087400">"Choisir un appareil qui sera géré par &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="chooser_title" msgid="2235819929238267637">"Choisir un appareil (<xliff:g id="PROFILE_NAME">%1$s</xliff:g>) pour le configurer"</string>
-    <string name="single_device_title" msgid="4199861437545438606">"À la recherche de l\'appareil suivant : <xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
+    <string name="chooser_title" msgid="2235819929238267637">"Choisir votre <xliff:g id="PROFILE_NAME">%1$s</xliff:g> à configurer"</string>
+    <string name="single_device_title" msgid="4199861437545438606">"Recherche de votre <xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
     <string name="summary_watch" msgid="8134580124808507407">"Cette appli sera autorisée à synchroniser des informations, comme le nom de l\'appelant, et à accéder à ces autorisations sur votre <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Autoriser &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; à gérer &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"appareil"</string>
diff --git a/packages/CompanionDeviceManager/res/values-gu/strings.xml b/packages/CompanionDeviceManager/res/values-gu/strings.xml
index d3db96e..9df54da 100644
--- a/packages/CompanionDeviceManager/res/values-gu/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-gu/strings.xml
@@ -18,7 +18,7 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="4470785958457506021">"કમ્પેનિયન ડિવાઇસ મેનેજર"</string>
     <string name="confirmation_title" msgid="2244241995958340998">"શું &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;ને ઍક્સેસ કરવા માટે, &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ઍપને મંજૂરી આપીએ?"</string>
-    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"ખાતરી કરો કે આ <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> દ્વારા <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> ચાલુ કરવામાં આવી છે અને તમારી <xliff:g id="PROFILE_NAME">%3$s</xliff:g> નજીકમાં રાખો."</string>
+    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"ખાતરી કરો કે આ <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> દ્વારા <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> ચાલુ કરવામાં આવ્યું છે અને તમારી <xliff:g id="PROFILE_NAME">%3$s</xliff:g> નજીકમાં રાખો."</string>
     <string name="message_discovery_hard_timeout" msgid="677514663495711424">"કોઈ ડિવાઇસ મળ્યું નથી. કૃપા કરીને થોડા સમય પછી ફરી પ્રયાસ કરો."</string>
     <string name="discovery_bluetooth" msgid="5693557668470016164">"બ્લૂટૂથ"</string>
     <string name="discovery_wifi" msgid="1551782459721758773">"વાઇ-ફાઇ"</string>
diff --git a/packages/CompanionDeviceManager/res/values-hi/strings.xml b/packages/CompanionDeviceManager/res/values-hi/strings.xml
index 2d38a00..fe04cbd 100644
--- a/packages/CompanionDeviceManager/res/values-hi/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-hi/strings.xml
@@ -17,8 +17,8 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="4470785958457506021">"कंपैनियन डिवाइस मैनेजर"</string>
-    <string name="confirmation_title" msgid="2244241995958340998">"क्या &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; को ऐक्सेस करने के लिए &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ऐप्लिकेशन को अनुमति देनी है?"</string>
-    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"पक्का करें कि इस <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> का <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> चालू हो और <xliff:g id="PROFILE_NAME">%3$s</xliff:g> आपके आस-पास हो."</string>
+    <string name="confirmation_title" msgid="2244241995958340998">"क्या &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ऐप्लिकेशन को &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; ऐक्सेस करने की अनुमति देनी है?"</string>
+    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"पक्का करें कि इस <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> का <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> चालू हो और <xliff:g id="PROFILE_NAME">%3$s</xliff:g> आस-पास हो."</string>
     <string name="message_discovery_hard_timeout" msgid="677514663495711424">"कोई डिवाइस नहीं मिला. कृपया बाद में कोशिश करें."</string>
     <string name="discovery_bluetooth" msgid="5693557668470016164">"ब्लूटूथ"</string>
     <string name="discovery_wifi" msgid="1551782459721758773">"वाई-फ़ाई"</string>
@@ -27,7 +27,7 @@
     <string name="chooser_title_non_profile" msgid="6035023914517087400">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; से मैनेज किया जाने वाला डिवाइस चुनें"</string>
     <string name="chooser_title" msgid="2235819929238267637">"सेट अप करने के लिए कोई <xliff:g id="PROFILE_NAME">%1$s</xliff:g> चुनें"</string>
     <string name="single_device_title" msgid="4199861437545438606">"<xliff:g id="PROFILE_NAME">%1$s</xliff:g> को ढूंढा जा रहा है"</string>
-    <string name="summary_watch" msgid="8134580124808507407">"यह ऐप्लिकेशन, आपके <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> पर इन अनुमतियों को ऐक्सेस करने के साथ-साथ कॉल करने वाले व्यक्ति के नाम जैसी जानकारी सिंक कर पाएगा"</string>
+    <string name="summary_watch" msgid="8134580124808507407">"यह ऐप्लिकेशन, कॉल करने वाले व्यक्ति के नाम जैसी जानकारी सिंक करने के साथ-साथ, आपके <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> पर इन अनुमतियों को ऐक्सेस कर पाएगा"</string>
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"क्या &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; को &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; मैनेज करने की अनुमति देनी है?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"डिवाइस"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"यह ऐप्लिकेशन, आपके <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> पर इन अनुमतियों को ऐक्सेस कर पाएगा"</string>
@@ -63,7 +63,7 @@
     <string name="permission_microphone" msgid="2152206421428732949">"माइक्रोफ़ोन"</string>
     <string name="permission_call_logs" msgid="5546761417694586041">"कॉल लॉग"</string>
     <string name="permission_nearby_devices" msgid="7530973297737123481">"आस-पास मौजूद डिवाइस"</string>
-    <string name="permission_media_routing_control" msgid="5498639511586715253">"मीडिया आउटपुट में बदलाव करे"</string>
+    <string name="permission_media_routing_control" msgid="5498639511586715253">"मीडिया आउटपुट में बदलाव"</string>
     <string name="permission_storage" msgid="6831099350839392343">"फ़ोटो और मीडिया"</string>
     <string name="permission_notifications" msgid="4099418516590632909">"सूचनाएं"</string>
     <string name="permission_phone_summary" msgid="8246321093970051702">"फ़ोन कॉल करने और उन्हें मैनेज करने की अनुमति दें"</string>
diff --git a/packages/CompanionDeviceManager/res/values-hu/strings.xml b/packages/CompanionDeviceManager/res/values-hu/strings.xml
index 8b11dac..9fb92c3 100644
--- a/packages/CompanionDeviceManager/res/values-hu/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-hu/strings.xml
@@ -18,16 +18,16 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="4470785958457506021">"Társeszközök kezelője"</string>
     <string name="confirmation_title" msgid="2244241995958340998">"Engedélyezi a(z) &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; alkalmazás számára, hogy hozzáférjen a következőhöz: &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Győződjön meg arról, hogy a <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> be van kapcsolva ezen a(z) <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> eszközön, és hogy a(z) <xliff:g id="PROFILE_NAME">%3$s</xliff:g> eszköz a közelben van."</string>
+    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Győződjön meg arról, hogy a <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> be van kapcsolva a(z) <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>, és hogy a(z) <xliff:g id="PROFILE_NAME">%3$s</xliff:g> a közelben van."</string>
     <string name="message_discovery_hard_timeout" msgid="677514663495711424">"Nem található eszköz. Próbálja újra később."</string>
     <string name="discovery_bluetooth" msgid="5693557668470016164">"Bluetooth"</string>
     <string name="discovery_wifi" msgid="1551782459721758773">"Wi-Fi"</string>
     <string name="discovery_mixed" msgid="7071466134150760127">"Bluetooth és Wi-Fi"</string>
     <string name="profile_name_watch" msgid="576290739483672360">"óra"</string>
     <string name="chooser_title_non_profile" msgid="6035023914517087400">"A(z) &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; alkalmazással kezelni kívánt eszköz kiválasztása"</string>
-    <string name="chooser_title" msgid="2235819929238267637">"Válassza ki a beállítani kívánt <xliff:g id="PROFILE_NAME">%1$s</xliff:g> nevet."</string>
+    <string name="chooser_title" msgid="2235819929238267637">"Válassza ki a beállítani kívánt <xliff:g id="PROFILE_NAME">%1$s</xliff:g> nevét."</string>
     <string name="single_device_title" msgid="4199861437545438606">"Keresés – <xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
-    <string name="summary_watch" msgid="8134580124808507407">"Ez az alkalmazás képes lesz szinkronizálni információkat (például a hívó fél nevét), és hozzáférhet majd ezekhez az engedélyekhez a következőn: <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
+    <string name="summary_watch" msgid="8134580124808507407">"Ez az alkalmazás képes lesz szinkronizálni információkat (például a hívó fél nevét), és hozzáférhet majd ezekhez az engedélyekhez a <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Engedélyezi, hogy a(z) &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; kezelje a következő eszközt: &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"eszköz"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Az alkalmazás hozzáférhet majd ezekhez az engedélyekhez a következőn: <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
diff --git a/packages/CompanionDeviceManager/res/values-hy/strings.xml b/packages/CompanionDeviceManager/res/values-hy/strings.xml
index 9d45928..b398b94 100644
--- a/packages/CompanionDeviceManager/res/values-hy/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-hy/strings.xml
@@ -18,15 +18,15 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="4470785958457506021">"Companion Device Manager"</string>
     <string name="confirmation_title" msgid="2244241995958340998">"Թույլատրե՞լ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; հավելվածին կառավարել &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; սարքը"</string>
-    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Համոզվեք, որ այս <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> սարքի <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g>-ը միացված է, և ձեր <xliff:g id="PROFILE_NAME">%3$s</xliff:g>-ը մոտ պահեք։"</string>
+    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Համոզվեք, որ այս <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>ի <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g>-ը միացված է, և ձեր <xliff:g id="PROFILE_NAME">%3$s</xliff:g>ը մոտ պահեք։"</string>
     <string name="message_discovery_hard_timeout" msgid="677514663495711424">"Սարքեր չեն գտնվել։ Փորձեք ավելի ուշ։"</string>
     <string name="discovery_bluetooth" msgid="5693557668470016164">"Bluetooth"</string>
     <string name="discovery_wifi" msgid="1551782459721758773">"Wi-Fi"</string>
     <string name="discovery_mixed" msgid="7071466134150760127">"Bluetooth և Wi-Fi"</string>
     <string name="profile_name_watch" msgid="576290739483672360">"ժամացույց"</string>
     <string name="chooser_title_non_profile" msgid="6035023914517087400">"Ընտրեք սարքը, որը պետք է կառավարվի &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; հավելվածի միջոցով"</string>
-    <string name="chooser_title" msgid="2235819929238267637">"Կարգավորելու համար ընտրեք <xliff:g id="PROFILE_NAME">%1$s</xliff:g>ը"</string>
-    <string name="single_device_title" msgid="4199861437545438606">"<xliff:g id="PROFILE_NAME">%1$s</xliff:g> սարքի որոնում"</string>
+    <string name="chooser_title" msgid="2235819929238267637">"Կարգավորելու համար ընտրեք <xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
+    <string name="single_device_title" msgid="4199861437545438606">"Որոնվում է <xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
     <string name="summary_watch" msgid="8134580124808507407">"Այս հավելվածը կկարողանա համաժամացնել տվյալները, օր․՝ զանգողի անունը, և կստանա հետևյալ թույլտվությունները ձեր <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>ում"</string>
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Թույլատրե՞լ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; հավելվածին կառավարել &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; սարքը"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"սարք"</string>
diff --git a/packages/CompanionDeviceManager/res/values-it/strings.xml b/packages/CompanionDeviceManager/res/values-it/strings.xml
index 3fa0419..36647ad 100644
--- a/packages/CompanionDeviceManager/res/values-it/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-it/strings.xml
@@ -27,7 +27,7 @@
     <string name="chooser_title_non_profile" msgid="6035023914517087400">"Scegli un dispositivo che sia gestito da &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;"</string>
     <string name="chooser_title" msgid="2235819929238267637">"Scegli un <xliff:g id="PROFILE_NAME">%1$s</xliff:g> da configurare"</string>
     <string name="single_device_title" msgid="4199861437545438606">"Ricerca di un <xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
-    <string name="summary_watch" msgid="8134580124808507407">"Questa app potrà sincronizzare informazioni, ad esempio il nome di un chiamante, e accedere alle seguenti autorizzazioni <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
+    <string name="summary_watch" msgid="8134580124808507407">"Questa app potrà sincronizzare informazioni, ad esempio il nome di un chiamante, e accedere alle seguenti autorizzazioni sul <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Vuoi consentire all\'app &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; di gestire &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"dispositivo"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Questa app potrà accedere alle seguenti autorizzazioni <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>:"</string>
@@ -46,7 +46,7 @@
     <string name="summary_sensor_device_streaming" msgid="3413105061195145547">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> avrà accesso a tutto ciò che viene riprodotto sul tuo <xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_2">%1$s</xliff:g> sarà in grado di riprodurre in streaming l\'audio su <xliff:g id="DEVICE_NAME_3">%3$s</xliff:g> finché non rimuoverai l\'accesso a questa autorizzazione."</string>
     <string name="helper_summary_sensor_device_streaming" msgid="8860174545653786353">"<xliff:g id="APP_NAME">%1$s</xliff:g> richiede l\'autorizzazione per conto di <xliff:g id="DEVICE_NAME">%2$s</xliff:g> per riprodurre in streaming funzionalità di sistema e audio tra i tuoi dispositivi."</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>
+    <string name="summary_generic" msgid="1761976003668044801">"Questa app potrà sincronizzare informazioni, ad esempio il nome di un chiamante, tra lo smartphone e il dispositivo scelto"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Consenti"</string>
     <string name="consent_no" msgid="2640796915611404382">"Non consentire"</string>
     <string name="consent_cancel" msgid="5655005528379285841">"Annulla"</string>
diff --git a/packages/CompanionDeviceManager/res/values-iw/strings.xml b/packages/CompanionDeviceManager/res/values-iw/strings.xml
index f775a7f..f08ee6e 100644
--- a/packages/CompanionDeviceManager/res/values-iw/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-iw/strings.xml
@@ -27,7 +27,7 @@
     <string name="chooser_title_non_profile" msgid="6035023914517087400">"‏בחירה של מכשיר לניהול באמצעות &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;"</string>
     <string name="chooser_title" msgid="2235819929238267637">"בחירת <xliff:g id="PROFILE_NAME">%1$s</xliff:g> להגדרה"</string>
     <string name="single_device_title" msgid="4199861437545438606">"מתבצע חיפוש של <xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
-    <string name="summary_watch" msgid="8134580124808507407">"האפליקציה הזו תוכל לסנכרן מידע, כמו השם של מישהו שמתקשר, ולגשת להרשאות האלה ב<xliff:g id="DEVICE_TYPE">%1$s</xliff:g> שלך"</string>
+    <string name="summary_watch" msgid="8134580124808507407">"האפליקציה הזו תוכל לסנכרן מידע, כמו השם של מי שמתקשר, ולגשת להרשאות האלה ב<xliff:g id="DEVICE_TYPE">%1$s</xliff:g> שלך"</string>
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"‏מתן הרשאה לאפליקציה ‎&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&amp;g;‎‏ לנהל את ‎&lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;‎‏"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"מכשיר"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"האפליקציה הזו תוכל לגשת להרשאות האלה ב<xliff:g id="DEVICE_TYPE">%1$s</xliff:g> שלך"</string>
@@ -46,7 +46,7 @@
     <string name="summary_sensor_device_streaming" msgid="3413105061195145547">"‏לאפליקציה <xliff:g id="APP_NAME_0">%1$s</xliff:g> תהיה גישה לכל מה שיופעל במכשיר <xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>.&lt;br/&gt;&lt;br/&gt;האפליקציה <xliff:g id="APP_NAME_2">%1$s</xliff:g> תוכל לשדר אודיו אל <xliff:g id="DEVICE_NAME_3">%3$s</xliff:g> עד שההרשאה הזו תוסר."</string>
     <string name="helper_summary_sensor_device_streaming" msgid="8860174545653786353">"האפליקציה <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="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>
diff --git a/packages/CompanionDeviceManager/res/values-ka/strings.xml b/packages/CompanionDeviceManager/res/values-ka/strings.xml
index d9bc50a..3fb5519 100644
--- a/packages/CompanionDeviceManager/res/values-ka/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ka/strings.xml
@@ -26,7 +26,7 @@
     <string name="profile_name_watch" msgid="576290739483672360">"საათი"</string>
     <string name="chooser_title_non_profile" msgid="6035023914517087400">"აირჩიეთ მოწყობილობა, რომელიც უნდა მართოს &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; აპმა"</string>
     <string name="chooser_title" msgid="2235819929238267637">"აირჩიეთ <xliff:g id="PROFILE_NAME">%1$s</xliff:g> დასაყენებლად"</string>
-    <string name="single_device_title" msgid="4199861437545438606">"<xliff:g id="PROFILE_NAME">%1$s</xliff:g>-ის ძებნა"</string>
+    <string name="single_device_title" msgid="4199861437545438606">"იძებნება <xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
     <string name="summary_watch" msgid="8134580124808507407">"ეს აპი შეძლებს ინფორმაციის (მაგალითად, იმ ადამიანის სახელი, რომელიც გირეკავთ) სინქრონიზებას და თქვენს <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>-ზე არსებულ ამ ნებართვებზე წვდომას"</string>
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"ნება დართეთ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>-ს&lt;/strong&gt; მართოს &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"მოწყობილობა"</string>
diff --git a/packages/CompanionDeviceManager/res/values-kk/strings.xml b/packages/CompanionDeviceManager/res/values-kk/strings.xml
index 2fd8d96..06b82ec 100644
--- a/packages/CompanionDeviceManager/res/values-kk/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-kk/strings.xml
@@ -17,16 +17,16 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="4470785958457506021">"Companion Device Manager"</string>
-    <string name="confirmation_title" msgid="2244241995958340998">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; қолданбасына &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;? құрылғысына кіруге рұқсат беріңіз"</string>
-    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Құрылғыдағы (<xliff:g id="DEVICE_TYPE">%1$s</xliff:g>) <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> қосулы болуын тексеріп, <xliff:g id="PROFILE_NAME">%3$s</xliff:g> құрылғысын маңайында ұстаңыз."</string>
+    <string name="confirmation_title" msgid="2244241995958340998">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; қолданбасына &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; құрылғысының дерегін пайдалануға рұқсат беру керек пе?"</string>
+    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Құрылғыдағы (<xliff:g id="DEVICE_TYPE">%1$s</xliff:g>) <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> қосулы болуын тексеріп, <xliff:g id="PROFILE_NAME">%3$s</xliff:g> одан алыстамауын қадағалаңыз."</string>
     <string name="message_discovery_hard_timeout" msgid="677514663495711424">"Ешқандай құрылғы табылмады. Кейінірек қайталап көріңіз."</string>
     <string name="discovery_bluetooth" msgid="5693557668470016164">"Bluetooth"</string>
     <string name="discovery_wifi" msgid="1551782459721758773">"Wi-Fi"</string>
     <string name="discovery_mixed" msgid="7071466134150760127">"Bluetooth және Wi-Fi"</string>
-    <string name="profile_name_watch" msgid="576290739483672360">"сағат"</string>
+    <string name="profile_name_watch" msgid="576290739483672360">"Сағат"</string>
     <string name="chooser_title_non_profile" msgid="6035023914517087400">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; арқылы басқарылатын құрылғыны таңдаңыз"</string>
     <string name="chooser_title" msgid="2235819929238267637">"Реттеу үшін <xliff:g id="PROFILE_NAME">%1$s</xliff:g> таңдаңыз"</string>
-    <string name="single_device_title" msgid="4199861437545438606">"<xliff:g id="PROFILE_NAME">%1$s</xliff:g> құрылғысын іздеу"</string>
+    <string name="single_device_title" msgid="4199861437545438606">"<xliff:g id="PROFILE_NAME">%1$s</xliff:g> ізделіп жатыр"</string>
     <string name="summary_watch" msgid="8134580124808507407">"Бұл қолданба қоңырау шалушының аты сияқты деректі синхрондай алады және құрылғыдағы (<xliff:g id="DEVICE_TYPE">%1$s</xliff:g>) осы рұқсаттарды пайдалана алады."</string>
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; қолданбасына &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; құрылғысын басқаруға рұқсат беру керек пе?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"құрылғы"</string>
@@ -45,7 +45,7 @@
     <string name="title_sensor_device_streaming" msgid="2395553261097861497">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; қолданбасына <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> құрылғыңыз бен &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; құрылғысы арасында аудио және жүйе функцияларын трансляциялауға рұқсат берілсін бе?"</string>
     <string name="summary_sensor_device_streaming" msgid="3413105061195145547">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> қолданбасы <xliff:g id="DEVICE_NAME_1">%3$s</xliff:g> құрылғыңызда ойнатылатын барлық контентті пайдалана алады.&lt;br/&gt;&lt;br/&gt;Бұл рұқсатты өшірмесеңіз, <xliff:g id="APP_NAME_2">%1$s</xliff:g> қолданбасы <xliff:g id="DEVICE_NAME_3">%3$s</xliff:g> құрылғысына аудионы трансляциялай алады."</string>
     <string name="helper_summary_sensor_device_streaming" msgid="8860174545653786353">"<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="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>
diff --git a/packages/CompanionDeviceManager/res/values-kn/strings.xml b/packages/CompanionDeviceManager/res/values-kn/strings.xml
index 8320708..269d729 100644
--- a/packages/CompanionDeviceManager/res/values-kn/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-kn/strings.xml
@@ -17,13 +17,13 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="4470785958457506021">"ಕಂಪ್ಯಾನಿಯನ್ ಸಾಧನ ನಿರ್ವಾಹಕರು"</string>
-    <string name="confirmation_title" msgid="2244241995958340998">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; ಅನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸಬೇಕೆ?"</string>
+    <string name="confirmation_title" msgid="2244241995958340998">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; ಅನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ಗೆ ಅನುಮತಿಸಬೇಕೆ?"</string>
     <string name="message_discovery_soft_timeout" msgid="473346859407859161">"ಈ <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> ನಲ್ಲಿ <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> ಆನ್ ಆಗಿದೆಯೇ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ ಮತ್ತು ನಿಮ್ಮ <xliff:g id="PROFILE_NAME">%3$s</xliff:g> ಅನ್ನು ಸಮೀಪಲ್ಲಿಡಿ."</string>
     <string name="message_discovery_hard_timeout" msgid="677514663495711424">"ಯಾವುದೇ ಸಾಧನಗಳು ಕಂಡುಬಂದಿಲ್ಲ. ನಂತರ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."</string>
     <string name="discovery_bluetooth" msgid="5693557668470016164">"ಬ್ಲೂಟೂತ್"</string>
     <string name="discovery_wifi" msgid="1551782459721758773">"ವೈ-ಫೈ"</string>
     <string name="discovery_mixed" msgid="7071466134150760127">"ಬ್ಲೂಟೂತ್ ಮತ್ತು ವೈ-ಫೈ"</string>
-    <string name="profile_name_watch" msgid="576290739483672360">"ವೀಕ್ಷಿಸಿ"</string>
+    <string name="profile_name_watch" msgid="576290739483672360">"ವಾಚ್"</string>
     <string name="chooser_title_non_profile" msgid="6035023914517087400">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ಮೂಲಕ ನಿರ್ವಹಿಸಬೇಕಾದ ಸಾಧನವನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
     <string name="chooser_title" msgid="2235819929238267637">"ಸೆಟಪ್ ಮಾಡಲು <xliff:g id="PROFILE_NAME">%1$s</xliff:g> ಅನ್ನು ಆರಿಸಿ"</string>
     <string name="single_device_title" msgid="4199861437545438606">"<xliff:g id="PROFILE_NAME">%1$s</xliff:g> ಗಾಗಿ ಹುಡುಕಲಾಗುತ್ತಿದೆ"</string>
diff --git a/packages/CompanionDeviceManager/res/values-ky/strings.xml b/packages/CompanionDeviceManager/res/values-ky/strings.xml
index af01cf7..a7b4f40 100644
--- a/packages/CompanionDeviceManager/res/values-ky/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ky/strings.xml
@@ -18,7 +18,7 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="4470785958457506021">"Companion Device Manager"</string>
     <string name="confirmation_title" msgid="2244241995958340998">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; колдонмосуна &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; түзмөгүнө кирүүгө уруксат бересизби?"</string>
-    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"<xliff:g id="DEVICE_TYPE">%1$s</xliff:g> түзмөгүңүздөгү <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g>ыкмасын күйгүзүп, <xliff:g id="PROFILE_NAME">%3$s</xliff:g> профилиңизди жакын кармаңыз."</string>
+    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"<xliff:g id="DEVICE_TYPE">%1$s</xliff:g> түзмөгүңүз <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> аркылуу башка түзмөктөр менен байланыша аларын текшериңиз. <xliff:g id="PROFILE_NAME">%3$s</xliff:g> жакын кармаңыз."</string>
     <string name="message_discovery_hard_timeout" msgid="677514663495711424">"Түзмөктөр табылган жок. Кийинчерээк кайталап көрүңүз."</string>
     <string name="discovery_bluetooth" msgid="5693557668470016164">"Bluetooth"</string>
     <string name="discovery_wifi" msgid="1551782459721758773">"Wi-Fi"</string>
@@ -26,7 +26,7 @@
     <string name="profile_name_watch" msgid="576290739483672360">"саат"</string>
     <string name="chooser_title_non_profile" msgid="6035023914517087400">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; аркылуу башкарыла турган түзмөктү тандаңыз"</string>
     <string name="chooser_title" msgid="2235819929238267637">"Тууралоо үчүн <xliff:g id="PROFILE_NAME">%1$s</xliff:g> тандаңыз"</string>
-    <string name="single_device_title" msgid="4199861437545438606">"<xliff:g id="PROFILE_NAME">%1$s</xliff:g> профилин издөө"</string>
+    <string name="single_device_title" msgid="4199861437545438606">"Түзмөк издөө (<xliff:g id="PROFILE_NAME">%1$s</xliff:g>)"</string>
     <string name="summary_watch" msgid="8134580124808507407">"Бул колдонмого маалыматты, мисалы, чалып жаткан адамдын аты-жөнүн шайкештирүүгө жана <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> түзмөгүңүздө төмөнкүлөрдү аткарууга уруксат берилет"</string>
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; колдонмосуна &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; түзмөгүн тескөөгө уруксат бересизби?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"түзмөк"</string>
diff --git a/packages/CompanionDeviceManager/res/values-lt/strings.xml b/packages/CompanionDeviceManager/res/values-lt/strings.xml
index 9fcf0fa..5dd1d06 100644
--- a/packages/CompanionDeviceManager/res/values-lt/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-lt/strings.xml
@@ -26,7 +26,7 @@
     <string name="profile_name_watch" msgid="576290739483672360">"laikrodį"</string>
     <string name="chooser_title_non_profile" msgid="6035023914517087400">"Įrenginio, kuris bus valdomas naudojant programą &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;, pasirinkimas"</string>
     <string name="chooser_title" msgid="2235819929238267637">"Norimo nustatyti <xliff:g id="PROFILE_NAME">%1$s</xliff:g> pasirinkimas"</string>
-    <string name="single_device_title" msgid="4199861437545438606">"Ieškoma <xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
+    <string name="single_device_title" msgid="4199861437545438606">"Ieškoma: <xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
     <string name="summary_watch" msgid="8134580124808507407">"Šiai programai bus leidžiama sinchronizuoti tam tikrą informaciją, pvz., skambinančio asmens vardą, ir pasiekti toliau nurodytus <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> leidimus"</string>
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Leisti &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; valdyti &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"įrenginio"</string>
diff --git a/packages/CompanionDeviceManager/res/values-lv/strings.xml b/packages/CompanionDeviceManager/res/values-lv/strings.xml
index 39b158d..40de5d1 100644
--- a/packages/CompanionDeviceManager/res/values-lv/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-lv/strings.xml
@@ -18,7 +18,7 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="4470785958457506021">"Palīgierīču pārzinis"</string>
     <string name="confirmation_title" msgid="2244241995958340998">"Vai atļaut lietotnei &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; piekļūt lietotnei &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Noteikti ieslēdziet šajā ierīcē (<xliff:g id="DEVICE_TYPE">%1$s</xliff:g>) <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> un gādājiet, lai <xliff:g id="PROFILE_NAME">%3$s</xliff:g> būtu tuvumā."</string>
+    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Pārliecinieties, vai <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> var izveidot savienojumu ar citām ierīcēm ar <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g>, un gādājiet, lai <xliff:g id="PROFILE_NAME">%3$s</xliff:g> būtu tuvumā."</string>
     <string name="message_discovery_hard_timeout" msgid="677514663495711424">"Nav atrasta neviena ierīce. Lūdzu, vēlāk mēģiniet vēlreiz."</string>
     <string name="discovery_bluetooth" msgid="5693557668470016164">"Bluetooth"</string>
     <string name="discovery_wifi" msgid="1551782459721758773">"Wi‑Fi"</string>
@@ -26,7 +26,7 @@
     <string name="profile_name_watch" msgid="576290739483672360">"pulkstenis"</string>
     <string name="chooser_title_non_profile" msgid="6035023914517087400">"Izvēlieties ierīci, ko pārvaldīt lietotnē &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;"</string>
     <string name="chooser_title" msgid="2235819929238267637">"Jāizvēlas <xliff:g id="PROFILE_NAME">%1$s</xliff:g> iestatīšanai"</string>
-    <string name="single_device_title" msgid="4199861437545438606">"Tiek meklēta ierīce (<xliff:g id="PROFILE_NAME">%1$s</xliff:g>)…"</string>
+    <string name="single_device_title" msgid="4199861437545438606">"Tiek meklēts <xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
     <string name="summary_watch" msgid="8134580124808507407">"Šī lietotne drīkstēs sinhronizēt informāciju, piemēram, zvanītāja vārdu, un piekļūt šīm <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> atļaujām."</string>
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Vai atļaut lietotnei &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; piekļūt ierīcei &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"ierīce"</string>
diff --git a/packages/CompanionDeviceManager/res/values-mk/strings.xml b/packages/CompanionDeviceManager/res/values-mk/strings.xml
index 107895d..db1c06a 100644
--- a/packages/CompanionDeviceManager/res/values-mk/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-mk/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="app_label" msgid="4470785958457506021">"Companion Device Manager"</string>
-    <string name="confirmation_title" msgid="2244241995958340998">"Дозволувате апликацијата &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; да пристапува до &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
+    <string name="confirmation_title" msgid="2244241995958340998">"Дали дозволувате апликацијата &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; да пристапува до &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Погрижете се <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> да биде вклучен на овој <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> и вашиот <xliff:g id="PROFILE_NAME">%3$s</xliff:g> да биде во близина."</string>
     <string name="message_discovery_hard_timeout" msgid="677514663495711424">"Не се најдени уреди. Обидете се повторно подоцна."</string>
     <string name="discovery_bluetooth" msgid="5693557668470016164">"Bluetooth"</string>
@@ -77,8 +77,8 @@
     <string name="permission_notifications_summary" msgid="2272810466047367030">"• Ги чита сите известувања, меѓу кои и податоци како контакти, пораки и фотографии&lt;br/&gt;• Испраќа известувања&lt;br/&gt;&lt;br/&gt;Може да управувате со способноста на апликацијава да чита и испраќа известувања кога било во „Поставки &gt; Известувања“."</string>
     <string name="permission_storage_summary" msgid="3918240895519506417"></string>
     <string name="permission_media_routing_control_summary" msgid="2714631092321412250">"Пристап до списокот со достапни уреди и контрола кои стримуваат или емитуваат аудио или видео од други апликации"</string>
-    <string name="device_type" product="default" msgid="8268703872070046263">"Телефон"</string>
-    <string name="device_type" product="tablet" msgid="5038791954983067774">"Таблет"</string>
+    <string name="device_type" product="default" msgid="8268703872070046263">"телефон"</string>
+    <string name="device_type" product="tablet" msgid="5038791954983067774">"таблет"</string>
     <string name="device_type" product="tv" msgid="5355611506659405636">"ТВ"</string>
     <string name="device_type" product="device" msgid="1526125965802507189">"уред"</string>
 </resources>
diff --git a/packages/CompanionDeviceManager/res/values-mr/strings.xml b/packages/CompanionDeviceManager/res/values-mr/strings.xml
index 7221562..03a5271 100644
--- a/packages/CompanionDeviceManager/res/values-mr/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-mr/strings.xml
@@ -18,7 +18,7 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="4470785958457506021">"सहयोगी डिव्हाइस व्यवस्थापक"</string>
     <string name="confirmation_title" msgid="2244241995958340998">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; अ‍ॅपला &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; अ‍ॅक्सेस करण्याची अनुमती द्यायची आहे का?"</string>
-    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"या <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> चे <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> सुरू असल्याची खात्री करा आणि तुमचे<xliff:g id="PROFILE_NAME">%3$s</xliff:g> जवळ ठेवा."</string>
+    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"या <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> चे <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> सुरू असल्याची खात्री करा आणि तुमचे <xliff:g id="PROFILE_NAME">%3$s</xliff:g> जवळ ठेवा."</string>
     <string name="message_discovery_hard_timeout" msgid="677514663495711424">"डिव्हाइस आढळली नाहीत. कृपया नंतर पुन्हा प्रयत्न करा."</string>
     <string name="discovery_bluetooth" msgid="5693557668470016164">"ब्लूटूथ"</string>
     <string name="discovery_wifi" msgid="1551782459721758773">"वाय-फाय"</string>
diff --git a/packages/CompanionDeviceManager/res/values-nb/strings.xml b/packages/CompanionDeviceManager/res/values-nb/strings.xml
index 1d62349..6008299 100644
--- a/packages/CompanionDeviceManager/res/values-nb/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-nb/strings.xml
@@ -18,16 +18,16 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="4470785958457506021">"Companion Device Manager"</string>
     <string name="confirmation_title" msgid="2244241995958340998">"Vil du gi &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;-appen tilgang til &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Sørg for at <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> har <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> slått på, og hold <xliff:g id="PROFILE_NAME">%3$s</xliff:g> i nærheten."</string>
+    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Sørg for at denne enheten (<xliff:g id="DEVICE_TYPE">%1$s</xliff:g>) har <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> slått på, og hold den andre enheten (<xliff:g id="PROFILE_NAME">%3$s</xliff:g>) i nærheten."</string>
     <string name="message_discovery_hard_timeout" msgid="677514663495711424">"Fant ingen enheter. Prøv på nytt senere."</string>
     <string name="discovery_bluetooth" msgid="5693557668470016164">"Bluetooth"</string>
     <string name="discovery_wifi" msgid="1551782459721758773">"Wifi"</string>
     <string name="discovery_mixed" msgid="7071466134150760127">"Bluetooth og wifi"</string>
     <string name="profile_name_watch" msgid="576290739483672360">"klokke"</string>
     <string name="chooser_title_non_profile" msgid="6035023914517087400">"Velg en enhet som skal administreres av &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="chooser_title" msgid="2235819929238267637">"Velg <xliff:g id="PROFILE_NAME">%1$s</xliff:g> som skal konfigureres"</string>
+    <string name="chooser_title" msgid="2235819929238267637">"Velg enheten (<xliff:g id="PROFILE_NAME">%1$s</xliff:g>) som skal konfigureres"</string>
     <string name="single_device_title" msgid="4199861437545438606">"Ser etter en <xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
-    <string name="summary_watch" msgid="8134580124808507407">"Denne appen får tillatelse til å synkronisere informasjon, for eksempel navnet til folk som ringer, og har disse tillatelsene på <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
+    <string name="summary_watch" msgid="8134580124808507407">"Denne appen får tillatelse til å synkronisere informasjon, for eksempel navnet til folk som ringer, og har disse tillatelsene på enheten din (<xliff:g id="DEVICE_TYPE">%1$s</xliff:g>)"</string>
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Vil du la &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; administrere &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"enheten"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Denne appen får disse tillatelsene på <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
diff --git a/packages/CompanionDeviceManager/res/values-ne/strings.xml b/packages/CompanionDeviceManager/res/values-ne/strings.xml
index 694abdd..dd8b1ae 100644
--- a/packages/CompanionDeviceManager/res/values-ne/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ne/strings.xml
@@ -18,16 +18,16 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="4470785958457506021">"सहयोगी डिभाइसको प्रबन्धक"</string>
     <string name="confirmation_title" msgid="2244241995958340998">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; एपलाई &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; प्रयोग गर्ने अनुमति दिने हो?"</string>
-    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"यो <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> को <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> अन गरिएको छ भन्ने कुरा सुनिश्चित गर्नुहोस् अनि आफ्नो <xliff:g id="PROFILE_NAME">%3$s</xliff:g> नजिकै राख्नुहोस्।"</string>
+    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"यो <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>को <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> अन गरिएको छ भन्ने कुरा सुनिश्चित गर्नुहोस् अनि आफ्नो <xliff:g id="PROFILE_NAME">%3$s</xliff:g> नजिकै राख्नुहोस्।"</string>
     <string name="message_discovery_hard_timeout" msgid="677514663495711424">"कुनै पनि डिभाइस भेटिएन। कृपया पछि फेरि प्रयास गर्नुहोस्।"</string>
     <string name="discovery_bluetooth" msgid="5693557668470016164">"ब्लुटुथ"</string>
     <string name="discovery_wifi" msgid="1551782459721758773">"Wi-Fi"</string>
     <string name="discovery_mixed" msgid="7071466134150760127">"ब्लुटुथ तथा Wi-Fi"</string>
-    <string name="profile_name_watch" msgid="576290739483672360">"घडी"</string>
+    <string name="profile_name_watch" msgid="576290739483672360">"स्मार्ट वाच"</string>
     <string name="chooser_title_non_profile" msgid="6035023914517087400">"आफूले &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; प्रयोग गरी व्यवस्थापन गर्न चाहेको डिभाइस चयन गर्नुहोस्"</string>
     <string name="chooser_title" msgid="2235819929238267637">"सेट अप गर्नका लागि <xliff:g id="PROFILE_NAME">%1$s</xliff:g> छनौट गर्नुहोस्"</string>
     <string name="single_device_title" msgid="4199861437545438606">"<xliff:g id="PROFILE_NAME">%1$s</xliff:g> खोजिँदै छ"</string>
-    <string name="summary_watch" msgid="8134580124808507407">"तपाईंको <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> मा यो एपलाई कल गर्ने व्यक्तिको नाम जस्ता जानकारी सिंक गर्ने र यी कुराहरू गर्ने अनुमति दिइने छ"</string>
+    <string name="summary_watch" msgid="8134580124808507407">"तपाईंको <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>मा यो एपलाई कल गर्ने व्यक्तिको नाम जस्ता जानकारी सिंक गर्ने र निम्न कुरासँग सम्बन्धित अनुमतिहरू दिइने छ"</string>
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; लाई &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; व्यवस्थापन गर्ने अनुमति दिने हो?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"डिभाइस"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"तपाईंको <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> मा यो एपलाई निम्न अनुमति दिइने छ:"</string>
@@ -45,8 +45,8 @@
     <string name="title_sensor_device_streaming" msgid="2395553261097861497">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; लाई तपाईंको <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> र &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt; का बिचमा अडियो र सिस्टमका सुविधाहरू स्ट्रिम गर्ने अनुमति दिने हो?"</string>
     <string name="summary_sensor_device_streaming" msgid="3413105061195145547">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> ले तपाईंको <xliff:g id="DEVICE_NAME_1">%3$s</xliff:g> मा प्ले गरिने सबै कुरा एक्सेस गर्न सक्ने छ।&lt;br/&gt;&lt;br/&gt;तपाईंले यो अनुमति रद्द नगरेसम्म <xliff:g id="APP_NAME_2">%1$s</xliff:g> ले <xliff:g id="DEVICE_NAME_3">%3$s</xliff:g> मा अडियो स्ट्रिम गर्न पाइराख्ने छ।"</string>
     <string name="helper_summary_sensor_device_streaming" msgid="8860174545653786353">"<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="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>
@@ -63,7 +63,7 @@
     <string name="permission_microphone" msgid="2152206421428732949">"माइक्रोफोन"</string>
     <string name="permission_call_logs" msgid="5546761417694586041">"कल लगहरू"</string>
     <string name="permission_nearby_devices" msgid="7530973297737123481">"नजिकैका डिभाइसहरू"</string>
-    <string name="permission_media_routing_control" msgid="5498639511586715253">"मिडिया आउटपुट बदल्नुहोस्"</string>
+    <string name="permission_media_routing_control" msgid="5498639511586715253">"मिडिया आउटपुट बदल्ने"</string>
     <string name="permission_storage" msgid="6831099350839392343">"फोटो र मिडिया"</string>
     <string name="permission_notifications" msgid="4099418516590632909">"नोटिफिकेसनहरू"</string>
     <string name="permission_phone_summary" msgid="8246321093970051702">"फोन कल गर्ने र व्यवस्थापन गर्ने"</string>
diff --git a/packages/CompanionDeviceManager/res/values-nl/strings.xml b/packages/CompanionDeviceManager/res/values-nl/strings.xml
index 5e38961..22feb9d 100644
--- a/packages/CompanionDeviceManager/res/values-nl/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-nl/strings.xml
@@ -46,7 +46,7 @@
     <string name="summary_sensor_device_streaming" msgid="3413105061195145547">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> krijgt toegang tot alles wat wordt afgespeeld op je <xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_2">%1$s</xliff:g> kan audio naar <xliff:g id="DEVICE_NAME_3">%3$s</xliff:g> streamen totdat je de toegang tot dit recht intrekt."</string>
     <string name="helper_summary_sensor_device_streaming" msgid="8860174545653786353">"<xliff:g id="APP_NAME">%1$s</xliff:g> vraagt namens <xliff:g id="DEVICE_NAME">%2$s</xliff:g> toestemming om audio en systeemfuncties te streamen tussen je apparaten."</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>
+    <string name="summary_generic" msgid="1761976003668044801">"Deze app kan informatie synchroniseren (zoals de naam van iemand die belt) tussen je telefoon en het gekozen apparaat"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Toestaan"</string>
     <string name="consent_no" msgid="2640796915611404382">"Niet toestaan"</string>
     <string name="consent_cancel" msgid="5655005528379285841">"Annuleren"</string>
diff --git a/packages/CompanionDeviceManager/res/values-or/strings.xml b/packages/CompanionDeviceManager/res/values-or/strings.xml
index 14dcc18..96c6207 100644
--- a/packages/CompanionDeviceManager/res/values-or/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-or/strings.xml
@@ -18,7 +18,7 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="4470785958457506021">"ସହଯୋଗୀ ଡିଭାଇସ୍ ପରିଚାଳକ"</string>
     <string name="confirmation_title" msgid="2244241995958340998">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;କୁ ଆକ୍ସେସ କରିବା ପାଇଁ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ଆପକୁ ଅନୁମତି ଦେବେ?"</string>
-    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"ସୁନିଶ୍ଚିତ ହୁଏନ୍ତୁ ଏହି <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>ରେ <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> ଚାଲୁ କରାଯାଇଛି ଏବଂ ଆପଣଙ୍କର <xliff:g id="PROFILE_NAME">%3$s</xliff:g> ଆଖପାଖରେ ରଖନ୍ତୁ।"</string>
+    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"ସୁନିଶ୍ଚିତ ହୁଏନ୍ତୁ ଯେ ଏହି <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>ରେ <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> ଚାଲୁ କରାଯାଇଛି ଏବଂ ଆପଣଙ୍କର <xliff:g id="PROFILE_NAME">%3$s</xliff:g> ଆଖପାଖରେ ରଖନ୍ତୁ।"</string>
     <string name="message_discovery_hard_timeout" msgid="677514663495711424">"କୌଣସି ଡିଭାଇସ ମିଳିଲା ନାହିଁ। ଦୟାକରି ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
     <string name="discovery_bluetooth" msgid="5693557668470016164">"ବ୍ଲୁଟୁଥ"</string>
     <string name="discovery_wifi" msgid="1551782459721758773">"ୱାଇ-ଫାଇ"</string>
diff --git a/packages/CompanionDeviceManager/res/values-pl/strings.xml b/packages/CompanionDeviceManager/res/values-pl/strings.xml
index 90bc1e3..62a0d40 100644
--- a/packages/CompanionDeviceManager/res/values-pl/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-pl/strings.xml
@@ -18,14 +18,14 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="4470785958457506021">"Menedżer urządzeń towarzyszących"</string>
     <string name="confirmation_title" msgid="2244241995958340998">"Zezwolić aplikacji &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; na dostęp do urządzenia &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Upewnij się, że <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> ma włączoną funkcję <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g>, i trzymaj urządzenie <xliff:g id="PROFILE_NAME">%3$s</xliff:g> w pobliżu."</string>
+    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Upewnij się, że <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> ma włączoną funkcję <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g>, i trzymaj <xliff:g id="PROFILE_NAME">%3$s</xliff:g> w pobliżu."</string>
     <string name="message_discovery_hard_timeout" msgid="677514663495711424">"Nie znaleziono urządzeń. Spróbuj ponownie później."</string>
     <string name="discovery_bluetooth" msgid="5693557668470016164">"Bluetooth"</string>
     <string name="discovery_wifi" msgid="1551782459721758773">"Wi-Fi"</string>
     <string name="discovery_mixed" msgid="7071466134150760127">"Bluetooth i Wi-Fi"</string>
     <string name="profile_name_watch" msgid="576290739483672360">"zegarek"</string>
     <string name="chooser_title_non_profile" msgid="6035023914517087400">"Wybierz urządzenie, którym ma zarządzać aplikacja &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="chooser_title" msgid="2235819929238267637">"Wybierz profil <xliff:g id="PROFILE_NAME">%1$s</xliff:g>, aby go skonfigurować"</string>
+    <string name="chooser_title" msgid="2235819929238267637">"Wybierz <xliff:g id="PROFILE_NAME">%1$s</xliff:g>, aby go skonfigurować"</string>
     <string name="single_device_title" msgid="4199861437545438606">"Szukam: <xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
     <string name="summary_watch" msgid="8134580124808507407">"Aplikacja będzie mogła synchronizować informacje takie jak nazwa dzwoniącego oraz korzystać z tych uprawnień na Twoim urządzeniu (<xliff:g id="DEVICE_TYPE">%1$s</xliff:g>)"</string>
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Zezwolić na dostęp aplikacji &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; do urządzenia &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
diff --git a/packages/CompanionDeviceManager/res/values-pt-rBR/strings.xml b/packages/CompanionDeviceManager/res/values-pt-rBR/strings.xml
index 073fa26..81c50c1 100644
--- a/packages/CompanionDeviceManager/res/values-pt-rBR/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-pt-rBR/strings.xml
@@ -18,7 +18,7 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="4470785958457506021">"Gerenciador de dispositivos complementar"</string>
     <string name="confirmation_title" msgid="2244241995958340998">"Permitir que o app &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; acesse o dispositivo &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Confira se o <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> tem o <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> ativado e se o <xliff:g id="PROFILE_NAME">%3$s</xliff:g> está por perto."</string>
+    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Confira se o <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> está com o <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> ativado e se o <xliff:g id="PROFILE_NAME">%3$s</xliff:g> está por perto."</string>
     <string name="message_discovery_hard_timeout" msgid="677514663495711424">"Nenhum dispositivo foi encontrado. Tente de novo mais tarde."</string>
     <string name="discovery_bluetooth" msgid="5693557668470016164">"Bluetooth"</string>
     <string name="discovery_wifi" msgid="1551782459721758773">"Wi-Fi"</string>
diff --git a/packages/CompanionDeviceManager/res/values-pt/strings.xml b/packages/CompanionDeviceManager/res/values-pt/strings.xml
index 073fa26..81c50c1 100644
--- a/packages/CompanionDeviceManager/res/values-pt/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-pt/strings.xml
@@ -18,7 +18,7 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="4470785958457506021">"Gerenciador de dispositivos complementar"</string>
     <string name="confirmation_title" msgid="2244241995958340998">"Permitir que o app &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; acesse o dispositivo &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Confira se o <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> tem o <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> ativado e se o <xliff:g id="PROFILE_NAME">%3$s</xliff:g> está por perto."</string>
+    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Confira se o <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> está com o <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> ativado e se o <xliff:g id="PROFILE_NAME">%3$s</xliff:g> está por perto."</string>
     <string name="message_discovery_hard_timeout" msgid="677514663495711424">"Nenhum dispositivo foi encontrado. Tente de novo mais tarde."</string>
     <string name="discovery_bluetooth" msgid="5693557668470016164">"Bluetooth"</string>
     <string name="discovery_wifi" msgid="1551782459721758773">"Wi-Fi"</string>
diff --git a/packages/CompanionDeviceManager/res/values-ru/strings.xml b/packages/CompanionDeviceManager/res/values-ru/strings.xml
index 42acfb7..a5b5b59 100644
--- a/packages/CompanionDeviceManager/res/values-ru/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ru/strings.xml
@@ -46,7 +46,7 @@
     <string name="summary_sensor_device_streaming" msgid="3413105061195145547">"Приложение \"<xliff:g id="APP_NAME_0">%1$s</xliff:g>\" получит доступ ко всему, что воспроизводится на устройстве \"<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>\".&lt;br/&gt;&lt;br/&gt;Приложение \"<xliff:g id="APP_NAME_2">%1$s</xliff:g>\" сможет транслировать аудио на устройство \"<xliff:g id="DEVICE_NAME_3">%3$s</xliff:g>\", пока вы не отзовете это разрешение."</string>
     <string name="helper_summary_sensor_device_streaming" msgid="8860174545653786353">"Приложение \"<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="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>
diff --git a/packages/CompanionDeviceManager/res/values-sk/strings.xml b/packages/CompanionDeviceManager/res/values-sk/strings.xml
index 9ee2ce5..f46252e 100644
--- a/packages/CompanionDeviceManager/res/values-sk/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-sk/strings.xml
@@ -25,7 +25,7 @@
     <string name="discovery_mixed" msgid="7071466134150760127">"Bluetooth a Wi-Fi"</string>
     <string name="profile_name_watch" msgid="576290739483672360">"hodinky"</string>
     <string name="chooser_title_non_profile" msgid="6035023914517087400">"Vyberte zariadenie, ktoré bude spravovať aplikácia &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="chooser_title" msgid="2235819929238267637">"Vyberte profil <xliff:g id="PROFILE_NAME">%1$s</xliff:g>, ktorý nastavíte"</string>
+    <string name="chooser_title" msgid="2235819929238267637">"Vyberte profil <xliff:g id="PROFILE_NAME">%1$s</xliff:g>, ktorý chcete nastaviť"</string>
     <string name="single_device_title" msgid="4199861437545438606">"Hľadá sa zariadenie <xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
     <string name="summary_watch" msgid="8134580124808507407">"Táto aplikácia bude môcť synchronizovať informácie, napríklad meno volajúceho, a získavať prístup k týmto povoleniam v zariadení <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Chcete povoliť aplikácii &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; spravovať zariadenie &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
diff --git a/packages/CompanionDeviceManager/res/values-sl/strings.xml b/packages/CompanionDeviceManager/res/values-sl/strings.xml
index 3d08276..0696c98 100644
--- a/packages/CompanionDeviceManager/res/values-sl/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-sl/strings.xml
@@ -18,16 +18,16 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="4470785958457506021">"Upravitelj spremljevalnih naprav"</string>
     <string name="confirmation_title" msgid="2244241995958340998">"Želite aplikaciji &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; dovoliti dostop do naprave &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Poskrbite, da je v napravi <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> vklopljena nastavitev »<xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g>«, in napravo <xliff:g id="PROFILE_NAME">%3$s</xliff:g> imejte v bližini."</string>
+    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Poskrbite, da ima <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> vklopljen <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g>, <xliff:g id="PROFILE_NAME">%3$s</xliff:g> pa naj bo v bližini."</string>
     <string name="message_discovery_hard_timeout" msgid="677514663495711424">"Ni naprav. Poskusite znova pozneje."</string>
     <string name="discovery_bluetooth" msgid="5693557668470016164">"Bluetooth"</string>
     <string name="discovery_wifi" msgid="1551782459721758773">"Wi-Fi"</string>
     <string name="discovery_mixed" msgid="7071466134150760127">"Bluetooth in Wi-Fi"</string>
     <string name="profile_name_watch" msgid="576290739483672360">"ura"</string>
     <string name="chooser_title_non_profile" msgid="6035023914517087400">"Izbira naprave, ki jo bo upravljala aplikacija &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="chooser_title" msgid="2235819929238267637">"Izberite profil naprave »<xliff:g id="PROFILE_NAME">%1$s</xliff:g>« za nastavitev"</string>
-    <string name="single_device_title" msgid="4199861437545438606">"Iskanje naprave <xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
-    <string name="summary_watch" msgid="8134580124808507407">"Ta aplikacija bo lahko sinhronizirala podatke, na primer ime klicatelja, in dostopala do teh dovoljenj v napravi »<xliff:g id="DEVICE_TYPE">%1$s</xliff:g>«."</string>
+    <string name="chooser_title" msgid="2235819929238267637">"Izberite za nastavitev: <xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
+    <string name="single_device_title" msgid="4199861437545438606">"Iskanje: <xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
+    <string name="summary_watch" msgid="8134580124808507407">"Ta aplikacija bo lahko sinhronizirala podatke, na primer ime klicatelja, in dostopala do teh dovoljenj v: <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>."</string>
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Želite aplikaciji &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; dovoliti upravljanje naprave &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"naprava"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Ta aplikacija bo lahko dostopala do teh dovoljenj v napravi »<xliff:g id="DEVICE_TYPE">%1$s</xliff:g>«."</string>
diff --git a/packages/CompanionDeviceManager/res/values-sq/strings.xml b/packages/CompanionDeviceManager/res/values-sq/strings.xml
index de32322..02f88ce 100644
--- a/packages/CompanionDeviceManager/res/values-sq/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-sq/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="4470785958457506021">"Menaxheri i pajisjes shoqëruese"</string>
     <string name="confirmation_title" msgid="2244241995958340998">"T\'i lejohet aplikacionit &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; qasja te &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Sigurohu që ky <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> të ketë të aktivizuar<xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> dhe mbaje <xliff:g id="PROFILE_NAME">%3$s</xliff:g> tënde pranë."</string>
+    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Sigurohu që ky <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> të ketë të aktivizuar <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> dhe kjo <xliff:g id="PROFILE_NAME">%3$s</xliff:g> të mbahet pranë."</string>
     <string name="message_discovery_hard_timeout" msgid="677514663495711424">"Nuk u gjet asnjë pajisje. Provo përsëri më vonë."</string>
     <string name="discovery_bluetooth" msgid="5693557668470016164">"Bluetooth-in"</string>
     <string name="discovery_wifi" msgid="1551782459721758773">"Wi-Fi"</string>
     <string name="discovery_mixed" msgid="7071466134150760127">"Bluetooth-in dhe Wi-Fi"</string>
-    <string name="profile_name_watch" msgid="576290739483672360">"ora inteligjente"</string>
+    <string name="profile_name_watch" msgid="576290739483672360">"orë inteligjente"</string>
     <string name="chooser_title_non_profile" msgid="6035023914517087400">"Zgjidh një pajisje që do të menaxhohet nga &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;"</string>
     <string name="chooser_title" msgid="2235819929238267637">"Zgjidh një <xliff:g id="PROFILE_NAME">%1$s</xliff:g> për konfigurimin"</string>
     <string name="single_device_title" msgid="4199861437545438606">"Po kërkon për një <xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
@@ -45,7 +45,7 @@
     <string name="title_sensor_device_streaming" msgid="2395553261097861497">"Të lejohet që &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; të transmetojë audion dhe veçoritë e sistemit mes <xliff:g id="DEVICE_TYPE">%2$s</xliff:g> dhe &lt;strong&gt;<xliff:g id="DEVICE_NAME">%3$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="summary_sensor_device_streaming" msgid="3413105061195145547">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> do të ketë qasje në çdo gjë që luhet në pajisjen tënde <xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>.&lt;br/&gt;&lt;br/&gt;<xliff:g id="APP_NAME_2">%1$s</xliff:g> do të mund të transmetojë audion te <xliff:g id="DEVICE_NAME_3">%3$s</xliff:g> derisa të heqësh qasjen për këtë leje."</string>
     <string name="helper_summary_sensor_device_streaming" msgid="8860174545653786353">"<xliff:g id="APP_NAME">%1$s</xliff:g> po kërkon leje në emër të <xliff:g id="DEVICE_NAME">%2$s</xliff:g> për të transmetuar audion dhe veçoritë e sistemit mes pajisjeve të tua"</string>
-    <string name="profile_name_generic" msgid="6851028682723034988">"pajisja"</string>
+    <string name="profile_name_generic" msgid="6851028682723034988">"pajisje"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Ky aplikacion do të mund të sinkronizojë informacione, si p.sh emrin e dikujt që po telefonon, mes telefonit tënd dhe pajisjes së zgjedhur."</string>
     <string name="consent_yes" msgid="8344487259618762872">"Lejo"</string>
     <string name="consent_no" msgid="2640796915611404382">"Mos lejo"</string>
diff --git a/packages/CompanionDeviceManager/res/values-sr/strings.xml b/packages/CompanionDeviceManager/res/values-sr/strings.xml
index a86d1e1..5f7e53d 100644
--- a/packages/CompanionDeviceManager/res/values-sr/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-sr/strings.xml
@@ -18,16 +18,16 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="4470785958457506021">"Менаџер придруженог уређаја"</string>
     <string name="confirmation_title" msgid="2244241995958340998">"Дозволите да апликација &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; приступа уређају &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Уверите се да је за <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> укључен <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> и да у близини имате <xliff:g id="PROFILE_NAME">%3$s</xliff:g>."</string>
+    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Уверите се да је на <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> укључен <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> и да у близини имате <xliff:g id="PROFILE_NAME">%3$s</xliff:g>."</string>
     <string name="message_discovery_hard_timeout" msgid="677514663495711424">"Није пронађен ниједан уређај. Пробајте поново касније."</string>
     <string name="discovery_bluetooth" msgid="5693557668470016164">"Bluetooth"</string>
     <string name="discovery_wifi" msgid="1551782459721758773">"WiFi"</string>
     <string name="discovery_mixed" msgid="7071466134150760127">"Bluetooth и WiFi"</string>
     <string name="profile_name_watch" msgid="576290739483672360">"сат"</string>
     <string name="chooser_title_non_profile" msgid="6035023914517087400">"Одаберите уређај којим ће управљати апликација &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="chooser_title" msgid="2235819929238267637">"Одаберите профил <xliff:g id="PROFILE_NAME">%1$s</xliff:g> који желите да подесите"</string>
+    <string name="chooser_title" msgid="2235819929238267637">"Одаберите <xliff:g id="PROFILE_NAME">%1$s</xliff:g> који желите да подесите"</string>
     <string name="single_device_title" msgid="4199861437545438606">"Тражи се <xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
-    <string name="summary_watch" msgid="8134580124808507407">"Овој апликацији ће бити дозвољено да синхронизује податке, попут имена позиваоца, и приступа тим дозволама на уређају <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
+    <string name="summary_watch" msgid="8134580124808507407">"Овој апликацији ће бити дозвољено да синхронизује податке, попут имена позиваоца, и приступа следећим дозволама на <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Желите ли да дозволите да &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; управља уређајем &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"уређај"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"Овој апликацији ће бити дозвољено да приступа овим дозволама на уређају <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
diff --git a/packages/CompanionDeviceManager/res/values-sv/strings.xml b/packages/CompanionDeviceManager/res/values-sv/strings.xml
index 7790790..a622ff4 100644
--- a/packages/CompanionDeviceManager/res/values-sv/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-sv/strings.xml
@@ -18,7 +18,7 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="4470785958457506021">"Companion Device Manager"</string>
     <string name="confirmation_title" msgid="2244241995958340998">"Vill du tillåta att appen &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; får åtkomst till &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
-    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Se till att <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> har <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> aktiverat och håll <xliff:g id="PROFILE_NAME">%3$s</xliff:g> i närheten."</string>
+    <string name="message_discovery_soft_timeout" msgid="473346859407859161">"Se till att denna <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> har <xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g> aktiverat och håll din <xliff:g id="PROFILE_NAME">%3$s</xliff:g> i närheten."</string>
     <string name="message_discovery_hard_timeout" msgid="677514663495711424">"Inga enheter hittades. Försök igen senare."</string>
     <string name="discovery_bluetooth" msgid="5693557668470016164">"Bluetooth"</string>
     <string name="discovery_wifi" msgid="1551782459721758773">"Wifi"</string>
@@ -26,7 +26,7 @@
     <string name="profile_name_watch" msgid="576290739483672360">"klocka"</string>
     <string name="chooser_title_non_profile" msgid="6035023914517087400">"Välj en enhet för hantering av &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;"</string>
     <string name="chooser_title" msgid="2235819929238267637">"Välj en <xliff:g id="PROFILE_NAME">%1$s</xliff:g> för konfigurering"</string>
-    <string name="single_device_title" msgid="4199861437545438606">"Söker efter ett <xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
+    <string name="single_device_title" msgid="4199861437545438606">"Söker efter en <xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
     <string name="summary_watch" msgid="8134580124808507407">"Appen får synkronisera information, till exempel namnet på någon som ringer, och får åtkomst till dessa behörigheter på din <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Tillåt att &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; hanterar &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"enhet"</string>
diff --git a/packages/CompanionDeviceManager/res/values-te/strings.xml b/packages/CompanionDeviceManager/res/values-te/strings.xml
index b39b58a..f353b80 100644
--- a/packages/CompanionDeviceManager/res/values-te/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-te/strings.xml
@@ -24,7 +24,7 @@
     <string name="discovery_wifi" msgid="1551782459721758773">"Wi-Fi"</string>
     <string name="discovery_mixed" msgid="7071466134150760127">"బ్లూటూత్, Wi-Fi"</string>
     <string name="profile_name_watch" msgid="576290739483672360">"వాచ్"</string>
-    <string name="chooser_title_non_profile" msgid="6035023914517087400">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ద్వారా మేనేజ్ చేయబడే పరికరాన్ని ఎంచుకోండి"</string>
+    <string name="chooser_title_non_profile" msgid="6035023914517087400">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; మేనేజ్ చేయాల్సిన పరికరాన్ని ఎంచుకోండి"</string>
     <string name="chooser_title" msgid="2235819929238267637">"సెటప్ చేయడానికి <xliff:g id="PROFILE_NAME">%1$s</xliff:g>‌ను ఎంచుకోండి"</string>
     <string name="single_device_title" msgid="4199861437545438606">"<xliff:g id="PROFILE_NAME">%1$s</xliff:g> కోసం స్కాన్ చేస్తోంది"</string>
     <string name="summary_watch" msgid="8134580124808507407">"కాల్ చేస్తున్న వారి పేరు వంటి సమాచారాన్ని సింక్ చేయడానికి, మీ <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>‌లో ఈ అనుమతులను యాక్సెస్ చేయడానికి ఈ యాప్ అనుమతించబడుతుంది"</string>
@@ -46,7 +46,7 @@
     <string name="summary_sensor_device_streaming" msgid="3413105061195145547">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> మీ <xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>‌లో ప్లే చేయబడిన దేనికైనా యాక్సెస్ కలిగి ఉంటుంది.&lt;br/&gt;&lt;br/&gt;మీరు ఈ అనుమతికి యాక్సెస్‌ను తీసివేసే వరకు <xliff:g id="APP_NAME_2">%1$s</xliff:g> ఆడియోను <xliff:g id="DEVICE_NAME_3">%3$s</xliff:g>‌కు స్ట్రీమ్ చేయగలదు."</string>
     <string name="helper_summary_sensor_device_streaming" msgid="8860174545653786353">"మీ పరికరాల మధ్య ఆడియో, సిస్టమ్ ఫీచర్‌లను స్ట్రీమ్ చేయడానికి <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>
+    <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>
diff --git a/packages/CompanionDeviceManager/res/values-tl/strings.xml b/packages/CompanionDeviceManager/res/values-tl/strings.xml
index 9150a48..8d5470c 100644
--- a/packages/CompanionDeviceManager/res/values-tl/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-tl/strings.xml
@@ -25,7 +25,7 @@
     <string name="discovery_mixed" msgid="7071466134150760127">"Bluetooth at Wi-Fi"</string>
     <string name="profile_name_watch" msgid="576290739483672360">"relo"</string>
     <string name="chooser_title_non_profile" msgid="6035023914517087400">"Pumili ng device na papamahalaan ng &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;"</string>
-    <string name="chooser_title" msgid="2235819929238267637">"Pumili ng <xliff:g id="PROFILE_NAME">%1$s</xliff:g> para mag-set up"</string>
+    <string name="chooser_title" msgid="2235819929238267637">"Pumili ng <xliff:g id="PROFILE_NAME">%1$s</xliff:g> para i-set up"</string>
     <string name="single_device_title" msgid="4199861437545438606">"Hinahanap ang <xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
     <string name="summary_watch" msgid="8134580124808507407">"Papayagan ang app na ito na mag-sync ng impormasyon, tulad ng pangalan ng isang taong tumatawag, at ma-access ang mga pahintulot na ito sa iyong <xliff:g id="DEVICE_TYPE">%1$s</xliff:g>"</string>
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"Payagan ang &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; na pamahalaan ang &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
@@ -46,7 +46,7 @@
     <string name="summary_sensor_device_streaming" msgid="3413105061195145547">"Magkakaroon ng access ang <xliff:g id="APP_NAME_0">%1$s</xliff:g> sa anumang pine-play sa iyong <xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>.&lt;br/&gt;&lt;br/&gt;Makakapag-stream ang <xliff:g id="APP_NAME_2">%1$s</xliff:g> ng audio sa <xliff:g id="DEVICE_NAME_3">%3$s</xliff:g> hanggang sa alisin mo ang access sa pahintulot na ito."</string>
     <string name="helper_summary_sensor_device_streaming" msgid="8860174545653786353">"Humihingi ang <xliff:g id="APP_NAME">%1$s</xliff:g> ng pahintulot para sa <xliff:g id="DEVICE_NAME">%2$s</xliff:g> na mag-stream ng audio at mga feature ng system sa pagitan ng iyong mga device."</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"device"</string>
-    <string name="summary_generic" msgid="1761976003668044801">"Magagawa ng app na ito na mag-sync ng impormasyon, tulad ng pangalan ng isang taong tumatawag, sa pagitan ng iyong telepono at ng napiling device"</string>
+    <string name="summary_generic" msgid="1761976003668044801">"Magagawa ng app na ito na mag-sync ng impormasyon, tulad ng pangalan ng taong tumatawag, sa pagitan ng telepono mo at ng napiling device"</string>
     <string name="consent_yes" msgid="8344487259618762872">"Payagan"</string>
     <string name="consent_no" msgid="2640796915611404382">"Huwag payagan"</string>
     <string name="consent_cancel" msgid="5655005528379285841">"Kanselahin"</string>
diff --git a/packages/CompanionDeviceManager/res/values-ur/strings.xml b/packages/CompanionDeviceManager/res/values-ur/strings.xml
index e502a79..f517742 100644
--- a/packages/CompanionDeviceManager/res/values-ur/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ur/strings.xml
@@ -24,7 +24,7 @@
     <string name="discovery_wifi" msgid="1551782459721758773">"Wi-Fi"</string>
     <string name="discovery_mixed" msgid="7071466134150760127">"‏بلوٹوتھ اور Wi-Fi"</string>
     <string name="profile_name_watch" msgid="576290739483672360">"دیکھیں"</string>
-    <string name="chooser_title_non_profile" msgid="6035023914517087400">"‏‎&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;‎ کے ذریعے منتخب کیے جانے کیلئے آلہ منتخب کریں"</string>
+    <string name="chooser_title_non_profile" msgid="6035023914517087400">"‏کوئی آلہ منتخب کریں جس کا نظم و نسق &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; کرے"</string>
     <string name="chooser_title" msgid="2235819929238267637">"سیٹ اپ کرنے کے لیے <xliff:g id="PROFILE_NAME">%1$s</xliff:g> کا انتخاب کریں"</string>
     <string name="single_device_title" msgid="4199861437545438606">"‫<xliff:g id="PROFILE_NAME">%1$s</xliff:g> کو تلاش کیا جا رہا ہے"</string>
     <string name="summary_watch" msgid="8134580124808507407">"اس ایپ کو آپ کے <xliff:g id="DEVICE_TYPE">%1$s</xliff:g> پر کسی کال کرنے والے کے نام جیسی معلومات کی مطابقت پذیری کرنے اور ان اجازتوں تک رسائی کی اجازت ہوگی"</string>
diff --git a/packages/CompanionDeviceManager/res/values-zh-rCN/strings.xml b/packages/CompanionDeviceManager/res/values-zh-rCN/strings.xml
index 4360092..ccc046b 100644
--- a/packages/CompanionDeviceManager/res/values-zh-rCN/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-zh-rCN/strings.xml
@@ -17,15 +17,15 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" msgid="4470785958457506021">"配套设备管理器"</string>
-    <string name="confirmation_title" msgid="2244241995958340998">"允许应用&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;访问&lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
+    <string name="confirmation_title" msgid="2244241995958340998">"要允许“&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;”应用访问“&lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;”吗?"</string>
     <string name="message_discovery_soft_timeout" msgid="473346859407859161">"请确保此<xliff:g id="DEVICE_TYPE">%1$s</xliff:g>已开启<xliff:g id="DISCOVERY_METHOD">%2$s</xliff:g>,并将<xliff:g id="PROFILE_NAME">%3$s</xliff:g>放在附近。"</string>
-    <string name="message_discovery_hard_timeout" msgid="677514663495711424">"找不到设备,请稍后重试。"</string>
+    <string name="message_discovery_hard_timeout" msgid="677514663495711424">"未找到设备,请稍后重试。"</string>
     <string name="discovery_bluetooth" msgid="5693557668470016164">"蓝牙"</string>
     <string name="discovery_wifi" msgid="1551782459721758773">"WLAN"</string>
     <string name="discovery_mixed" msgid="7071466134150760127">"蓝牙和 WLAN"</string>
     <string name="profile_name_watch" msgid="576290739483672360">"手表"</string>
-    <string name="chooser_title_non_profile" msgid="6035023914517087400">"选择要由&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;管理的设备"</string>
-    <string name="chooser_title" msgid="2235819929238267637">"选择 <xliff:g id="PROFILE_NAME">%1$s</xliff:g> 进行设置"</string>
+    <string name="chooser_title_non_profile" msgid="6035023914517087400">"选择要由“&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;”管理的设备"</string>
+    <string name="chooser_title" msgid="2235819929238267637">"选择要设置的<xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
     <string name="single_device_title" msgid="4199861437545438606">"寻找<xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
     <string name="summary_watch" msgid="8134580124808507407">"该应用将能同步信息(例如来电者的姓名),并能获得您<xliff:g id="DEVICE_TYPE">%1$s</xliff:g>上的以下权限"</string>
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"允许&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;管理&lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;?"</string>
diff --git a/packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml b/packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml
index 2bfcaf2..a96e43f 100644
--- a/packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml
@@ -27,7 +27,7 @@
     <string name="chooser_title_non_profile" msgid="6035023914517087400">"選擇要讓「<xliff:g id="APP_NAME">%1$s</xliff:g>」&lt;strong&gt;&lt;/strong&gt;管理的裝置"</string>
     <string name="chooser_title" msgid="2235819929238267637">"選擇要設定的<xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
     <string name="single_device_title" msgid="4199861437545438606">"尋找<xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
-    <string name="summary_watch" msgid="8134580124808507407">"這個應用程式將可同步處理資訊 (例如來電者名稱) 及取得<xliff:g id="DEVICE_TYPE">%1$s</xliff:g>上的這些權限"</string>
+    <string name="summary_watch" msgid="8134580124808507407">"這個應用程式可同步處理資訊 (例如來電者名稱) 和取得<xliff:g id="DEVICE_TYPE">%1$s</xliff:g>上的這些權限"</string>
     <string name="confirmation_title_glasses" msgid="8288346850537727333">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」&lt;strong&gt;&lt;/strong&gt;管理「<xliff:g id="DEVICE_NAME">%2$s</xliff:g>」&lt;strong&gt;&lt;/strong&gt;嗎?"</string>
     <string name="profile_name_glasses" msgid="3506504967216601277">"裝置"</string>
     <string name="summary_glasses" msgid="5469208629679579157">"這個應用程式將可取得<xliff:g id="DEVICE_TYPE">%1$s</xliff:g>上的這些權限"</string>
@@ -46,7 +46,7 @@
     <string name="summary_sensor_device_streaming" msgid="3413105061195145547">"「<xliff:g id="APP_NAME_0">%1$s</xliff:g>」將可存取「<xliff:g id="DEVICE_NAME_1">%3$s</xliff:g>」播放的所有內容。&lt;br/&gt;&lt;br/&gt;「<xliff:g id="APP_NAME_2">%1$s</xliff:g>」可將音訊串流傳輸到「<xliff:g id="DEVICE_NAME_3">%3$s</xliff:g>」,直到你移除這個權限為止。"</string>
     <string name="helper_summary_sensor_device_streaming" msgid="8860174545653786353">"「<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="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>
diff --git a/packages/CredentialManager/res/values-pl/strings.xml b/packages/CredentialManager/res/values-pl/strings.xml
index 6514887..86dd090 100644
--- a/packages/CredentialManager/res/values-pl/strings.xml
+++ b/packages/CredentialManager/res/values-pl/strings.xml
@@ -42,7 +42,7 @@
     <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="passkey" msgid="632353688396759522">"klucz dostępu"</string>
     <string name="password" msgid="6738570945182936667">"hasło"</string>
     <string name="passkeys" msgid="5733880786866559847">"klucze dostępu"</string>
     <string name="passwords" msgid="5419394230391253816">"hasła"</string>
@@ -61,7 +61,7 @@
     <string name="more_options_usage_passwords" msgid="1632047277723187813">"Hasła: <xliff:g id="PASSWORDSNUMBER">%1$s</xliff:g>"</string>
     <string name="more_options_usage_passkeys" msgid="5390320437243042237">"Klucze dostępu: <xliff:g id="PASSKEYSNUMBER">%1$s</xliff:g>"</string>
     <string name="more_options_usage_credentials" msgid="1785697001787193984">"Dane logowania: <xliff:g id="TOTALCREDENTIALSNUMBER">%1$s</xliff:g>"</string>
-    <string name="passkey_before_subtitle" msgid="2448119456208647444">"Klucz"</string>
+    <string name="passkey_before_subtitle" msgid="2448119456208647444">"Klucz dostępu"</string>
     <string name="another_device" msgid="5147276802037801217">"Inne urządzenie"</string>
     <string name="other_password_manager" msgid="565790221427004141">"Inne menedżery haseł"</string>
     <string name="close_sheet" msgid="1393792015338908262">"Zamknij arkusz"</string>
diff --git a/packages/InputDevices/res/raw/keyboard_layout_english_india.kcm b/packages/InputDevices/res/raw/keyboard_layout_english_india.kcm
new file mode 100644
index 0000000..0059d00
--- /dev/null
+++ b/packages/InputDevices/res/raw/keyboard_layout_english_india.kcm
@@ -0,0 +1,400 @@
+# Copyright 2025 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#
+# English (India) keyboard layout.
+#
+
+type OVERLAY
+
+map key 86 PLUS
+
+### ROW 1
+
+key GRAVE {
+    label:                              '`'
+    base:                               '`'
+    shift:                              '~'
+    ralt:                               '\u0300'
+    ralt+shift:                         '\u0303'
+}
+
+key 1 {
+    label:                              '1'
+    base:                               '1'
+    shift:                              '!'
+}
+
+key 2 {
+    label:                              '2'
+    base:                               '2'
+    shift:                              '@'
+}
+
+key 3 {
+    label:                              '3'
+    base:                               '3'
+    shift:                              '#'
+}
+
+key 4 {
+    label:                              '4'
+    base:                               '4'
+    shift:                              '$'
+    ralt, ctrl+shift:                   '\u20b9'
+}
+
+key 5 {
+    label:                              '5'
+    base:                               '5'
+    shift:                              '%'
+}
+
+key 6 {
+    label:                              '6'
+    base:                               '6'
+    shift:                              '^'
+    ralt+shift:                         '\u0302'
+}
+
+key 7 {
+    label:                              '7'
+    base:                               '7'
+    shift:                              '&'
+}
+
+key 8 {
+    label:                              '8'
+    base:                               '8'
+    shift:                              '*'
+}
+
+key 9 {
+    label:                              '9'
+    base:                               '9'
+    shift:                              '('
+    ralt+shift:                         '\u0306'
+}
+
+key 0 {
+    label:                              '0'
+    base:                               '0'
+    shift:                              ')'
+}
+
+key MINUS {
+    label:                              '-'
+    base:                               '-'
+    shift:                              '_'
+    ralt+shift:                         '\u0331'
+}
+
+key EQUALS {
+    label:                              '='
+    base:                               '='
+    shift:                              '+'
+    ralt:                               '\u2013'
+    ralt+shift:                         '\u2014'
+}
+
+### ROW 2
+
+key Q {
+    label:                              'Q'
+    base:                               'q'
+    shift, capslock:                    'Q'
+    capslock+shift:                     'q'
+    ralt:                               '\u00e6'
+    ralt+shift, ralt+capslock:          '\u00c6'
+    ralt+shift+capslock:                '\u00e6'
+}
+
+key W {
+    label:                              'W'
+    base:                               'w'
+    shift, capslock:                    'W'
+    capslock+shift:                     'w'
+}
+
+key E {
+    label:                              'E'
+    base:                               'e'
+    shift, capslock:                    'E'
+    capslock+shift:                     'e'
+    ralt:                               '\u0113'
+    ralt+shift, ralt+capslock:          '\u0112'
+    ralt+shift+capslock:                '\u0113'
+}
+
+key R {
+    label:                              'R'
+    base:                               'r'
+    shift, capslock:                    'R'
+    capslock+shift:                     'r'
+}
+
+key T {
+    label:                              'T'
+    base:                               't'
+    shift, capslock:                    'T'
+    capslock+shift:                     't'
+    ralt:                               '\u1e6d'
+    ralt+shift, ralt+capslock:          '\u1e6c'
+    ralt+shift+capslock:                '\u1e6d'
+}
+
+key Y {
+    label:                              'Y'
+    base:                               'y'
+    shift, capslock:                    'Y'
+    capslock+shift:                     'y'
+    ralt:                               '\u00f1'
+    ralt+shift, ralt+capslock:          '\u00d1'
+    ralt+shift+capslock:                '\u00f1'
+}
+
+key U {
+    label:                              'U'
+    base:                               'u'
+    shift, capslock:                    'U'
+    capslock+shift:                     'u'
+    ralt:                               '\u016b'
+    ralt+shift, ralt+capslock:          '\u016a'
+    ralt+shift+capslock:                '\u016b'
+}
+
+key I {
+    label:                              'I'
+    base:                               'i'
+    shift, capslock:                    'I'
+    capslock+shift:                     'i'
+    ralt:                               '\u012b'
+    ralt+shift, ralt+capslock:          '\u012a'
+    ralt+shift+capslock:                '\u012b'
+}
+
+key O {
+    label:                              'O'
+    base:                               'o'
+    shift, capslock:                    'O'
+    capslock+shift:                     'o'
+    ralt:                               '\u014d'
+    ralt+shift, ralt+capslock:          '\u014c'
+    ralt+shift+capslock:                '\u014d'
+}
+
+key P {
+    label:                              'P'
+    base:                               'p'
+    shift, capslock:                    'P'
+    capslock+shift:                     'p'
+}
+
+key LEFT_BRACKET {
+    label:                              '['
+    base:                               '['
+    shift:                              '{'
+}
+
+key RIGHT_BRACKET {
+    label:                              ']'
+    base:                               ']'
+    shift:                              '}'
+}
+
+### ROW 3
+
+key A {
+    label:                              'A'
+    base:                               'a'
+    shift, capslock:                    'A'
+    capslock+shift:                     'a'
+    ralt:                               '\u0101'
+    ralt+shift, ralt+capslock:          '\u0100'
+    ralt+shift+capslock:                '\u0101'
+}
+
+key S {
+    label:                              'S'
+    base:                               's'
+    shift, capslock:                    'S'
+    capslock+shift:                     's'
+    ralt:                               '\u015b'
+    ralt+shift, ralt+capslock:          '\u015a'
+    ralt+shift+capslock:                '\u015b'
+}
+
+key D {
+    label:                              'D'
+    base:                               'd'
+    shift, capslock:                    'D'
+    capslock+shift:                     'd'
+    ralt:                               '\u1e0d'
+    ralt+shift, ralt+capslock:          '\u1e0c'
+    ralt+shift+capslock:                 '\u1e0d'
+}
+
+key F {
+    label:                              'F'
+    base:                               'f'
+    shift, capslock:                    'F'
+    capslock+shift:                     'f'
+}
+
+key G {
+    label:                              'G'
+    base:                               'g'
+    shift, capslock:                    'G'
+    capslock+shift:                     'g'
+    ralt:                               '\u1e45'
+    ralt+shift, ralt+capslock:          '\u1e44'
+    ralt+shift+capslock:                '\u1e45'
+}
+
+key H {
+    label:                              'H'
+    base:                               'h'
+    shift, capslock:                    'H'
+    capslock+shift:                     'h'
+    ralt:                               '\u1e25'
+    ralt+shift, ralt+capslock:          '\u1e24'
+    ralt+shift+capslock:                '\u1e25'
+}
+
+key J {
+    label:                              'J'
+    base:                               'j'
+    shift, capslock:                    'J'
+    capslock+shift:                     'j'
+}
+
+key K {
+    label:                              'K'
+    base:                               'k'
+    shift, capslock:                    'K'
+    capslock+shift:                     'k'
+}
+
+key L {
+    label:                              'L'
+    base:                               'l'
+    shift, capslock:                    'L'
+    capslock+shift:                     'l'
+}
+
+key SEMICOLON {
+    label:                              ';'
+    base:                               ';'
+    shift:                              ':'
+}
+
+key APOSTROPHE {
+    label:                              '\''
+    base:                               '\''
+    shift:                              '\u0022'
+    ralt:                               '\u030d'
+    ralt+shift:                         '\u030e'
+}
+
+key BACKSLASH {
+    label:                              '\\'
+    base:                               '\\'
+    shift:                              '|'
+}
+
+### ROW 4
+
+key PLUS {
+    label:                              '\\'
+    base:                               '\\'
+    shift:                              '|'
+}
+
+key Z {
+    label:                              'Z'
+    base:                               'z'
+    shift, capslock:                    'Z'
+    capslock+shift:                     'z'
+}
+
+key X {
+    label:                              'X'
+    base:                               'x'
+    shift, capslock:                    'X'
+    capslock+shift:                     'x'
+    ralt:                               '\u1e63'
+    ralt+shift, ralt+capslock:          '\u1e62'
+    ralt+shift+capslock:                '\u1e63'
+}
+
+key C {
+    label:                              'C'
+    base:                               'c'
+    shift, capslock:                    'C'
+    capslock+shift:                     'c'
+}
+
+key V {
+    label:                              'V'
+    base:                               'v'
+    shift, capslock:                    'V'
+    capslock+shift:                     'v'
+}
+
+key B {
+    label:                              'B'
+    base:                               'b'
+    shift, capslock:                    'B'
+    capslock+shift:                     'b'
+}
+
+key N {
+    label:                              'N'
+    base:                               'n'
+    shift, capslock:                    'N'
+    capslock+shift:                     'n'
+    ralt:                               '\u1e47'
+    ralt+shift, ralt+capslock:          '\u1e46'
+    ralt+shift+capslock:                '\u1e47'
+}
+
+key M {
+    label:                              'M'
+    base:                               'm'
+    shift, capslock:                    'M'
+    capslock+shift:                     'm'
+    ralt:                               '\u1e41'
+    ralt+shift, ralt+capslock:          '\u1e40'
+    ralt+shift+capslock:                '\u1e41'
+}
+
+key COMMA {
+    label:                              ','
+    base:                               ','
+    shift:                              '<'
+    ralt+shift:                         '\u030C'
+}
+
+key PERIOD {
+    label:                              '.'
+    base:                               '.'
+    shift:                              '>'
+    ralt:                               '\u0323'
+}
+
+key SLASH {
+    label:                              '/'
+    base:                               '/'
+    shift:                              '?'
+}
diff --git a/packages/InputDevices/res/values/strings.xml b/packages/InputDevices/res/values/strings.xml
index bd7cdc4..8a397a5 100644
--- a/packages/InputDevices/res/values/strings.xml
+++ b/packages/InputDevices/res/values/strings.xml
@@ -167,4 +167,7 @@
 
     <!-- Romanian keyboard layout label. [CHAR LIMIT=35] -->
     <string name="keyboard_layout_romanian">Romanian</string>
+
+    <!-- English (India) keyboard layout label. [CHAR LIMIT=35] -->
+    <string name="keyboard_layout_english_india">English (India)</string>
 </resources>
diff --git a/packages/InputDevices/res/xml/keyboard_layouts.xml b/packages/InputDevices/res/xml/keyboard_layouts.xml
index 9ce9a87..fa0ed13 100644
--- a/packages/InputDevices/res/xml/keyboard_layouts.xml
+++ b/packages/InputDevices/res/xml/keyboard_layouts.xml
@@ -367,4 +367,11 @@
         android:keyboardLayout="@raw/keyboard_layout_romanian"
         android:keyboardLocale="ro-Latn-RO"
         android:keyboardLayoutType="qwerty" />
+
+    <keyboard-layout
+        android:name="keyboard_layout_english_india"
+        android:label="@string/keyboard_layout_english_india"
+        android:keyboardLayout="@raw/keyboard_layout_english_india"
+        android:keyboardLocale="en-Latn-IN"
+        android:keyboardLayoutType="qwerty" />
 </keyboard-layouts>
diff --git a/packages/PackageInstaller/res/values-my/strings.xml b/packages/PackageInstaller/res/values-my/strings.xml
index 98eae5a..bbcf900 100644
--- a/packages/PackageInstaller/res/values-my/strings.xml
+++ b/packages/PackageInstaller/res/values-my/strings.xml
@@ -58,7 +58,7 @@
     <string name="uninstall_application_title" msgid="4045420072401428123">"အက်ပ်ကို ဖယ်ရှားရန်"</string>
     <string name="uninstall_update_title" msgid="824411791011583031">"အပ်ဒိတ်ကို ဖယ်ရှားရန်"</string>
     <string name="uninstall_activity_text" msgid="1928194674397770771">"<xliff:g id="ACTIVITY_NAME">%1$s</xliff:g> သည် အောက်ပါအက်ပ်၏ တစ်စိတ်တစ်ဒေသဖြစ်သည်−"</string>
-    <string name="uninstall_application_text" msgid="3816830743706143980">"ဤအက်ပ်ကို ဖယ်ရှားလိုပါသလား။"</string>
+    <string name="uninstall_application_text" msgid="3816830743706143980">"ဤအက်ပ်ကို ဖြုတ်လိုပါသလား။"</string>
     <string name="archive_application_text" msgid="8482325710714386348">"သင့်ကိုယ်ရေးအချက်အလက်ကို သိမ်းပါမည်"</string>
     <string name="archive_application_text_all_users" msgid="3151229641681672580">"ဤအက်ပ်ကို အသုံးပြုသူအားလုံးအတွက် သိမ်းမလား။ သင့်ကိုယ်ရေးအချက်အလက်ကို သိမ်းပါမည်"</string>
     <string name="archive_application_text_current_user_work_profile" msgid="1450487362134779752">"ဤအက်ပ်ကို သင့်အလုပ်ပရိုဖိုင်တွင် သိမ်းမလား။ သင့်ကိုယ်ရေးအချက်အလက်ကို သိမ်းပါမည်"</string>
diff --git a/packages/PackageInstaller/res/values-pt-rBR/strings.xml b/packages/PackageInstaller/res/values-pt-rBR/strings.xml
index 332517a..f356bb4 100644
--- a/packages/PackageInstaller/res/values-pt-rBR/strings.xml
+++ b/packages/PackageInstaller/res/values-pt-rBR/strings.xml
@@ -58,7 +58,7 @@
     <string name="uninstall_application_title" msgid="4045420072401428123">"Desinstalar app"</string>
     <string name="uninstall_update_title" msgid="824411791011583031">"Desinstalar atualização"</string>
     <string name="uninstall_activity_text" msgid="1928194674397770771">"<xliff:g id="ACTIVITY_NAME">%1$s</xliff:g> é parte do seguinte app:"</string>
-    <string name="uninstall_application_text" msgid="3816830743706143980">"Você quer desinstalar este app?"</string>
+    <string name="uninstall_application_text" msgid="3816830743706143980">"Você quer desinstalar esse app?"</string>
     <string name="archive_application_text" msgid="8482325710714386348">"Seus dados pessoais serão salvos"</string>
     <string name="archive_application_text_all_users" msgid="3151229641681672580">"Arquivar esse app para todos os usuários? Seus dados pessoais serão salvos"</string>
     <string name="archive_application_text_current_user_work_profile" msgid="1450487362134779752">"Arquivar esse app no seu perfil de trabalho? Seus dados pessoais serão salvos"</string>
diff --git a/packages/PackageInstaller/res/values-pt/strings.xml b/packages/PackageInstaller/res/values-pt/strings.xml
index 332517a..f356bb4 100644
--- a/packages/PackageInstaller/res/values-pt/strings.xml
+++ b/packages/PackageInstaller/res/values-pt/strings.xml
@@ -58,7 +58,7 @@
     <string name="uninstall_application_title" msgid="4045420072401428123">"Desinstalar app"</string>
     <string name="uninstall_update_title" msgid="824411791011583031">"Desinstalar atualização"</string>
     <string name="uninstall_activity_text" msgid="1928194674397770771">"<xliff:g id="ACTIVITY_NAME">%1$s</xliff:g> é parte do seguinte app:"</string>
-    <string name="uninstall_application_text" msgid="3816830743706143980">"Você quer desinstalar este app?"</string>
+    <string name="uninstall_application_text" msgid="3816830743706143980">"Você quer desinstalar esse app?"</string>
     <string name="archive_application_text" msgid="8482325710714386348">"Seus dados pessoais serão salvos"</string>
     <string name="archive_application_text_all_users" msgid="3151229641681672580">"Arquivar esse app para todos os usuários? Seus dados pessoais serão salvos"</string>
     <string name="archive_application_text_current_user_work_profile" msgid="1450487362134779752">"Arquivar esse app no seu perfil de trabalho? Seus dados pessoais serão salvos"</string>
diff --git a/packages/PrintSpooler/src/com/android/printspooler/widget/PreviewPageFrame.java b/packages/PrintSpooler/src/com/android/printspooler/widget/PreviewPageFrame.java
index 95bdb09..e735610 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/widget/PreviewPageFrame.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/widget/PreviewPageFrame.java
@@ -16,6 +16,8 @@
 
 package com.android.printspooler.widget;
 
+import static android.view.accessibility.Flags.triStateChecked;
+
 import android.content.Context;
 import android.util.AttributeSet;
 import android.view.accessibility.AccessibilityEvent;
@@ -38,6 +40,20 @@
     }
 
     @Override
+    public boolean performClick() {
+        final boolean result = super.performClick();
+        // This widget is incorrectly using the notion of "selection"
+        // to represent checked state. We can't send this event in
+        // setSelected() because setSelected() is called when this widget
+        // is not attached.
+        if (triStateChecked()) {
+            notifyViewAccessibilityStateChangedIfNeeded(
+                    AccessibilityEvent.CONTENT_CHANGE_TYPE_CHECKED);
+        }
+        return result;
+    }
+
+    @Override
     public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
         super.onInitializeAccessibilityEvent(event);
         event.setChecked(isSelected());
@@ -48,6 +64,11 @@
         super.onInitializeAccessibilityNodeInfo(info);
         info.setSelected(false);
         info.setCheckable(true);
-        info.setChecked(isSelected());
+        if (triStateChecked()) {
+            info.setChecked(isSelected() ? AccessibilityNodeInfo.CHECKED_STATE_TRUE :
+                    AccessibilityNodeInfo.CHECKED_STATE_FALSE);
+        } else {
+            info.setChecked(isSelected());
+        }
     }
 }
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/Android.bp b/packages/SettingsLib/CollapsingToolbarBaseActivity/Android.bp
index b56b944..af8e856 100644
--- a/packages/SettingsLib/CollapsingToolbarBaseActivity/Android.bp
+++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/Android.bp
@@ -35,5 +35,6 @@
         "com.android.extservices",
         "com.android.permission",
         "com.android.healthfitness",
+        "com.android.mediaprovider",
     ],
 }
diff --git a/packages/SettingsLib/IntroPreference/res/layout/settingslib_expressive_preference_intro.xml b/packages/SettingsLib/IntroPreference/res/layout/settingslib_expressive_preference_intro.xml
index 7adcbf6..cacd274 100644
--- a/packages/SettingsLib/IntroPreference/res/layout/settingslib_expressive_preference_intro.xml
+++ b/packages/SettingsLib/IntroPreference/res/layout/settingslib_expressive_preference_intro.xml
@@ -17,6 +17,7 @@
 
 <RelativeLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/entity_header"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
@@ -38,7 +39,9 @@
             android:id="@+id/collapsable_summary"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:gravity="center"/>
+            android:gravity="center"
+            android:minLines="1"
+            app:isCollapsable="true"/>
 
     </LinearLayout>
 
diff --git a/packages/SettingsLib/IntroPreference/src/com/android/settingslib/widget/IntroPreference.kt b/packages/SettingsLib/IntroPreference/src/com/android/settingslib/widget/IntroPreference.kt
index f9931cf..9d037e9 100644
--- a/packages/SettingsLib/IntroPreference/src/com/android/settingslib/widget/IntroPreference.kt
+++ b/packages/SettingsLib/IntroPreference/src/com/android/settingslib/widget/IntroPreference.kt
@@ -33,8 +33,8 @@
     defStyleRes: Int = 0
 ) : Preference(context, attrs, defStyleAttr, defStyleRes), GroupSectionDividerMixin {
 
-    private var isCollapsable: Boolean = false
-    private var minLines: Int = 2
+    private var isCollapsable: Boolean = true
+    private var minLines: Int = DEFAULT_MIN_LINES
     private var hyperlinkListener: View.OnClickListener? = null
     private var learnMoreListener: View.OnClickListener? = null
     private var learnMoreText: CharSequence? = null
@@ -42,22 +42,6 @@
     init {
         layoutResource = R.layout.settingslib_expressive_preference_intro
         isSelectable = false
-
-        initAttributes(context, attrs, defStyleAttr)
-    }
-
-    private fun initAttributes(context: Context, attrs: AttributeSet?, defStyleAttr: Int) {
-        context.obtainStyledAttributes(
-            attrs,
-            COLLAPSABLE_TEXT_VIEW_ATTRS, defStyleAttr, 0
-        ).apply {
-            isCollapsable = getBoolean(IS_COLLAPSABLE, false)
-            minLines = getInt(
-                MIN_LINES,
-                if (isCollapsable) DEFAULT_MIN_LINES else DEFAULT_MAX_LINES
-            ).coerceIn(1, DEFAULT_MAX_LINES)
-            recycle()
-        }
     }
 
     override fun onBindViewHolder(holder: PreferenceViewHolder) {
@@ -139,13 +123,6 @@
 
     companion object {
         private const val DEFAULT_MAX_LINES = 10
-        private const val DEFAULT_MIN_LINES = 2
-
-        private val COLLAPSABLE_TEXT_VIEW_ATTRS =
-            com.android.settingslib.widget.theme.R.styleable.CollapsableTextView
-        private val MIN_LINES =
-            com.android.settingslib.widget.theme.R.styleable.CollapsableTextView_android_minLines
-        private val IS_COLLAPSABLE =
-            com.android.settingslib.widget.theme.R.styleable.CollapsableTextView_isCollapsable
+        private const val DEFAULT_MIN_LINES = 1
     }
-}
\ No newline at end of file
+}
diff --git a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceBindings.kt b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceBindings.kt
index dbac17d..44c93c7 100644
--- a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceBindings.kt
+++ b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceBindings.kt
@@ -74,8 +74,14 @@
     override fun bind(preference: Preference, metadata: PreferenceMetadata) {
         super.bind(preference, metadata)
         (preference as TwoStatePreference).apply {
+            // MUST suppress persistent when initializing the checked state:
+            //   1. default value is written to datastore if not set (b/396260949)
+            //   2. avoid redundant read to the datastore
+            val suppressPersistent = isPersistent
+            if (suppressPersistent) isPersistent = false
             // "false" is kind of placeholder, metadata datastore should provide the default value
             isChecked = preferenceDataStore!!.getBoolean(key, false)
+            if (suppressPersistent) isPersistent = true
         }
     }
 }
diff --git a/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/CollapsableTextView.kt b/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/CollapsableTextView.kt
index 7eb9840..976711b 100644
--- a/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/CollapsableTextView.kt
+++ b/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/CollapsableTextView.kt
@@ -40,7 +40,7 @@
     defStyleAttr: Int = 0
 ) : ConstraintLayout(context, attrs, defStyleAttr) {
 
-    private var isCollapsable: Boolean = false
+    private var isCollapsable: Boolean = DEFAULT_COLLAPSABLE
     private var isCollapsed: Boolean = false
     private var minLines: Int = DEFAULT_MIN_LINES
 
@@ -78,24 +78,38 @@
 
     private fun initAttributes(context: Context, attrs: AttributeSet?, defStyleAttr: Int) {
         context.obtainStyledAttributes(
-            attrs, Attrs, defStyleAttr, 0
+            attrs, R.styleable.CollapsableTextView, defStyleAttr, 0
         ).apply {
-            val gravity = getInt(GravityAttr, Gravity.START)
+            val gravity = getInt(gravityAttr, Gravity.START)
             when (gravity) {
                 Gravity.CENTER_VERTICAL, Gravity.CENTER, Gravity.CENTER_HORIZONTAL -> {
                     centerHorizontally(titleTextView)
                     centerHorizontally(collapseButton)
                 }
             }
+            isCollapsable = getBoolean(isCollapsableAttr, DEFAULT_COLLAPSABLE)
+            minLines = getInt(minLinesAttr, DEFAULT_MIN_LINES)
             recycle()
         }
     }
 
     private fun centerHorizontally(view: View) {
-        (view.layoutParams as LayoutParams).apply {
-            startToStart = LayoutParams.PARENT_ID
-            endToEnd = LayoutParams.PARENT_ID
-            horizontalBias = 0.5f
+        when (view) {
+            is MaterialButton -> {
+                (view.layoutParams as LayoutParams).apply {
+                    startToStart = LayoutParams.PARENT_ID
+                    endToEnd = LayoutParams.PARENT_ID
+                }
+            }
+            is TextView -> {
+                view.gravity = Gravity.CENTER
+            }
+            else -> {
+                (view.layoutParams as LayoutParams).apply {
+                    startToStart = LayoutParams.PARENT_ID
+                    endToEnd = LayoutParams.PARENT_ID
+                }
+            }
         }
     }
 
@@ -113,6 +127,8 @@
      */
     fun setCollapsable(collapsable: Boolean) {
         isCollapsable = collapsable
+        // Make is collapsed when it's collapsable
+        if (isCollapsable) isCollapsed = true
         updateView()
     }
 
@@ -120,8 +136,8 @@
      * Sets the minimum number of lines to display when collapsed.
      * @param lines The minimum number of lines.
      */
-    fun setMinLines(line: Int) {
-        minLines = line.coerceIn(1, DEFAULT_MAX_LINES)
+    fun setMinLines(lines: Int) {
+        minLines = lines.coerceIn(1, DEFAULT_MAX_LINES)
         updateView()
     }
 
@@ -198,7 +214,7 @@
         }
         learnMoreSpan = LearnMoreSpan(clickListener = learnMoreListener!!)
         spannableLearnMoreText.setSpan(learnMoreSpan, 0, learnMoreText!!.length, 0)
-        learnMoreTextView.setText(spannableLearnMoreText)
+        learnMoreTextView.text = spannableLearnMoreText
         learnMoreTextView.visibility = VISIBLE
         isLearnMoreEnabled = true
     }
@@ -211,6 +227,8 @@
                     icon = collapseButtonResources.expandIcon
                 }
                 titleTextView.maxLines = minLines
+                titleTextView.ellipsize = null
+                titleTextView.scrollBarSize = 0
             }
 
             else -> {
@@ -219,6 +237,7 @@
                     icon = collapseButtonResources.collapseIcon
                 }
                 titleTextView.maxLines = DEFAULT_MAX_LINES
+                titleTextView.ellipsize = TextUtils.TruncateAt.END
             }
         }
         collapseButton.visibility = if (isCollapsable) VISIBLE else GONE
@@ -235,17 +254,19 @@
     companion object {
         private const val DEFAULT_MAX_LINES = 10
         private const val DEFAULT_MIN_LINES = 2
+        private const val DEFAULT_COLLAPSABLE = true
 
         private const val LINK_BEGIN_MARKER = "LINK_BEGIN"
         private const val LINK_END_MARKER = "LINK_END"
 
-        private val Attrs = R.styleable.CollapsableTextView
-        private val GravityAttr = R.styleable.CollapsableTextView_android_gravity
+        private val gravityAttr = R.styleable.CollapsableTextView_android_gravity
+        private val minLinesAttr = R.styleable.CollapsableTextView_android_minLines
+        private val isCollapsableAttr = R.styleable.CollapsableTextView_isCollapsable
     }
 }
 
 internal class LearnMoreSpan(
-    val url: String = "",
+    url: String = "",
     val clickListener: View.OnClickListener) : URLSpan(url) {
     override fun onClick(widget: View) {
         clickListener.onClick(widget)
diff --git a/packages/SettingsLib/SettingsTransition/Android.bp b/packages/SettingsLib/SettingsTransition/Android.bp
index e04af6c..6b9cbfa 100644
--- a/packages/SettingsLib/SettingsTransition/Android.bp
+++ b/packages/SettingsLib/SettingsTransition/Android.bp
@@ -30,5 +30,6 @@
         "com.android.extservices",
         "com.android.permission",
         "com.android.healthfitness",
+        "com.android.mediaprovider",
     ],
 }
diff --git a/packages/SettingsLib/TopIntroPreference/Android.bp b/packages/SettingsLib/TopIntroPreference/Android.bp
index 76e36dc..bf26264 100644
--- a/packages/SettingsLib/TopIntroPreference/Android.bp
+++ b/packages/SettingsLib/TopIntroPreference/Android.bp
@@ -32,5 +32,6 @@
         "com.android.cellbroadcast",
         "com.android.devicelock",
         "com.android.healthfitness",
+        "com.android.mediaprovider",
     ],
 }
diff --git a/packages/SettingsLib/res/drawable/ic_mobile_0_4_bar.xml b/packages/SettingsLib/res/drawable/ic_mobile_0_4_bar.xml
index d9a417f..54c8788 100644
--- a/packages/SettingsLib/res/drawable/ic_mobile_0_4_bar.xml
+++ b/packages/SettingsLib/res/drawable/ic_mobile_0_4_bar.xml
@@ -1,5 +1,5 @@
 <!--
-     Copyright (C) 2023 The Android Open Source Project
+     Copyright (C) 2025 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
@@ -14,24 +14,24 @@
      limitations under the License.
 -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="14dp"
-        android:height="14dp"
-        android:viewportWidth="14.0"
-        android:viewportHeight="14.0">
+    android:width="17dp"
+    android:height="12dp"
+    android:viewportWidth="16.0"
+    android:viewportHeight="12.0">
     <path
-        android:pathData="M8.25,3L9.25,3A0.5,0.5 0,0 1,9.75 3.5L9.75,13.5A0.5,0.5 0,0 1,9.25 14L8.25,14A0.5,0.5 0,0 1,7.75 13.5L7.75,3.5A0.5,0.5 0,0 1,8.25 3z"
-        android:fillAlpha="0.24"
+        android:pathData="M1.249,7C1.939,7 2.499,7.56 2.499,8.25L2.499,10.75C2.499,11.44 1.939,12 1.249,12C0.559,12 -0.001,11.44 -0.001,10.75L-0.001,8.25C-0.001,7.56 0.559,7 1.249,7Z"
+        android:fillAlpha="0.45"
         android:fillColor="#000"/>
     <path
-        android:pathData="M11.75,0L12.75,0A0.5,0.5 0,0 1,13.25 0.5L13.25,13.5A0.5,0.5 0,0 1,12.75 14L11.75,14A0.5,0.5 0,0 1,11.25 13.5L11.25,0.5A0.5,0.5 0,0 1,11.75 0z"
-        android:fillAlpha="0.24"
+        android:pathData="M5.749,4.5C6.439,4.5 6.999,5.06 6.999,5.75L6.999,10.75C6.999,11.44 6.439,12 5.749,12C5.059,12 4.499,11.44 4.499,10.75L4.499,5.75C4.499,5.06 5.059,4.5 5.749,4.5Z"
+        android:fillAlpha="0.45"
         android:fillColor="#000"/>
     <path
-        android:pathData="M1.25,10L2.25,10A0.5,0.5 0,0 1,2.75 10.5L2.75,13.5A0.5,0.5 0,0 1,2.25 14L1.25,14A0.5,0.5 0,0 1,0.75 13.5L0.75,10.5A0.5,0.5 0,0 1,1.25 10z"
-        android:fillAlpha="0.24"
+        android:pathData="M10.249,2C10.939,2 11.499,2.56 11.499,3.25L11.499,10.75C11.499,11.44 10.939,12 10.249,12C9.559,12 8.999,11.44 8.999,10.75L8.999,3.25C8.999,2.56 9.559,2 10.249,2Z"
+        android:fillAlpha="0.45"
         android:fillColor="#000"/>
     <path
-        android:pathData="M4.75,6.5L5.75,6.5A0.5,0.5 0,0 1,6.25 7L6.25,13.5A0.5,0.5 0,0 1,5.75 14L4.75,14A0.5,0.5 0,0 1,4.25 13.5L4.25,7A0.5,0.5 0,0 1,4.75 6.5z"
-        android:fillAlpha="0.24"
+        android:pathData="M14.749,0C15.439,0 15.999,0.56 15.999,1.25L15.999,10.75C15.999,11.44 15.439,12 14.749,12C14.059,12 13.499,11.44 13.499,10.75L13.499,1.25C13.499,0.56 14.059,0 14.749,0Z"
+        android:fillAlpha="0.45"
         android:fillColor="#000"/>
 </vector>
diff --git a/packages/SettingsLib/res/drawable/ic_mobile_0_4_bar_error.xml b/packages/SettingsLib/res/drawable/ic_mobile_0_4_bar_error.xml
index facc285..6015be8 100644
--- a/packages/SettingsLib/res/drawable/ic_mobile_0_4_bar_error.xml
+++ b/packages/SettingsLib/res/drawable/ic_mobile_0_4_bar_error.xml
@@ -1,28 +1,51 @@
+<!--
+     Copyright (C) 2025 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT 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="15dp"
-        android:height="14dp"
-        android:viewportWidth="15.0"
-        android:viewportHeight="14.0">
+    android:width="17dp"
+    android:height="12dp"
+    android:viewportWidth="16.0"
+    android:viewportHeight="12.0">
+    <group>
+        <!-- clip-out the circle which will contain the exclamation point (below this group) -->
+        <clip-path
+            android:pathData="
+            M0,0
+            V13.5,0
+            H13.5,20
+            V0,20
+            H0,0
+            M14.999,13.5C17.761,13.5 19.999,11.261 19.999,8.5C19.999,5.739 17.761,3.5 14.999,3.5C12.238,3.5 9.999,5.739 9.999,8.5C9.999,11.261 12.238,13.5 14.999,13.5Z" />
+        <path
+            android:pathData="M1.249,7C1.939,7 2.499,7.56 2.499,8.25L2.499,10.75C2.499,11.44 1.939,12 1.249,12C0.559,12 -0.001,11.44 -0.001,10.75L-0.001,8.25C-0.001,7.56 0.559,7 1.249,7Z"
+            android:fillAlpha="0.45"
+            android:fillColor="#000"/>
+        <path
+            android:pathData="M5.749,4.5C6.439,4.5 6.999,5.06 6.999,5.75L6.999,10.75C6.999,11.44 6.439,12 5.749,12C5.059,12 4.499,11.44 4.499,10.75L4.499,5.75C4.499,5.06 5.059,4.5 5.749,4.5Z"
+            android:fillAlpha="0.45"
+            android:fillColor="#000"/>
+        <path
+            android:pathData="M10.249,2C10.939,2 11.499,2.56 11.499,3.25L11.499,10.75C11.499,11.44 10.939,12 10.249,12C9.559,12 8.999,11.44 8.999,10.75L8.999,3.25C8.999,2.56 9.559,2 10.249,2Z"
+            android:fillAlpha="0.45"
+            android:fillColor="#000"/>
+        <path
+            android:pathData="M14.749,0C15.439,0 15.999,0.56 15.999,1.25L15.999,10.75C15.999,11.44 15.439,12 14.749,12C14.059,12 13.499,11.44 13.499,10.75L13.499,1.25C13.499,0.56 14.059,0 14.749,0Z"
+            android:fillAlpha="0.45"
+            android:fillColor="#000"/>
+    </group>
     <path
-        android:pathData="M7,3.5C7,3.224 7.224,3 7.5,3H8.5C8.776,3 9,3.224 9,3.5V13.5C9,13.776 8.776,14 8.5,14H7.5C7.224,14 7,13.776 7,13.5V3.5Z"
-        android:fillAlpha="0.3"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M0,10.5C0,10.224 0.224,10 0.5,10H1.5C1.776,10 2,10.224 2,10.5V13.5C2,13.776 1.776,14 1.5,14H0.5C0.224,14 0,13.776 0,13.5V10.5Z"
-        android:fillAlpha="0.3"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M3.5,7C3.5,6.724 3.724,6.5 4,6.5H5C5.276,6.5 5.5,6.724 5.5,7V13.5C5.5,13.776 5.276,14 5,14H4C3.724,14 3.5,13.776 3.5,13.5V7Z"
-        android:fillAlpha="0.3"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M11,0C10.724,0 10.5,0.224 10.5,0.5V3H12.5V0.5C12.5,0.224 12.276,0 12,0H11Z"
-        android:fillAlpha="0.3"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M12.25,13C12.25,12.448 12.698,12 13.25,12C13.802,12 14.25,12.448 14.25,13C14.25,13.552 13.802,14 13.25,14C12.698,14 12.25,13.552 12.25,13Z"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M12.25,5C12.25,4.724 12.474,4.5 12.75,4.5H13.75C14.026,4.5 14.25,4.724 14.25,5V10C14.25,10.276 14.026,10.5 13.75,10.5H12.75C12.474,10.5 12.25,10.276 12.25,10V5Z"
+        android:pathData="M14.999,5C14.589,5 14.249,5.34 14.249,5.75L14.249,8.75C14.249,9.16 14.589,9.5 14.999,9.5C15.409,9.5 15.749,9.16 15.749,8.75L15.749,5.75C15.749,5.34 15.409,5 14.999,5ZM14.999,12C15.409,12 15.749,11.66 15.749,11.25C15.749,10.84 15.409,10.5 14.999,10.5C14.589,10.5 14.249,10.84 14.249,11.25C14.249,11.66 14.589,12 14.999,12Z"
         android:fillColor="#000"/>
 </vector>
diff --git a/packages/SettingsLib/res/drawable/ic_mobile_0_5_bar.xml b/packages/SettingsLib/res/drawable/ic_mobile_0_5_bar.xml
index 2c05a93..7c85b9e 100644
--- a/packages/SettingsLib/res/drawable/ic_mobile_0_5_bar.xml
+++ b/packages/SettingsLib/res/drawable/ic_mobile_0_5_bar.xml
@@ -14,28 +14,28 @@
      limitations under the License.
 -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="16dp"
-        android:height="14dp"
-        android:viewportWidth="16.0"
-        android:viewportHeight="14.0">
+    android:width="21dp"
+    android:height="12dp"
+    android:viewportWidth="20.5"
+    android:viewportHeight="12.0">
     <path
-        android:pathData="M7.5,5L8.5,5A0.5,0.5 0,0 1,9 5.5L9,13.5A0.5,0.5 0,0 1,8.5 14L7.5,14A0.5,0.5 0,0 1,7 13.5L7,5.5A0.5,0.5 0,0 1,7.5 5z"
-        android:fillAlpha="0.24"
+        android:pathData="M1.249,7C1.939,7 2.499,7.56 2.499,8.25L2.499,10.75C2.499,11.44 1.939,12 1.249,12C0.559,12 -0.001,11.44 -0.001,10.75L-0.001,8.25C-0.001,7.56 0.559,7 1.249,7Z"
+        android:fillAlpha="0.45"
         android:fillColor="#000"/>
     <path
-        android:pathData="M11,2L12,2A0.5,0.5 0,0 1,12.5 2.5L12.5,13.5A0.5,0.5 0,0 1,12 14L11,14A0.5,0.5 0,0 1,10.5 13.5L10.5,2.5A0.5,0.5 0,0 1,11 2z"
-        android:fillAlpha="0.24"
+        android:pathData="M5.749,5C6.439,5 6.999,5.56 6.999,6.25L6.999,10.75C6.999,11.44 6.439,12 5.749,12C5.059,12 4.499,11.44 4.499,10.75L4.499,6.25C4.499,5.56 5.059,5 5.749,5Z"
+        android:fillAlpha="0.45"
         android:fillColor="#000"/>
     <path
-        android:pathData="M0.5,11L1.5,11A0.5,0.5 0,0 1,2 11.5L2,13.5A0.5,0.5 0,0 1,1.5 14L0.5,14A0.5,0.5 0,0 1,0 13.5L0,11.5A0.5,0.5 0,0 1,0.5 11z"
-        android:fillAlpha="0.24"
+        android:pathData="M10.249,3C10.939,3 11.499,3.56 11.499,4.25L11.499,10.75C11.499,11.44 10.939,12 10.249,12C9.559,12 8.999,11.44 8.999,10.75L8.999,4.25C8.999,3.56 9.559,3 10.249,3Z"
+        android:fillAlpha="0.45"
         android:fillColor="#000"/>
     <path
-        android:pathData="M14.5,0L15.5,0A0.5,0.5 0,0 1,16 0.5L16,13.5A0.5,0.5 0,0 1,15.5 14L14.5,14A0.5,0.5 0,0 1,14 13.5L14,0.5A0.5,0.5 0,0 1,14.5 0z"
-        android:fillAlpha="0.24"
+        android:pathData="M14.749,1.5C15.439,1.5 15.999,2.06 15.999,2.75L15.999,10.75C15.999,11.44 15.439,12 14.749,12C14.059,12 13.499,11.44 13.499,10.75L13.499,2.75C13.499,2.06 14.059,1.5 14.749,1.5Z"
+        android:fillAlpha="0.45"
         android:fillColor="#000"/>
     <path
-        android:pathData="M4,8L5,8A0.5,0.5 0,0 1,5.5 8.5L5.5,13.5A0.5,0.5 0,0 1,5 14L4,14A0.5,0.5 0,0 1,3.5 13.5L3.5,8.5A0.5,0.5 0,0 1,4 8z"
-        android:fillAlpha="0.24"
+        android:pathData="M19.249,0C19.939,0 20.499,0.56 20.499,1.25L20.499,10.75C20.499,11.44 19.939,12 19.249,12C18.559,12 17.999,11.44 17.999,10.75L17.999,1.25C17.999,0.56 18.559,0 19.249,0Z"
+        android:fillAlpha="0.45"
         android:fillColor="#000"/>
 </vector>
diff --git a/packages/SettingsLib/res/drawable/ic_mobile_0_5_bar_error.xml b/packages/SettingsLib/res/drawable/ic_mobile_0_5_bar_error.xml
index 328e45e..f75ec57 100644
--- a/packages/SettingsLib/res/drawable/ic_mobile_0_5_bar_error.xml
+++ b/packages/SettingsLib/res/drawable/ic_mobile_0_5_bar_error.xml
@@ -1,32 +1,54 @@
+<!--
+     Copyright (C) 2025 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT 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="14dp"
-        android:viewportWidth="18.0"
-        android:viewportHeight="14.0">
+    android:width="21dp"
+    android:height="12dp"
+    android:viewportHeight="12.0"
+    android:viewportWidth="20.5">
+    <!-- clip-out the circle which will contain the exclamation point (below this group) -->
+    <group>
+        <clip-path android:pathData="
+            M0,0
+            H20.5
+            V12.0
+            H0
+            Z
+            M19.499,13.5C22.261,13.5 24.499,11.261 24.499,8.5C24.499,5.739 22.261,3.5 19.499,3.5C16.738,3.5 14.499,5.739 14.499,8.5C14.499,11.261 16.738,13.5 19.499,13.5Z" />
+        <path
+            android:fillAlpha="0.45"
+            android:fillColor="#000"
+            android:pathData="M1.249,7C1.939,7 2.499,7.56 2.499,8.25L2.499,10.75C2.499,11.44 1.939,12 1.249,12C0.559,12 -0.001,11.44 -0.001,10.75L-0.001,8.25C-0.001,7.56 0.559,7 1.249,7Z" />
+        <path
+            android:fillAlpha="0.45"
+            android:fillColor="#000"
+            android:pathData="M5.749,5C6.439,5 6.999,5.56 6.999,6.25L6.999,10.75C6.999,11.44 6.439,12 5.749,12C5.059,12 4.499,11.44 4.499,10.75L4.499,6.25C4.499,5.56 5.059,5 5.749,5Z" />
+        <path
+            android:fillAlpha="0.45"
+            android:fillColor="#000"
+            android:pathData="M10.249,3C10.939,3 11.499,3.56 11.499,4.25L11.499,10.75C11.499,11.44 10.939,12 10.249,12C9.559,12 8.999,11.44 8.999,10.75L8.999,4.25C8.999,3.56 9.559,3 10.249,3Z" />
+        <path
+            android:fillAlpha="0.45"
+            android:fillColor="#000"
+            android:pathData="M14.749,1.5C15.439,1.5 15.999,2.06 15.999,2.75L15.999,10.75C15.999,11.44 15.439,12 14.749,12C14.059,12 13.499,11.44 13.499,10.75L13.499,2.75C13.499,2.06 14.059,1.5 14.749,1.5Z" />
+        <path
+            android:fillAlpha="0.45"
+            android:fillColor="#000"
+            android:pathData="M19.249,0C19.939,0 20.499,0.56 20.499,1.25L20.499,10.75C20.499,11.44 19.939,12 19.249,12C18.559,12 17.999,11.44 17.999,10.75L17.999,1.25C17.999,0.56 18.559,0 19.249,0Z" />
+    </group>
     <path
-        android:pathData="M14,0.5C14,0.224 14.224,0 14.5,0H15.5C15.776,0 16,0.224 16,0.5V3H14V0.5Z"
-        android:fillAlpha="0.3"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M10.5,2.5C10.5,2.224 10.724,2 11,2H12C12.276,2 12.5,2.224 12.5,2.5V13.5C12.5,13.776 12.276,14 12,14H11C10.724,14 10.5,13.776 10.5,13.5V2.5Z"
-        android:fillAlpha="0.3"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M7,5.5C7,5.224 7.224,5 7.5,5H8.5C8.776,5 9,5.224 9,5.5V13.5C9,13.776 8.776,14 8.5,14H7.5C7.224,14 7,13.776 7,13.5V5.5Z"
-        android:fillAlpha="0.3"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M0.5,11C0.224,11 0,11.224 0,11.5V13.5C0,13.776 0.224,14 0.5,14H1.5C1.776,14 2,13.776 2,13.5V11.5C2,11.224 1.776,11 1.5,11H0.5Z"
-        android:fillAlpha="0.3"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M4,8C3.724,8 3.5,8.224 3.5,8.5V13.5C3.5,13.776 3.724,14 4,14H5C5.276,14 5.5,13.776 5.5,13.5V8.5C5.5,8.224 5.276,8 5,8H4Z"
-        android:fillAlpha="0.3"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M16,13C16,12.448 16.448,12 17,12C17.552,12 18,12.448 18,13C18,13.552 17.552,14 17,14C16.448,14 16,13.552 16,13Z"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M16,5C16,4.724 16.224,4.5 16.5,4.5H17.5C17.776,4.5 18,4.724 18,5V10C18,10.276 17.776,10.5 17.5,10.5H16.5C16.224,10.5 16,10.276 16,10V5Z"
-        android:fillColor="#000"/>
+        android:fillColor="#000"
+        android:pathData="M19.499,5C19.089,5 18.749,5.34 18.749,5.75L18.749,8.75C18.749,9.16 19.089,9.5 19.499,9.5C19.909,9.5 20.249,9.16 20.249,8.75L20.249,5.75C20.249,5.34 19.909,5 19.499,5ZM19.499,12C19.909,12 20.249,11.66 20.249,11.25C20.249,10.84 19.909,10.5 19.499,10.5C19.089,10.5 18.749,10.84 18.749,11.25C18.749,11.66 19.089,12 19.499,12Z" />
 </vector>
diff --git a/packages/SettingsLib/res/drawable/ic_mobile_1_4_bar.xml b/packages/SettingsLib/res/drawable/ic_mobile_1_4_bar.xml
index b9054ba..df89aef 100644
--- a/packages/SettingsLib/res/drawable/ic_mobile_1_4_bar.xml
+++ b/packages/SettingsLib/res/drawable/ic_mobile_1_4_bar.xml
@@ -14,23 +14,23 @@
      limitations under the License.
 -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="14dp"
-        android:height="14dp"
-        android:viewportWidth="14.0"
-        android:viewportHeight="14.0">
+    android:width="17dp"
+    android:height="12dp"
+    android:viewportWidth="16.0"
+    android:viewportHeight="12.0">
     <path
-        android:pathData="M8.25,3L9.25,3A0.5,0.5 0,0 1,9.75 3.5L9.75,13.5A0.5,0.5 0,0 1,9.25 14L8.25,14A0.5,0.5 0,0 1,7.75 13.5L7.75,3.5A0.5,0.5 0,0 1,8.25 3z"
-        android:fillAlpha="0.24"
+        android:pathData="M1.249,7C1.939,7 2.499,7.56 2.499,8.25L2.499,10.75C2.499,11.44 1.939,12 1.249,12C0.559,12 -0.001,11.44 -0.001,10.75L-0.001,8.25C-0.001,7.56 0.559,7 1.249,7Z"
         android:fillColor="#000"/>
     <path
-        android:pathData="M11.75,0L12.75,0A0.5,0.5 0,0 1,13.25 0.5L13.25,13.5A0.5,0.5 0,0 1,12.75 14L11.75,14A0.5,0.5 0,0 1,11.25 13.5L11.25,0.5A0.5,0.5 0,0 1,11.75 0z"
-        android:fillAlpha="0.24"
+        android:pathData="M5.749,4.5C6.439,4.5 6.999,5.06 6.999,5.75L6.999,10.75C6.999,11.44 6.439,12 5.749,12C5.059,12 4.499,11.44 4.499,10.75L4.499,5.75C4.499,5.06 5.059,4.5 5.749,4.5Z"
+        android:fillAlpha="0.45"
         android:fillColor="#000"/>
     <path
-        android:pathData="M1.25,10L2.25,10A0.5,0.5 0,0 1,2.75 10.5L2.75,13.5A0.5,0.5 0,0 1,2.25 14L1.25,14A0.5,0.5 0,0 1,0.75 13.5L0.75,10.5A0.5,0.5 0,0 1,1.25 10z"
+        android:pathData="M10.249,2C10.939,2 11.499,2.56 11.499,3.25L11.499,10.75C11.499,11.44 10.939,12 10.249,12C9.559,12 8.999,11.44 8.999,10.75L8.999,3.25C8.999,2.56 9.559,2 10.249,2Z"
+        android:fillAlpha="0.45"
         android:fillColor="#000"/>
     <path
-        android:pathData="M4.75,6.5L5.75,6.5A0.5,0.5 0,0 1,6.25 7L6.25,13.5A0.5,0.5 0,0 1,5.75 14L4.75,14A0.5,0.5 0,0 1,4.25 13.5L4.25,7A0.5,0.5 0,0 1,4.75 6.5z"
-        android:fillAlpha="0.24"
+        android:pathData="M14.749,0C15.439,0 15.999,0.56 15.999,1.25L15.999,10.75C15.999,11.44 15.439,12 14.749,12C14.059,12 13.499,11.44 13.499,10.75L13.499,1.25C13.499,0.56 14.059,0 14.749,0Z"
+        android:fillAlpha="0.45"
         android:fillColor="#000"/>
 </vector>
diff --git a/packages/SettingsLib/res/drawable/ic_mobile_1_4_bar_error.xml b/packages/SettingsLib/res/drawable/ic_mobile_1_4_bar_error.xml
index 03a9349..fb73b6b 100644
--- a/packages/SettingsLib/res/drawable/ic_mobile_1_4_bar_error.xml
+++ b/packages/SettingsLib/res/drawable/ic_mobile_1_4_bar_error.xml
@@ -1,27 +1,35 @@
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="15dp"
-        android:height="14dp"
-        android:viewportWidth="15.0"
-        android:viewportHeight="14.0">
+    android:width="17dp"
+    android:height="12dp"
+    android:viewportWidth="16.0"
+    android:viewportHeight="12.0">
+    <group>
+        <!-- clip-out the circle which will contain the exclamation point (below this group) -->
+        <clip-path
+            android:pathData="
+            M0,0
+            V13.5,0
+            H13.5,20
+            V0,20
+            H0,0
+            M14.999,13.5C17.761,13.5 19.999,11.261 19.999,8.5C19.999,5.739 17.761,3.5 14.999,3.5C12.238,3.5 9.999,5.739 9.999,8.5C9.999,11.261 12.238,13.5 14.999,13.5Z" />
+        <path
+            android:pathData="M1.249,7C1.939,7 2.499,7.56 2.499,8.25L2.499,10.75C2.499,11.44 1.939,12 1.249,12C0.559,12 -0.001,11.44 -0.001,10.75L-0.001,8.25C-0.001,7.56 0.559,7 1.249,7Z"
+            android:fillColor="#000"/>
+        <path
+            android:pathData="M5.749,4.5C6.439,4.5 6.999,5.06 6.999,5.75L6.999,10.75C6.999,11.44 6.439,12 5.749,12C5.059,12 4.499,11.44 4.499,10.75L4.499,5.75C4.499,5.06 5.059,4.5 5.749,4.5Z"
+            android:fillAlpha="0.45"
+            android:fillColor="#000"/>
+        <path
+            android:pathData="M10.249,2C10.939,2 11.499,2.56 11.499,3.25L11.499,10.75C11.499,11.44 10.939,12 10.249,12C9.559,12 8.999,11.44 8.999,10.75L8.999,3.25C8.999,2.56 9.559,2 10.249,2Z"
+            android:fillAlpha="0.45"
+            android:fillColor="#000"/>
+        <path
+            android:pathData="M14.749,0C15.439,0 15.999,0.56 15.999,1.25L15.999,10.75C15.999,11.44 15.439,12 14.749,12C14.059,12 13.499,11.44 13.499,10.75L13.499,1.25C13.499,0.56 14.059,0 14.749,0Z"
+            android:fillAlpha="0.45"
+            android:fillColor="#000"/>
+    </group>
     <path
-        android:pathData="M7,3.5C7,3.224 7.224,3 7.5,3H8.5C8.776,3 9,3.224 9,3.5V13.5C9,13.776 8.776,14 8.5,14H7.5C7.224,14 7,13.776 7,13.5V3.5Z"
-        android:fillAlpha="0.3"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M0,10.5C0,10.224 0.224,10 0.5,10H1.5C1.776,10 2,10.224 2,10.5V13.5C2,13.776 1.776,14 1.5,14H0.5C0.224,14 0,13.776 0,13.5V10.5Z"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M3.5,7C3.5,6.724 3.724,6.5 4,6.5H5C5.276,6.5 5.5,6.724 5.5,7V13.5C5.5,13.776 5.276,14 5,14H4C3.724,14 3.5,13.776 3.5,13.5V7Z"
-        android:fillAlpha="0.3"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M11,0C10.724,0 10.5,0.224 10.5,0.5V3H12.5V0.5C12.5,0.224 12.276,0 12,0H11Z"
-        android:fillAlpha="0.3"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M12.25,13C12.25,12.448 12.698,12 13.25,12C13.802,12 14.25,12.448 14.25,13C14.25,13.552 13.802,14 13.25,14C12.698,14 12.25,13.552 12.25,13Z"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M12.25,5C12.25,4.724 12.474,4.5 12.75,4.5H13.75C14.026,4.5 14.25,4.724 14.25,5V10C14.25,10.276 14.026,10.5 13.75,10.5H12.75C12.474,10.5 12.25,10.276 12.25,10V5Z"
+        android:pathData="M14.999,5C14.589,5 14.249,5.34 14.249,5.75L14.249,8.75C14.249,9.16 14.589,9.5 14.999,9.5C15.409,9.5 15.749,9.16 15.749,8.75L15.749,5.75C15.749,5.34 15.409,5 14.999,5ZM14.999,12C15.409,12 15.749,11.66 15.749,11.25C15.749,10.84 15.409,10.5 14.999,10.5C14.589,10.5 14.249,10.84 14.249,11.25C14.249,11.66 14.589,12 14.999,12Z"
         android:fillColor="#000"/>
 </vector>
diff --git a/packages/SettingsLib/res/drawable/ic_mobile_1_5_bar.xml b/packages/SettingsLib/res/drawable/ic_mobile_1_5_bar.xml
index 774e917..5b7d8da 100644
--- a/packages/SettingsLib/res/drawable/ic_mobile_1_5_bar.xml
+++ b/packages/SettingsLib/res/drawable/ic_mobile_1_5_bar.xml
@@ -14,27 +14,27 @@
      limitations under the License.
 -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="16dp"
-        android:height="14dp"
-        android:viewportWidth="16.0"
-        android:viewportHeight="14.0">
+    android:width="21dp"
+    android:height="12dp"
+    android:viewportWidth="20.5"
+    android:viewportHeight="12.0">
     <path
-        android:pathData="M7.5,5L8.5,5A0.5,0.5 0,0 1,9 5.5L9,13.5A0.5,0.5 0,0 1,8.5 14L7.5,14A0.5,0.5 0,0 1,7 13.5L7,5.5A0.5,0.5 0,0 1,7.5 5z"
-        android:fillAlpha="0.24"
+        android:pathData="M1.249,7C1.939,7 2.499,7.56 2.499,8.25L2.499,10.75C2.499,11.44 1.939,12 1.249,12C0.559,12 -0.001,11.44 -0.001,10.75L-0.001,8.25C-0.001,7.56 0.559,7 1.249,7Z"
         android:fillColor="#000"/>
     <path
-        android:pathData="M11,2L12,2A0.5,0.5 0,0 1,12.5 2.5L12.5,13.5A0.5,0.5 0,0 1,12 14L11,14A0.5,0.5 0,0 1,10.5 13.5L10.5,2.5A0.5,0.5 0,0 1,11 2z"
-        android:fillAlpha="0.24"
+        android:pathData="M5.749,5C6.439,5 6.999,5.56 6.999,6.25L6.999,10.75C6.999,11.44 6.439,12 5.749,12C5.059,12 4.499,11.44 4.499,10.75L4.499,6.25C4.499,5.56 5.059,5 5.749,5Z"
+        android:fillAlpha="0.45"
         android:fillColor="#000"/>
     <path
-        android:pathData="M0.5,11L1.5,11A0.5,0.5 0,0 1,2 11.5L2,13.5A0.5,0.5 0,0 1,1.5 14L0.5,14A0.5,0.5 0,0 1,0 13.5L0,11.5A0.5,0.5 0,0 1,0.5 11z"
+        android:pathData="M10.249,3C10.939,3 11.499,3.56 11.499,4.25L11.499,10.75C11.499,11.44 10.939,12 10.249,12C9.559,12 8.999,11.44 8.999,10.75L8.999,4.25C8.999,3.56 9.559,3 10.249,3Z"
+        android:fillAlpha="0.45"
         android:fillColor="#000"/>
     <path
-        android:pathData="M14.5,0L15.5,0A0.5,0.5 0,0 1,16 0.5L16,13.5A0.5,0.5 0,0 1,15.5 14L14.5,14A0.5,0.5 0,0 1,14 13.5L14,0.5A0.5,0.5 0,0 1,14.5 0z"
-        android:fillAlpha="0.24"
+        android:pathData="M14.749,1.5C15.439,1.5 15.999,2.06 15.999,2.75L15.999,10.75C15.999,11.44 15.439,12 14.749,12C14.059,12 13.499,11.44 13.499,10.75L13.499,2.75C13.499,2.06 14.059,1.5 14.749,1.5Z"
+        android:fillAlpha="0.45"
         android:fillColor="#000"/>
     <path
-        android:pathData="M4,8L5,8A0.5,0.5 0,0 1,5.5 8.5L5.5,13.5A0.5,0.5 0,0 1,5 14L4,14A0.5,0.5 0,0 1,3.5 13.5L3.5,8.5A0.5,0.5 0,0 1,4 8z"
-        android:fillAlpha="0.24"
+        android:pathData="M19.249,0C19.939,0 20.499,0.56 20.499,1.25L20.499,10.75C20.499,11.44 19.939,12 19.249,12C18.559,12 17.999,11.44 17.999,10.75L17.999,1.25C17.999,0.56 18.559,0 19.249,0Z"
+        android:fillAlpha="0.45"
         android:fillColor="#000"/>
 </vector>
diff --git a/packages/SettingsLib/res/drawable/ic_mobile_1_5_bar_error.xml b/packages/SettingsLib/res/drawable/ic_mobile_1_5_bar_error.xml
index 343ec1b..27e233d 100644
--- a/packages/SettingsLib/res/drawable/ic_mobile_1_5_bar_error.xml
+++ b/packages/SettingsLib/res/drawable/ic_mobile_1_5_bar_error.xml
@@ -1,31 +1,53 @@
+<!--
+     Copyright (C) 2025 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT 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="14dp"
-        android:viewportWidth="18.0"
-        android:viewportHeight="14.0">
+    android:width="21dp"
+    android:height="12dp"
+    android:viewportHeight="12.0"
+    android:viewportWidth="20.5">
+    <!-- clip-out the circle which will contain the exclamation point (below this group) -->
+    <group>
+        <clip-path android:pathData="
+            M0,0
+            H20.5
+            V12.0
+            H0
+            Z
+            M19.499,13.5C22.261,13.5 24.499,11.261 24.499,8.5C24.499,5.739 22.261,3.5 19.499,3.5C16.738,3.5 14.499,5.739 14.499,8.5C14.499,11.261 16.738,13.5 19.499,13.5Z" />
+        <path
+            android:fillColor="#000"
+            android:pathData="M1.249,7C1.939,7 2.499,7.56 2.499,8.25L2.499,10.75C2.499,11.44 1.939,12 1.249,12C0.559,12 -0.001,11.44 -0.001,10.75L-0.001,8.25C-0.001,7.56 0.559,7 1.249,7Z" />
+        <path
+            android:fillAlpha="0.45"
+            android:fillColor="#000"
+            android:pathData="M5.749,5C6.439,5 6.999,5.56 6.999,6.25L6.999,10.75C6.999,11.44 6.439,12 5.749,12C5.059,12 4.499,11.44 4.499,10.75L4.499,6.25C4.499,5.56 5.059,5 5.749,5Z" />
+        <path
+            android:fillAlpha="0.45"
+            android:fillColor="#000"
+            android:pathData="M10.249,3C10.939,3 11.499,3.56 11.499,4.25L11.499,10.75C11.499,11.44 10.939,12 10.249,12C9.559,12 8.999,11.44 8.999,10.75L8.999,4.25C8.999,3.56 9.559,3 10.249,3Z" />
+        <path
+            android:fillAlpha="0.45"
+            android:fillColor="#000"
+            android:pathData="M14.749,1.5C15.439,1.5 15.999,2.06 15.999,2.75L15.999,10.75C15.999,11.44 15.439,12 14.749,12C14.059,12 13.499,11.44 13.499,10.75L13.499,2.75C13.499,2.06 14.059,1.5 14.749,1.5Z" />
+        <path
+            android:fillAlpha="0.45"
+            android:fillColor="#000"
+            android:pathData="M19.249,0C19.939,0 20.499,0.56 20.499,1.25L20.499,10.75C20.499,11.44 19.939,12 19.249,12C18.559,12 17.999,11.44 17.999,10.75L17.999,1.25C17.999,0.56 18.559,0 19.249,0Z" />
+    </group>
     <path
-        android:pathData="M7,5.5C7,5.224 7.224,5 7.5,5H8.5C8.776,5 9,5.224 9,5.5V13.5C9,13.776 8.776,14 8.5,14H7.5C7.224,14 7,13.776 7,13.5V5.5Z"
-        android:fillAlpha="0.3"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M10.5,2.5C10.5,2.224 10.724,2 11,2H12C12.276,2 12.5,2.224 12.5,2.5V13.5C12.5,13.776 12.276,14 12,14H11C10.724,14 10.5,13.776 10.5,13.5V2.5Z"
-        android:fillAlpha="0.3"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M0,11.5C0,11.224 0.224,11 0.5,11H1.5C1.776,11 2,11.224 2,11.5V13.5C2,13.776 1.776,14 1.5,14H0.5C0.224,14 0,13.776 0,13.5V11.5Z"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M3.5,8.5C3.5,8.224 3.724,8 4,8H5C5.276,8 5.5,8.224 5.5,8.5V13.5C5.5,13.776 5.276,14 5,14H4C3.724,14 3.5,13.776 3.5,13.5V8.5Z"
-        android:fillAlpha="0.3"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M14.5,0C14.224,0 14,0.224 14,0.5V3H16V0.5C16,0.224 15.776,0 15.5,0H14.5Z"
-        android:fillAlpha="0.3"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M16,13C16,12.448 16.448,12 17,12C17.552,12 18,12.448 18,13C18,13.552 17.552,14 17,14C16.448,14 16,13.552 16,13Z"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M16,5C16,4.724 16.224,4.5 16.5,4.5H17.5C17.776,4.5 18,4.724 18,5V10C18,10.276 17.776,10.5 17.5,10.5H16.5C16.224,10.5 16,10.276 16,10V5Z"
-        android:fillColor="#000"/>
+        android:fillColor="#000"
+        android:pathData="M19.499,5C19.089,5 18.749,5.34 18.749,5.75L18.749,8.75C18.749,9.16 19.089,9.5 19.499,9.5C19.909,9.5 20.249,9.16 20.249,8.75L20.249,5.75C20.249,5.34 19.909,5 19.499,5ZM19.499,12C19.909,12 20.249,11.66 20.249,11.25C20.249,10.84 19.909,10.5 19.499,10.5C19.089,10.5 18.749,10.84 18.749,11.25C18.749,11.66 19.089,12 19.499,12Z" />
 </vector>
diff --git a/packages/SettingsLib/res/drawable/ic_mobile_2_4_bar.xml b/packages/SettingsLib/res/drawable/ic_mobile_2_4_bar.xml
index b699203..e7ebf6f 100644
--- a/packages/SettingsLib/res/drawable/ic_mobile_2_4_bar.xml
+++ b/packages/SettingsLib/res/drawable/ic_mobile_2_4_bar.xml
@@ -1,5 +1,5 @@
 <!--
-     Copyright (C) 2023 The Android Open Source Project
+     Copyright (C) 2025 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
@@ -14,22 +14,22 @@
      limitations under the License.
 -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="14dp"
-        android:height="14dp"
-        android:viewportWidth="14.0"
-        android:viewportHeight="14.0">
+    android:width="17dp"
+    android:height="12dp"
+    android:viewportWidth="16.0"
+    android:viewportHeight="12.0">
     <path
-        android:pathData="M8.25,3L9.25,3A0.5,0.5 0,0 1,9.75 3.5L9.75,13.5A0.5,0.5 0,0 1,9.25 14L8.25,14A0.5,0.5 0,0 1,7.75 13.5L7.75,3.5A0.5,0.5 0,0 1,8.25 3z"
-        android:fillAlpha="0.24"
+        android:pathData="M1.249,7C1.939,7 2.499,7.56 2.499,8.25L2.499,10.75C2.499,11.44 1.939,12 1.249,12C0.559,12 -0.001,11.44 -0.001,10.75L-0.001,8.25C-0.001,7.56 0.559,7 1.249,7Z"
         android:fillColor="#000"/>
     <path
-        android:pathData="M11.75,0L12.75,0A0.5,0.5 0,0 1,13.25 0.5L13.25,13.5A0.5,0.5 0,0 1,12.75 14L11.75,14A0.5,0.5 0,0 1,11.25 13.5L11.25,0.5A0.5,0.5 0,0 1,11.75 0z"
-        android:fillAlpha="0.24"
+        android:pathData="M5.749,4.5C6.439,4.5 6.999,5.06 6.999,5.75L6.999,10.75C6.999,11.44 6.439,12 5.749,12C5.059,12 4.499,11.44 4.499,10.75L4.499,5.75C4.499,5.06 5.059,4.5 5.749,4.5Z"
         android:fillColor="#000"/>
     <path
-        android:pathData="M1.25,10L2.25,10A0.5,0.5 0,0 1,2.75 10.5L2.75,13.5A0.5,0.5 0,0 1,2.25 14L1.25,14A0.5,0.5 0,0 1,0.75 13.5L0.75,10.5A0.5,0.5 0,0 1,1.25 10z"
+        android:pathData="M10.249,2C10.939,2 11.499,2.56 11.499,3.25L11.499,10.75C11.499,11.44 10.939,12 10.249,12C9.559,12 8.999,11.44 8.999,10.75L8.999,3.25C8.999,2.56 9.559,2 10.249,2Z"
+        android:fillAlpha="0.45"
         android:fillColor="#000"/>
     <path
-        android:pathData="M4.75,6.5L5.75,6.5A0.5,0.5 0,0 1,6.25 7L6.25,13.5A0.5,0.5 0,0 1,5.75 14L4.75,14A0.5,0.5 0,0 1,4.25 13.5L4.25,7A0.5,0.5 0,0 1,4.75 6.5z"
+        android:pathData="M14.749,0C15.439,0 15.999,0.56 15.999,1.25L15.999,10.75C15.999,11.44 15.439,12 14.749,12C14.059,12 13.499,11.44 13.499,10.75L13.499,1.25C13.499,0.56 14.059,0 14.749,0Z"
+        android:fillAlpha="0.45"
         android:fillColor="#000"/>
 </vector>
diff --git a/packages/SettingsLib/res/drawable/ic_mobile_2_4_bar_error.xml b/packages/SettingsLib/res/drawable/ic_mobile_2_4_bar_error.xml
index ba8649b..49ae9e4 100644
--- a/packages/SettingsLib/res/drawable/ic_mobile_2_4_bar_error.xml
+++ b/packages/SettingsLib/res/drawable/ic_mobile_2_4_bar_error.xml
@@ -1,26 +1,49 @@
+<!--
+     Copyright (C) 2025 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT 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="15dp"
-        android:height="14dp"
-        android:viewportWidth="15.0"
-        android:viewportHeight="14.0">
+    android:width="17dp"
+    android:height="12dp"
+    android:viewportWidth="16.0"
+    android:viewportHeight="12.0">
+    <group>
+        <!-- clip-out the circle which will contain the exclamation point (below this group) -->
+        <clip-path
+            android:pathData="
+            M0,0
+            V13.5,0
+            H13.5,20
+            V0,20
+            H0,0
+            M14.999,13.5C17.761,13.5 19.999,11.261 19.999,8.5C19.999,5.739 17.761,3.5 14.999,3.5C12.238,3.5 9.999,5.739 9.999,8.5C9.999,11.261 12.238,13.5 14.999,13.5Z" />
+        <path
+            android:pathData="M1.249,7C1.939,7 2.499,7.56 2.499,8.25L2.499,10.75C2.499,11.44 1.939,12 1.249,12C0.559,12 -0.001,11.44 -0.001,10.75L-0.001,8.25C-0.001,7.56 0.559,7 1.249,7Z"
+            android:fillColor="#000"/>
+        <path
+            android:pathData="M5.749,4.5C6.439,4.5 6.999,5.06 6.999,5.75L6.999,10.75C6.999,11.44 6.439,12 5.749,12C5.059,12 4.499,11.44 4.499,10.75L4.499,5.75C4.499,5.06 5.059,4.5 5.749,4.5Z"
+            android:fillColor="#000"/>
+        <path
+            android:pathData="M10.249,2C10.939,2 11.499,2.56 11.499,3.25L11.499,10.75C11.499,11.44 10.939,12 10.249,12C9.559,12 8.999,11.44 8.999,10.75L8.999,3.25C8.999,2.56 9.559,2 10.249,2Z"
+            android:fillAlpha="0.45"
+            android:fillColor="#000"/>
+        <path
+            android:pathData="M14.749,0C15.439,0 15.999,0.56 15.999,1.25L15.999,10.75C15.999,11.44 15.439,12 14.749,12C14.059,12 13.499,11.44 13.499,10.75L13.499,1.25C13.499,0.56 14.059,0 14.749,0Z"
+            android:fillAlpha="0.45"
+            android:fillColor="#000"/>
+    </group>
     <path
-        android:pathData="M7,3.5C7,3.224 7.224,3 7.5,3H8.5C8.776,3 9,3.224 9,3.5V13.5C9,13.776 8.776,14 8.5,14H7.5C7.224,14 7,13.776 7,13.5V3.5Z"
-        android:fillAlpha="0.3"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M0,10.5C0,10.224 0.224,10 0.5,10H1.5C1.776,10 2,10.224 2,10.5V13.5C2,13.776 1.776,14 1.5,14H0.5C0.224,14 0,13.776 0,13.5V10.5Z"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M3.5,7C3.5,6.724 3.724,6.5 4,6.5H5C5.276,6.5 5.5,6.724 5.5,7V13.5C5.5,13.776 5.276,14 5,14H4C3.724,14 3.5,13.776 3.5,13.5V7Z"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M11,0C10.724,0 10.5,0.224 10.5,0.5V3H12.5V0.5C12.5,0.224 12.276,0 12,0H11Z"
-        android:fillAlpha="0.3"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M12.25,13C12.25,12.448 12.698,12 13.25,12C13.802,12 14.25,12.448 14.25,13C14.25,13.552 13.802,14 13.25,14C12.698,14 12.25,13.552 12.25,13Z"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M12.25,5C12.25,4.724 12.474,4.5 12.75,4.5H13.75C14.026,4.5 14.25,4.724 14.25,5V10C14.25,10.276 14.026,10.5 13.75,10.5H12.75C12.474,10.5 12.25,10.276 12.25,10V5Z"
+        android:pathData="M14.999,5C14.589,5 14.249,5.34 14.249,5.75L14.249,8.75C14.249,9.16 14.589,9.5 14.999,9.5C15.409,9.5 15.749,9.16 15.749,8.75L15.749,5.75C15.749,5.34 15.409,5 14.999,5ZM14.999,12C15.409,12 15.749,11.66 15.749,11.25C15.749,10.84 15.409,10.5 14.999,10.5C14.589,10.5 14.249,10.84 14.249,11.25C14.249,11.66 14.589,12 14.999,12Z"
         android:fillColor="#000"/>
 </vector>
diff --git a/packages/SettingsLib/res/drawable/ic_mobile_2_5_bar.xml b/packages/SettingsLib/res/drawable/ic_mobile_2_5_bar.xml
index 43fa734..19387bc 100644
--- a/packages/SettingsLib/res/drawable/ic_mobile_2_5_bar.xml
+++ b/packages/SettingsLib/res/drawable/ic_mobile_2_5_bar.xml
@@ -1,5 +1,5 @@
 <!--
-     Copyright (C) 2023 The Android Open Source Project
+     Copyright (C) 2025 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
@@ -14,26 +14,26 @@
      limitations under the License.
 -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="16dp"
-        android:height="14dp"
-        android:viewportWidth="16.0"
-        android:viewportHeight="14.0">
+    android:width="21dp"
+    android:height="12dp"
+    android:viewportWidth="20.5"
+    android:viewportHeight="12.0">
     <path
-        android:pathData="M7.5,5L8.5,5A0.5,0.5 0,0 1,9 5.5L9,13.5A0.5,0.5 0,0 1,8.5 14L7.5,14A0.5,0.5 0,0 1,7 13.5L7,5.5A0.5,0.5 0,0 1,7.5 5z"
-        android:fillAlpha="0.24"
+        android:pathData="M1.249,7C1.939,7 2.499,7.56 2.499,8.25L2.499,10.75C2.499,11.44 1.939,12 1.249,12C0.559,12 -0.001,11.44 -0.001,10.75L-0.001,8.25C-0.001,7.56 0.559,7 1.249,7Z"
         android:fillColor="#000"/>
     <path
-        android:pathData="M11,2L12,2A0.5,0.5 0,0 1,12.5 2.5L12.5,13.5A0.5,0.5 0,0 1,12 14L11,14A0.5,0.5 0,0 1,10.5 13.5L10.5,2.5A0.5,0.5 0,0 1,11 2z"
-        android:fillAlpha="0.24"
+        android:pathData="M5.749,5C6.439,5 6.999,5.56 6.999,6.25L6.999,10.75C6.999,11.44 6.439,12 5.749,12C5.059,12 4.499,11.44 4.499,10.75L4.499,6.25C4.499,5.56 5.059,5 5.749,5Z"
         android:fillColor="#000"/>
     <path
-        android:pathData="M0.5,11L1.5,11A0.5,0.5 0,0 1,2 11.5L2,13.5A0.5,0.5 0,0 1,1.5 14L0.5,14A0.5,0.5 0,0 1,0 13.5L0,11.5A0.5,0.5 0,0 1,0.5 11z"
+        android:pathData="M10.249,3C10.939,3 11.499,3.56 11.499,4.25L11.499,10.75C11.499,11.44 10.939,12 10.249,12C9.559,12 8.999,11.44 8.999,10.75L8.999,4.25C8.999,3.56 9.559,3 10.249,3Z"
+        android:fillAlpha="0.45"
         android:fillColor="#000"/>
     <path
-        android:pathData="M14.5,0L15.5,0A0.5,0.5 0,0 1,16 0.5L16,13.5A0.5,0.5 0,0 1,15.5 14L14.5,14A0.5,0.5 0,0 1,14 13.5L14,0.5A0.5,0.5 0,0 1,14.5 0z"
-        android:fillAlpha="0.24"
+        android:pathData="M14.749,1.5C15.439,1.5 15.999,2.06 15.999,2.75L15.999,10.75C15.999,11.44 15.439,12 14.749,12C14.059,12 13.499,11.44 13.499,10.75L13.499,2.75C13.499,2.06 14.059,1.5 14.749,1.5Z"
+        android:fillAlpha="0.45"
         android:fillColor="#000"/>
     <path
-        android:pathData="M4,8L5,8A0.5,0.5 0,0 1,5.5 8.5L5.5,13.5A0.5,0.5 0,0 1,5 14L4,14A0.5,0.5 0,0 1,3.5 13.5L3.5,8.5A0.5,0.5 0,0 1,4 8z"
+        android:pathData="M19.249,0C19.939,0 20.499,0.56 20.499,1.25L20.499,10.75C20.499,11.44 19.939,12 19.249,12C18.559,12 17.999,11.44 17.999,10.75L17.999,1.25C17.999,0.56 18.559,0 19.249,0Z"
+        android:fillAlpha="0.45"
         android:fillColor="#000"/>
 </vector>
diff --git a/packages/SettingsLib/res/drawable/ic_mobile_2_5_bar_error.xml b/packages/SettingsLib/res/drawable/ic_mobile_2_5_bar_error.xml
index 6309e17..322ede6 100644
--- a/packages/SettingsLib/res/drawable/ic_mobile_2_5_bar_error.xml
+++ b/packages/SettingsLib/res/drawable/ic_mobile_2_5_bar_error.xml
@@ -1,30 +1,52 @@
+<!--
+     Copyright (C) 2025 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT 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="14dp"
-        android:viewportWidth="18.0"
-        android:viewportHeight="14.0">
+    android:width="21dp"
+    android:height="12dp"
+    android:viewportHeight="12.0"
+    android:viewportWidth="20.5">
+    <!-- clip-out the circle which will contain the exclamation point (below this group) -->
+    <group>
+        <clip-path android:pathData="
+            M0,0
+            H20.5
+            V12.0
+            H0
+            Z
+            M19.499,13.5C22.261,13.5 24.499,11.261 24.499,8.5C24.499,5.739 22.261,3.5 19.499,3.5C16.738,3.5 14.499,5.739 14.499,8.5C14.499,11.261 16.738,13.5 19.499,13.5Z" />
+        <path
+            android:fillColor="#000"
+            android:pathData="M1.249,7C1.939,7 2.499,7.56 2.499,8.25L2.499,10.75C2.499,11.44 1.939,12 1.249,12C0.559,12 -0.001,11.44 -0.001,10.75L-0.001,8.25C-0.001,7.56 0.559,7 1.249,7Z" />
+        <path
+            android:fillColor="#000"
+            android:pathData="M5.749,5C6.439,5 6.999,5.56 6.999,6.25L6.999,10.75C6.999,11.44 6.439,12 5.749,12C5.059,12 4.499,11.44 4.499,10.75L4.499,6.25C4.499,5.56 5.059,5 5.749,5Z" />
+        <path
+            android:fillAlpha="0.45"
+            android:fillColor="#000"
+            android:pathData="M10.249,3C10.939,3 11.499,3.56 11.499,4.25L11.499,10.75C11.499,11.44 10.939,12 10.249,12C9.559,12 8.999,11.44 8.999,10.75L8.999,4.25C8.999,3.56 9.559,3 10.249,3Z" />
+        <path
+            android:fillAlpha="0.45"
+            android:fillColor="#000"
+            android:pathData="M14.749,1.5C15.439,1.5 15.999,2.06 15.999,2.75L15.999,10.75C15.999,11.44 15.439,12 14.749,12C14.059,12 13.499,11.44 13.499,10.75L13.499,2.75C13.499,2.06 14.059,1.5 14.749,1.5Z" />
+        <path
+            android:fillAlpha="0.45"
+            android:fillColor="#000"
+            android:pathData="M19.249,0C19.939,0 20.499,0.56 20.499,1.25L20.499,10.75C20.499,11.44 19.939,12 19.249,12C18.559,12 17.999,11.44 17.999,10.75L17.999,1.25C17.999,0.56 18.559,0 19.249,0Z" />
+    </group>
     <path
-        android:pathData="M7,5.5C7,5.224 7.224,5 7.5,5H8.5C8.776,5 9,5.224 9,5.5V13.5C9,13.776 8.776,14 8.5,14H7.5C7.224,14 7,13.776 7,13.5V5.5Z"
-        android:fillAlpha="0.3"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M10.5,2.5C10.5,2.224 10.724,2 11,2H12C12.276,2 12.5,2.224 12.5,2.5V13.5C12.5,13.776 12.276,14 12,14H11C10.724,14 10.5,13.776 10.5,13.5V2.5Z"
-        android:fillAlpha="0.3"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M0,11.5C0,11.224 0.224,11 0.5,11H1.5C1.776,11 2,11.224 2,11.5V13.5C2,13.776 1.776,14 1.5,14H0.5C0.224,14 0,13.776 0,13.5V11.5Z"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M3.5,8.5C3.5,8.224 3.724,8 4,8H5C5.276,8 5.5,8.224 5.5,8.5V13.5C5.5,13.776 5.276,14 5,14H4C3.724,14 3.5,13.776 3.5,13.5V8.5Z"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M14.5,0C14.224,0 14,0.224 14,0.5V3H16V0.5C16,0.224 15.776,0 15.5,0H14.5Z"
-        android:fillAlpha="0.3"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M16,13C16,12.448 16.448,12 17,12C17.552,12 18,12.448 18,13C18,13.552 17.552,14 17,14C16.448,14 16,13.552 16,13Z"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M16,5C16,4.724 16.224,4.5 16.5,4.5H17.5C17.776,4.5 18,4.724 18,5V10C18,10.276 17.776,10.5 17.5,10.5H16.5C16.224,10.5 16,10.276 16,10V5Z"
-        android:fillColor="#000"/>
+        android:fillColor="#000"
+        android:pathData="M19.499,5C19.089,5 18.749,5.34 18.749,5.75L18.749,8.75C18.749,9.16 19.089,9.5 19.499,9.5C19.909,9.5 20.249,9.16 20.249,8.75L20.249,5.75C20.249,5.34 19.909,5 19.499,5ZM19.499,12C19.909,12 20.249,11.66 20.249,11.25C20.249,10.84 19.909,10.5 19.499,10.5C19.089,10.5 18.749,10.84 18.749,11.25C18.749,11.66 19.089,12 19.499,12Z" />
 </vector>
diff --git a/packages/SettingsLib/res/drawable/ic_mobile_3_4_bar.xml b/packages/SettingsLib/res/drawable/ic_mobile_3_4_bar.xml
index 6a218b3..b84b658 100644
--- a/packages/SettingsLib/res/drawable/ic_mobile_3_4_bar.xml
+++ b/packages/SettingsLib/res/drawable/ic_mobile_3_4_bar.xml
@@ -1,5 +1,5 @@
 <!--
-     Copyright (C) 2023 The Android Open Source Project
+     Copyright (C) 2025 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
@@ -14,21 +14,21 @@
      limitations under the License.
 -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="14dp"
-        android:height="14dp"
-        android:viewportWidth="14.0"
-        android:viewportHeight="14.0">
+    android:width="17dp"
+    android:height="12dp"
+    android:viewportWidth="16.0"
+    android:viewportHeight="12.0">
     <path
-        android:pathData="M8.25,3L9.25,3A0.5,0.5 0,0 1,9.75 3.5L9.75,13.5A0.5,0.5 0,0 1,9.25 14L8.25,14A0.5,0.5 0,0 1,7.75 13.5L7.75,3.5A0.5,0.5 0,0 1,8.25 3z"
+        android:pathData="M1.249,7C1.939,7 2.499,7.56 2.499,8.25L2.499,10.75C2.499,11.44 1.939,12 1.249,12C0.559,12 -0.001,11.44 -0.001,10.75L-0.001,8.25C-0.001,7.56 0.559,7 1.249,7Z"
         android:fillColor="#000"/>
     <path
-        android:pathData="M11.75,0L12.75,0A0.5,0.5 0,0 1,13.25 0.5L13.25,13.5A0.5,0.5 0,0 1,12.75 14L11.75,14A0.5,0.5 0,0 1,11.25 13.5L11.25,0.5A0.5,0.5 0,0 1,11.75 0z"
-        android:fillAlpha="0.24"
+        android:pathData="M5.749,4.5C6.439,4.5 6.999,5.06 6.999,5.75L6.999,10.75C6.999,11.44 6.439,12 5.749,12C5.059,12 4.499,11.44 4.499,10.75L4.499,5.75C4.499,5.06 5.059,4.5 5.749,4.5Z"
         android:fillColor="#000"/>
     <path
-        android:pathData="M1.25,10L2.25,10A0.5,0.5 0,0 1,2.75 10.5L2.75,13.5A0.5,0.5 0,0 1,2.25 14L1.25,14A0.5,0.5 0,0 1,0.75 13.5L0.75,10.5A0.5,0.5 0,0 1,1.25 10z"
+        android:pathData="M10.249,2C10.939,2 11.499,2.56 11.499,3.25L11.499,10.75C11.499,11.44 10.939,12 10.249,12C9.559,12 8.999,11.44 8.999,10.75L8.999,3.25C8.999,2.56 9.559,2 10.249,2Z"
         android:fillColor="#000"/>
     <path
-        android:pathData="M4.75,6.5L5.75,6.5A0.5,0.5 0,0 1,6.25 7L6.25,13.5A0.5,0.5 0,0 1,5.75 14L4.75,14A0.5,0.5 0,0 1,4.25 13.5L4.25,7A0.5,0.5 0,0 1,4.75 6.5z"
+        android:pathData="M14.749,0C15.439,0 15.999,0.56 15.999,1.25L15.999,10.75C15.999,11.44 15.439,12 14.749,12C14.059,12 13.499,11.44 13.499,10.75L13.499,1.25C13.499,0.56 14.059,0 14.749,0Z"
+        android:fillAlpha="0.45"
         android:fillColor="#000"/>
 </vector>
diff --git a/packages/SettingsLib/res/drawable/ic_mobile_3_4_bar_error.xml b/packages/SettingsLib/res/drawable/ic_mobile_3_4_bar_error.xml
index 27433c7..7c4c1c6 100644
--- a/packages/SettingsLib/res/drawable/ic_mobile_3_4_bar_error.xml
+++ b/packages/SettingsLib/res/drawable/ic_mobile_3_4_bar_error.xml
@@ -1,25 +1,48 @@
+<!--
+     Copyright (C) 2025 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT 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="15dp"
-        android:height="14dp"
-        android:viewportWidth="15.0"
-        android:viewportHeight="14.0">
+    android:width="17dp"
+    android:height="12dp"
+    android:viewportWidth="16.0"
+    android:viewportHeight="12.0">
+    <group>
+        <!-- clip-out the circle which will contain the exclamation point (below this group) -->
+        <clip-path
+            android:pathData="
+            M0,0
+            V13.5,0
+            H13.5,20
+            V0,20
+            H0,0
+            M14.999,13.5C17.761,13.5 19.999,11.261 19.999,8.5C19.999,5.739 17.761,3.5 14.999,3.5C12.238,3.5 9.999,5.739 9.999,8.5C9.999,11.261 12.238,13.5 14.999,13.5Z" />
+        <path
+            android:pathData="M1.249,7C1.939,7 2.499,7.56 2.499,8.25L2.499,10.75C2.499,11.44 1.939,12 1.249,12C0.559,12 -0.001,11.44 -0.001,10.75L-0.001,8.25C-0.001,7.56 0.559,7 1.249,7Z"
+            android:fillColor="#000"/>
+        <path
+            android:pathData="M5.749,4.5C6.439,4.5 6.999,5.06 6.999,5.75L6.999,10.75C6.999,11.44 6.439,12 5.749,12C5.059,12 4.499,11.44 4.499,10.75L4.499,5.75C4.499,5.06 5.059,4.5 5.749,4.5Z"
+            android:fillColor="#000"/>
+        <path
+            android:pathData="M10.249,2C10.939,2 11.499,2.56 11.499,3.25L11.499,10.75C11.499,11.44 10.939,12 10.249,12C9.559,12 8.999,11.44 8.999,10.75L8.999,3.25C8.999,2.56 9.559,2 10.249,2Z"
+            android:fillColor="#000"/>
+        <path
+            android:pathData="M14.749,0C15.439,0 15.999,0.56 15.999,1.25L15.999,10.75C15.999,11.44 15.439,12 14.749,12C14.059,12 13.499,11.44 13.499,10.75L13.499,1.25C13.499,0.56 14.059,0 14.749,0Z"
+            android:fillAlpha="0.45"
+            android:fillColor="#000"/>
+    </group>
     <path
-        android:pathData="M7,3.5C7,3.224 7.224,3 7.5,3H8.5C8.776,3 9,3.224 9,3.5V13.5C9,13.776 8.776,14 8.5,14H7.5C7.224,14 7,13.776 7,13.5V3.5Z"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M0,10.5C0,10.224 0.224,10 0.5,10H1.5C1.776,10 2,10.224 2,10.5V13.5C2,13.776 1.776,14 1.5,14H0.5C0.224,14 0,13.776 0,13.5V10.5Z"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M3.5,7C3.5,6.724 3.724,6.5 4,6.5H5C5.276,6.5 5.5,6.724 5.5,7V13.5C5.5,13.776 5.276,14 5,14H4C3.724,14 3.5,13.776 3.5,13.5V7Z"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M11,0C10.724,0 10.5,0.224 10.5,0.5V3H12.5V0.5C12.5,0.224 12.276,0 12,0H11Z"
-        android:fillAlpha="0.3"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M12.25,13C12.25,12.448 12.698,12 13.25,12C13.802,12 14.25,12.448 14.25,13C14.25,13.552 13.802,14 13.25,14C12.698,14 12.25,13.552 12.25,13Z"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M12.25,5C12.25,4.724 12.474,4.5 12.75,4.5H13.75C14.026,4.5 14.25,4.724 14.25,5V10C14.25,10.276 14.026,10.5 13.75,10.5H12.75C12.474,10.5 12.25,10.276 12.25,10V5Z"
+        android:pathData="M14.999,5C14.589,5 14.249,5.34 14.249,5.75L14.249,8.75C14.249,9.16 14.589,9.5 14.999,9.5C15.409,9.5 15.749,9.16 15.749,8.75L15.749,5.75C15.749,5.34 15.409,5 14.999,5ZM14.999,12C15.409,12 15.749,11.66 15.749,11.25C15.749,10.84 15.409,10.5 14.999,10.5C14.589,10.5 14.249,10.84 14.249,11.25C14.249,11.66 14.589,12 14.999,12Z"
         android:fillColor="#000"/>
 </vector>
diff --git a/packages/SettingsLib/res/drawable/ic_mobile_3_5_bar.xml b/packages/SettingsLib/res/drawable/ic_mobile_3_5_bar.xml
index 158ae01..973032f 100644
--- a/packages/SettingsLib/res/drawable/ic_mobile_3_5_bar.xml
+++ b/packages/SettingsLib/res/drawable/ic_mobile_3_5_bar.xml
@@ -1,5 +1,5 @@
 <!--
-     Copyright (C) 2023 The Android Open Source Project
+     Copyright (C) 2025 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
@@ -14,25 +14,25 @@
      limitations under the License.
 -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="16dp"
-        android:height="14dp"
-        android:viewportWidth="16.0"
-        android:viewportHeight="14.0">
+    android:width="21dp"
+    android:height="12dp"
+    android:viewportWidth="20.5"
+    android:viewportHeight="12.0">
     <path
-        android:pathData="M7.5,5L8.5,5A0.5,0.5 0,0 1,9 5.5L9,13.5A0.5,0.5 0,0 1,8.5 14L7.5,14A0.5,0.5 0,0 1,7 13.5L7,5.5A0.5,0.5 0,0 1,7.5 5z"
+        android:pathData="M1.249,7C1.939,7 2.499,7.56 2.499,8.25L2.499,10.75C2.499,11.44 1.939,12 1.249,12C0.559,12 -0.001,11.44 -0.001,10.75L-0.001,8.25C-0.001,7.56 0.559,7 1.249,7Z"
         android:fillColor="#000"/>
     <path
-        android:pathData="M11,2L12,2A0.5,0.5 0,0 1,12.5 2.5L12.5,13.5A0.5,0.5 0,0 1,12 14L11,14A0.5,0.5 0,0 1,10.5 13.5L10.5,2.5A0.5,0.5 0,0 1,11 2z"
-        android:fillAlpha="0.24"
+        android:pathData="M5.749,5C6.439,5 6.999,5.56 6.999,6.25L6.999,10.75C6.999,11.44 6.439,12 5.749,12C5.059,12 4.499,11.44 4.499,10.75L4.499,6.25C4.499,5.56 5.059,5 5.749,5Z"
         android:fillColor="#000"/>
     <path
-        android:pathData="M0.5,11L1.5,11A0.5,0.5 0,0 1,2 11.5L2,13.5A0.5,0.5 0,0 1,1.5 14L0.5,14A0.5,0.5 0,0 1,0 13.5L0,11.5A0.5,0.5 0,0 1,0.5 11z"
+        android:pathData="M10.249,3C10.939,3 11.499,3.56 11.499,4.25L11.499,10.75C11.499,11.44 10.939,12 10.249,12C9.559,12 8.999,11.44 8.999,10.75L8.999,4.25C8.999,3.56 9.559,3 10.249,3Z"
         android:fillColor="#000"/>
     <path
-        android:pathData="M14.5,0L15.5,0A0.5,0.5 0,0 1,16 0.5L16,13.5A0.5,0.5 0,0 1,15.5 14L14.5,14A0.5,0.5 0,0 1,14 13.5L14,0.5A0.5,0.5 0,0 1,14.5 0z"
-        android:fillAlpha="0.24"
+        android:pathData="M14.749,1.5C15.439,1.5 15.999,2.06 15.999,2.75L15.999,10.75C15.999,11.44 15.439,12 14.749,12C14.059,12 13.499,11.44 13.499,10.75L13.499,2.75C13.499,2.06 14.059,1.5 14.749,1.5Z"
+        android:fillAlpha="0.45"
         android:fillColor="#000"/>
     <path
-        android:pathData="M4,8L5,8A0.5,0.5 0,0 1,5.5 8.5L5.5,13.5A0.5,0.5 0,0 1,5 14L4,14A0.5,0.5 0,0 1,3.5 13.5L3.5,8.5A0.5,0.5 0,0 1,4 8z"
+        android:pathData="M19.249,0C19.939,0 20.499,0.56 20.499,1.25L20.499,10.75C20.499,11.44 19.939,12 19.249,12C18.559,12 17.999,11.44 17.999,10.75L17.999,1.25C17.999,0.56 18.559,0 19.249,0Z"
+        android:fillAlpha="0.45"
         android:fillColor="#000"/>
 </vector>
diff --git a/packages/SettingsLib/res/drawable/ic_mobile_3_5_bar_error.xml b/packages/SettingsLib/res/drawable/ic_mobile_3_5_bar_error.xml
index e0517cf..25c9520 100644
--- a/packages/SettingsLib/res/drawable/ic_mobile_3_5_bar_error.xml
+++ b/packages/SettingsLib/res/drawable/ic_mobile_3_5_bar_error.xml
@@ -1,29 +1,51 @@
+<!--
+     Copyright (C) 2025 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT 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="14dp"
-        android:viewportWidth="18.0"
-        android:viewportHeight="14.0">
+    android:width="21dp"
+    android:height="12dp"
+    android:viewportHeight="12.0"
+    android:viewportWidth="20.5">
+    <!-- clip-out the circle which will contain the exclamation point (below this group) -->
+    <group>
+        <clip-path android:pathData="
+            M0,0
+            H20.5
+            V12.0
+            H0
+            Z
+            M19.499,13.5C22.261,13.5 24.499,11.261 24.499,8.5C24.499,5.739 22.261,3.5 19.499,3.5C16.738,3.5 14.499,5.739 14.499,8.5C14.499,11.261 16.738,13.5 19.499,13.5Z" />
+        <path
+            android:fillColor="#000"
+            android:pathData="M1.249,7C1.939,7 2.499,7.56 2.499,8.25L2.499,10.75C2.499,11.44 1.939,12 1.249,12C0.559,12 -0.001,11.44 -0.001,10.75L-0.001,8.25C-0.001,7.56 0.559,7 1.249,7Z" />
+        <path
+            android:fillColor="#000"
+            android:pathData="M5.749,5C6.439,5 6.999,5.56 6.999,6.25L6.999,10.75C6.999,11.44 6.439,12 5.749,12C5.059,12 4.499,11.44 4.499,10.75L4.499,6.25C4.499,5.56 5.059,5 5.749,5Z" />
+        <path
+            android:fillColor="#000"
+            android:pathData="M10.249,3C10.939,3 11.499,3.56 11.499,4.25L11.499,10.75C11.499,11.44 10.939,12 10.249,12C9.559,12 8.999,11.44 8.999,10.75L8.999,4.25C8.999,3.56 9.559,3 10.249,3Z" />
+        <path
+            android:fillAlpha="0.45"
+            android:fillColor="#000"
+            android:pathData="M14.749,1.5C15.439,1.5 15.999,2.06 15.999,2.75L15.999,10.75C15.999,11.44 15.439,12 14.749,12C14.059,12 13.499,11.44 13.499,10.75L13.499,2.75C13.499,2.06 14.059,1.5 14.749,1.5Z" />
+        <path
+            android:fillAlpha="0.45"
+            android:fillColor="#000"
+            android:pathData="M19.249,0C19.939,0 20.499,0.56 20.499,1.25L20.499,10.75C20.499,11.44 19.939,12 19.249,12C18.559,12 17.999,11.44 17.999,10.75L17.999,1.25C17.999,0.56 18.559,0 19.249,0Z" />
+    </group>
     <path
-        android:pathData="M7,5.5C7,5.224 7.224,5 7.5,5H8.5C8.776,5 9,5.224 9,5.5V13.5C9,13.776 8.776,14 8.5,14H7.5C7.224,14 7,13.776 7,13.5V5.5Z"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M10.5,2.5C10.5,2.224 10.724,2 11,2H12C12.276,2 12.5,2.224 12.5,2.5V13.5C12.5,13.776 12.276,14 12,14H11C10.724,14 10.5,13.776 10.5,13.5V2.5Z"
-        android:fillAlpha="0.3"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M0,11.5C0,11.224 0.224,11 0.5,11H1.5C1.776,11 2,11.224 2,11.5V13.5C2,13.776 1.776,14 1.5,14H0.5C0.224,14 0,13.776 0,13.5V11.5Z"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M3.5,8.5C3.5,8.224 3.724,8 4,8H5C5.276,8 5.5,8.224 5.5,8.5V13.5C5.5,13.776 5.276,14 5,14H4C3.724,14 3.5,13.776 3.5,13.5V8.5Z"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M14.5,0C14.224,0 14,0.224 14,0.5V3H16V0.5C16,0.224 15.776,0 15.5,0H14.5Z"
-        android:fillAlpha="0.3"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M16,13C16,12.448 16.448,12 17,12C17.552,12 18,12.448 18,13C18,13.552 17.552,14 17,14C16.448,14 16,13.552 16,13Z"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M16,5C16,4.724 16.224,4.5 16.5,4.5H17.5C17.776,4.5 18,4.724 18,5V10C18,10.276 17.776,10.5 17.5,10.5H16.5C16.224,10.5 16,10.276 16,10V5Z"
-        android:fillColor="#000"/>
+        android:fillColor="#000"
+        android:pathData="M19.499,5C19.089,5 18.749,5.34 18.749,5.75L18.749,8.75C18.749,9.16 19.089,9.5 19.499,9.5C19.909,9.5 20.249,9.16 20.249,8.75L20.249,5.75C20.249,5.34 19.909,5 19.499,5ZM19.499,12C19.909,12 20.249,11.66 20.249,11.25C20.249,10.84 19.909,10.5 19.499,10.5C19.089,10.5 18.749,10.84 18.749,11.25C18.749,11.66 19.089,12 19.499,12Z" />
 </vector>
diff --git a/packages/SettingsLib/res/drawable/ic_mobile_4_4_bar.xml b/packages/SettingsLib/res/drawable/ic_mobile_4_4_bar.xml
index 1ebd396..fc807fa 100644
--- a/packages/SettingsLib/res/drawable/ic_mobile_4_4_bar.xml
+++ b/packages/SettingsLib/res/drawable/ic_mobile_4_4_bar.xml
@@ -1,5 +1,5 @@
 <!--
-     Copyright (C) 2023 The Android Open Source Project
+     Copyright (C) 2025 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
@@ -14,20 +14,20 @@
      limitations under the License.
 -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="14dp"
-        android:height="14dp"
-        android:viewportWidth="14.0"
-        android:viewportHeight="14.0">
+    android:width="17dp"
+    android:height="12dp"
+    android:viewportWidth="16.0"
+    android:viewportHeight="12.0">
     <path
-        android:pathData="M8.25,3L9.25,3A0.5,0.5 0,0 1,9.75 3.5L9.75,13.5A0.5,0.5 0,0 1,9.25 14L8.25,14A0.5,0.5 0,0 1,7.75 13.5L7.75,3.5A0.5,0.5 0,0 1,8.25 3z"
+        android:pathData="M1.249,7C1.939,7 2.499,7.56 2.499,8.25L2.499,10.75C2.499,11.44 1.939,12 1.249,12C0.559,12 -0.001,11.44 -0.001,10.75L-0.001,8.25C-0.001,7.56 0.559,7 1.249,7Z"
         android:fillColor="#000"/>
     <path
-        android:pathData="M11.75,0L12.75,0A0.5,0.5 0,0 1,13.25 0.5L13.25,13.5A0.5,0.5 0,0 1,12.75 14L11.75,14A0.5,0.5 0,0 1,11.25 13.5L11.25,0.5A0.5,0.5 0,0 1,11.75 0z"
+        android:pathData="M5.749,4.5C6.439,4.5 6.999,5.06 6.999,5.75L6.999,10.75C6.999,11.44 6.439,12 5.749,12C5.059,12 4.499,11.44 4.499,10.75L4.499,5.75C4.499,5.06 5.059,4.5 5.749,4.5Z"
         android:fillColor="#000"/>
     <path
-        android:pathData="M1.25,10L2.25,10A0.5,0.5 0,0 1,2.75 10.5L2.75,13.5A0.5,0.5 0,0 1,2.25 14L1.25,14A0.5,0.5 0,0 1,0.75 13.5L0.75,10.5A0.5,0.5 0,0 1,1.25 10z"
+        android:pathData="M10.249,2C10.939,2 11.499,2.56 11.499,3.25L11.499,10.75C11.499,11.44 10.939,12 10.249,12C9.559,12 8.999,11.44 8.999,10.75L8.999,3.25C8.999,2.56 9.559,2 10.249,2Z"
         android:fillColor="#000"/>
     <path
-        android:pathData="M4.75,6.5L5.75,6.5A0.5,0.5 0,0 1,6.25 7L6.25,13.5A0.5,0.5 0,0 1,5.75 14L4.75,14A0.5,0.5 0,0 1,4.25 13.5L4.25,7A0.5,0.5 0,0 1,4.75 6.5z"
+        android:pathData="M14.749,0C15.439,0 15.999,0.56 15.999,1.25L15.999,10.75C15.999,11.44 15.439,12 14.749,12C14.059,12 13.499,11.44 13.499,10.75L13.499,1.25C13.499,0.56 14.059,0 14.749,0Z"
         android:fillColor="#000"/>
 </vector>
diff --git a/packages/SettingsLib/res/drawable/ic_mobile_4_4_bar_error.xml b/packages/SettingsLib/res/drawable/ic_mobile_4_4_bar_error.xml
index 4473c29..d23680d 100644
--- a/packages/SettingsLib/res/drawable/ic_mobile_4_4_bar_error.xml
+++ b/packages/SettingsLib/res/drawable/ic_mobile_4_4_bar_error.xml
@@ -1,24 +1,47 @@
+<!--
+     Copyright (C) 2025 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT 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="15dp"
-        android:height="14dp"
-        android:viewportWidth="15.0"
-        android:viewportHeight="14.0">
+    android:width="17dp"
+    android:height="12dp"
+    android:viewportWidth="16.0"
+    android:viewportHeight="12.0">
+    <group>
+        <!-- clip-out the circle which will contain the exclamation point (below this group) -->
+        <clip-path
+            android:pathData="
+            M0,0
+            V13.5,0
+            H13.5,20
+            V0,20
+            H0,0
+            M14.999,13.5C17.761,13.5 19.999,11.261 19.999,8.5C19.999,5.739 17.761,3.5 14.999,3.5C12.238,3.5 9.999,5.739 9.999,8.5C9.999,11.261 12.238,13.5 14.999,13.5Z" />
+        <path
+            android:pathData="M1.249,7C1.939,7 2.499,7.56 2.499,8.25L2.499,10.75C2.499,11.44 1.939,12 1.249,12C0.559,12 -0.001,11.44 -0.001,10.75L-0.001,8.25C-0.001,7.56 0.559,7 1.249,7Z"
+            android:fillColor="#000"/>
+        <path
+            android:pathData="M5.749,4.5C6.439,4.5 6.999,5.06 6.999,5.75L6.999,10.75C6.999,11.44 6.439,12 5.749,12C5.059,12 4.499,11.44 4.499,10.75L4.499,5.75C4.499,5.06 5.059,4.5 5.749,4.5Z"
+            android:fillColor="#000"/>
+        <path
+            android:pathData="M10.249,2C10.939,2 11.499,2.56 11.499,3.25L11.499,10.75C11.499,11.44 10.939,12 10.249,12C9.559,12 8.999,11.44 8.999,10.75L8.999,3.25C8.999,2.56 9.559,2 10.249,2Z"
+            android:fillColor="#000"/>
+        <path
+            android:pathData="M14.749,0C15.439,0 15.999,0.56 15.999,1.25L15.999,10.75C15.999,11.44 15.439,12 14.749,12C14.059,12 13.499,11.44 13.499,10.75L13.499,1.25C13.499,0.56 14.059,0 14.749,0Z"
+            android:fillColor="#000"/>
+    </group>
     <path
-        android:pathData="M7,3.5C7,3.224 7.224,3 7.5,3H8.5C8.776,3 9,3.224 9,3.5V13.5C9,13.776 8.776,14 8.5,14H7.5C7.224,14 7,13.776 7,13.5V3.5Z"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M0,10.5C0,10.224 0.224,10 0.5,10H1.5C1.776,10 2,10.224 2,10.5V13.5C2,13.776 1.776,14 1.5,14H0.5C0.224,14 0,13.776 0,13.5V10.5Z"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M3.5,7C3.5,6.724 3.724,6.5 4,6.5H5C5.276,6.5 5.5,6.724 5.5,7V13.5C5.5,13.776 5.276,14 5,14H4C3.724,14 3.5,13.776 3.5,13.5V7Z"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M11,0C10.724,0 10.5,0.224 10.5,0.5V3H12.5V0.5C12.5,0.224 12.276,0 12,0H11Z"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M12.25,13C12.25,12.448 12.698,12 13.25,12C13.802,12 14.25,12.448 14.25,13C14.25,13.552 13.802,14 13.25,14C12.698,14 12.25,13.552 12.25,13Z"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M12.25,5C12.25,4.724 12.474,4.5 12.75,4.5H13.75C14.026,4.5 14.25,4.724 14.25,5V10C14.25,10.276 14.026,10.5 13.75,10.5H12.75C12.474,10.5 12.25,10.276 12.25,10V5Z"
+        android:pathData="M14.999,5C14.589,5 14.249,5.34 14.249,5.75L14.249,8.75C14.249,9.16 14.589,9.5 14.999,9.5C15.409,9.5 15.749,9.16 15.749,8.75L15.749,5.75C15.749,5.34 15.409,5 14.999,5ZM14.999,12C15.409,12 15.749,11.66 15.749,11.25C15.749,10.84 15.409,10.5 14.999,10.5C14.589,10.5 14.249,10.84 14.249,11.25C14.249,11.66 14.589,12 14.999,12Z"
         android:fillColor="#000"/>
 </vector>
diff --git a/packages/SettingsLib/res/drawable/ic_mobile_4_5_bar.xml b/packages/SettingsLib/res/drawable/ic_mobile_4_5_bar.xml
index 1ed6ac8..b1336d7 100644
--- a/packages/SettingsLib/res/drawable/ic_mobile_4_5_bar.xml
+++ b/packages/SettingsLib/res/drawable/ic_mobile_4_5_bar.xml
@@ -1,5 +1,5 @@
 <!--
-     Copyright (C) 2023 The Android Open Source Project
+     Copyright (C) 2025 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
@@ -14,24 +14,24 @@
      limitations under the License.
 -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="16dp"
-        android:height="14dp"
-        android:viewportWidth="16.0"
-        android:viewportHeight="14.0">
+    android:width="21dp"
+    android:height="12dp"
+    android:viewportWidth="20.5"
+    android:viewportHeight="12.0">
     <path
-        android:pathData="M7.5,5L8.5,5A0.5,0.5 0,0 1,9 5.5L9,13.5A0.5,0.5 0,0 1,8.5 14L7.5,14A0.5,0.5 0,0 1,7 13.5L7,5.5A0.5,0.5 0,0 1,7.5 5z"
+        android:pathData="M1.249,7C1.939,7 2.499,7.56 2.499,8.25L2.499,10.75C2.499,11.44 1.939,12 1.249,12C0.559,12 -0.001,11.44 -0.001,10.75L-0.001,8.25C-0.001,7.56 0.559,7 1.249,7Z"
         android:fillColor="#000"/>
     <path
-        android:pathData="M11,2L12,2A0.5,0.5 0,0 1,12.5 2.5L12.5,13.5A0.5,0.5 0,0 1,12 14L11,14A0.5,0.5 0,0 1,10.5 13.5L10.5,2.5A0.5,0.5 0,0 1,11 2z"
+        android:pathData="M5.749,5C6.439,5 6.999,5.56 6.999,6.25L6.999,10.75C6.999,11.44 6.439,12 5.749,12C5.059,12 4.499,11.44 4.499,10.75L4.499,6.25C4.499,5.56 5.059,5 5.749,5Z"
         android:fillColor="#000"/>
     <path
-        android:pathData="M0.5,11L1.5,11A0.5,0.5 0,0 1,2 11.5L2,13.5A0.5,0.5 0,0 1,1.5 14L0.5,14A0.5,0.5 0,0 1,0 13.5L0,11.5A0.5,0.5 0,0 1,0.5 11z"
+        android:pathData="M10.249,3C10.939,3 11.499,3.56 11.499,4.25L11.499,10.75C11.499,11.44 10.939,12 10.249,12C9.559,12 8.999,11.44 8.999,10.75L8.999,4.25C8.999,3.56 9.559,3 10.249,3Z"
         android:fillColor="#000"/>
     <path
-        android:pathData="M14.5,0L15.5,0A0.5,0.5 0,0 1,16 0.5L16,13.5A0.5,0.5 0,0 1,15.5 14L14.5,14A0.5,0.5 0,0 1,14 13.5L14,0.5A0.5,0.5 0,0 1,14.5 0z"
-        android:fillAlpha="0.24"
+        android:pathData="M14.749,1.5C15.439,1.5 15.999,2.06 15.999,2.75L15.999,10.75C15.999,11.44 15.439,12 14.749,12C14.059,12 13.499,11.44 13.499,10.75L13.499,2.75C13.499,2.06 14.059,1.5 14.749,1.5Z"
         android:fillColor="#000"/>
     <path
-        android:pathData="M4,8L5,8A0.5,0.5 0,0 1,5.5 8.5L5.5,13.5A0.5,0.5 0,0 1,5 14L4,14A0.5,0.5 0,0 1,3.5 13.5L3.5,8.5A0.5,0.5 0,0 1,4 8z"
+        android:pathData="M19.249,0C19.939,0 20.499,0.56 20.499,1.25L20.499,10.75C20.499,11.44 19.939,12 19.249,12C18.559,12 17.999,11.44 17.999,10.75L17.999,1.25C17.999,0.56 18.559,0 19.249,0Z"
+        android:fillAlpha="0.45"
         android:fillColor="#000"/>
 </vector>
diff --git a/packages/SettingsLib/res/drawable/ic_mobile_4_5_bar_error.xml b/packages/SettingsLib/res/drawable/ic_mobile_4_5_bar_error.xml
index 703e3ac..bf62535 100644
--- a/packages/SettingsLib/res/drawable/ic_mobile_4_5_bar_error.xml
+++ b/packages/SettingsLib/res/drawable/ic_mobile_4_5_bar_error.xml
@@ -1,28 +1,50 @@
+<!--
+     Copyright (C) 2025 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT 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="14dp"
-        android:viewportWidth="18.0"
-        android:viewportHeight="14.0">
+    android:width="21dp"
+    android:height="12dp"
+    android:viewportHeight="12.0"
+    android:viewportWidth="20.5">
+    <!-- clip-out the circle which will contain the exclamation point (below this group) -->
+    <group>
+        <clip-path android:pathData="
+            M0,0
+            H20.5
+            V12.0
+            H0
+            Z
+            M19.499,13.5C22.261,13.5 24.499,11.261 24.499,8.5C24.499,5.739 22.261,3.5 19.499,3.5C16.738,3.5 14.499,5.739 14.499,8.5C14.499,11.261 16.738,13.5 19.499,13.5Z" />
+        <path
+            android:fillColor="#000"
+            android:pathData="M1.249,7C1.939,7 2.499,7.56 2.499,8.25L2.499,10.75C2.499,11.44 1.939,12 1.249,12C0.559,12 -0.001,11.44 -0.001,10.75L-0.001,8.25C-0.001,7.56 0.559,7 1.249,7Z" />
+        <path
+            android:fillColor="#000"
+            android:pathData="M5.749,5C6.439,5 6.999,5.56 6.999,6.25L6.999,10.75C6.999,11.44 6.439,12 5.749,12C5.059,12 4.499,11.44 4.499,10.75L4.499,6.25C4.499,5.56 5.059,5 5.749,5Z" />
+        <path
+            android:fillColor="#000"
+            android:pathData="M10.249,3C10.939,3 11.499,3.56 11.499,4.25L11.499,10.75C11.499,11.44 10.939,12 10.249,12C9.559,12 8.999,11.44 8.999,10.75L8.999,4.25C8.999,3.56 9.559,3 10.249,3Z" />
+        <path
+            android:fillColor="#000"
+            android:pathData="M14.749,1.5C15.439,1.5 15.999,2.06 15.999,2.75L15.999,10.75C15.999,11.44 15.439,12 14.749,12C14.059,12 13.499,11.44 13.499,10.75L13.499,2.75C13.499,2.06 14.059,1.5 14.749,1.5Z" />
+        <path
+            android:fillAlpha="0.45"
+            android:fillColor="#000"
+            android:pathData="M19.249,0C19.939,0 20.499,0.56 20.499,1.25L20.499,10.75C20.499,11.44 19.939,12 19.249,12C18.559,12 17.999,11.44 17.999,10.75L17.999,1.25C17.999,0.56 18.559,0 19.249,0Z" />
+    </group>
     <path
-        android:pathData="M7,5.5C7,5.224 7.224,5 7.5,5H8.5C8.776,5 9,5.224 9,5.5V13.5C9,13.776 8.776,14 8.5,14H7.5C7.224,14 7,13.776 7,13.5V5.5Z"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M10.5,2.5C10.5,2.224 10.724,2 11,2H12C12.276,2 12.5,2.224 12.5,2.5V13.5C12.5,13.776 12.276,14 12,14H11C10.724,14 10.5,13.776 10.5,13.5V2.5Z"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M0,11.5C0,11.224 0.224,11 0.5,11H1.5C1.776,11 2,11.224 2,11.5V13.5C2,13.776 1.776,14 1.5,14H0.5C0.224,14 0,13.776 0,13.5V11.5Z"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M3.5,8.5C3.5,8.224 3.724,8 4,8H5C5.276,8 5.5,8.224 5.5,8.5V13.5C5.5,13.776 5.276,14 5,14H4C3.724,14 3.5,13.776 3.5,13.5V8.5Z"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M14.5,0C14.224,0 14,0.224 14,0.5V3H16V0.5C16,0.224 15.776,0 15.5,0H14.5Z"
-        android:fillAlpha="0.3"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M16,13C16,12.448 16.448,12 17,12C17.552,12 18,12.448 18,13C18,13.552 17.552,14 17,14C16.448,14 16,13.552 16,13Z"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M16,5C16,4.724 16.224,4.5 16.5,4.5H17.5C17.776,4.5 18,4.724 18,5V10C18,10.276 17.776,10.5 17.5,10.5H16.5C16.224,10.5 16,10.276 16,10V5Z"
-        android:fillColor="#000"/>
+        android:fillColor="#000"
+        android:pathData="M19.499,5C19.089,5 18.749,5.34 18.749,5.75L18.749,8.75C18.749,9.16 19.089,9.5 19.499,9.5C19.909,9.5 20.249,9.16 20.249,8.75L20.249,5.75C20.249,5.34 19.909,5 19.499,5ZM19.499,12C19.909,12 20.249,11.66 20.249,11.25C20.249,10.84 19.909,10.5 19.499,10.5C19.089,10.5 18.749,10.84 18.749,11.25C18.749,11.66 19.089,12 19.499,12Z" />
 </vector>
diff --git a/packages/SettingsLib/res/drawable/ic_mobile_5_5_bar.xml b/packages/SettingsLib/res/drawable/ic_mobile_5_5_bar.xml
index 420ffb6..fa9bedc 100644
--- a/packages/SettingsLib/res/drawable/ic_mobile_5_5_bar.xml
+++ b/packages/SettingsLib/res/drawable/ic_mobile_5_5_bar.xml
@@ -1,5 +1,5 @@
 <!--
-     Copyright (C) 2023 The Android Open Source Project
+     Copyright (C) 2025 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
@@ -14,23 +14,23 @@
      limitations under the License.
 -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="16dp"
-        android:height="14dp"
-        android:viewportWidth="16.0"
-        android:viewportHeight="14.0">
+    android:width="21dp"
+    android:height="12dp"
+    android:viewportWidth="20.5"
+    android:viewportHeight="12.0">
     <path
-        android:pathData="M7.5,5L8.5,5A0.5,0.5 0,0 1,9 5.5L9,13.5A0.5,0.5 0,0 1,8.5 14L7.5,14A0.5,0.5 0,0 1,7 13.5L7,5.5A0.5,0.5 0,0 1,7.5 5z"
+        android:pathData="M1.249,7C1.939,7 2.499,7.56 2.499,8.25L2.499,10.75C2.499,11.44 1.939,12 1.249,12C0.559,12 -0.001,11.44 -0.001,10.75L-0.001,8.25C-0.001,7.56 0.559,7 1.249,7Z"
         android:fillColor="#000"/>
     <path
-        android:pathData="M11,2L12,2A0.5,0.5 0,0 1,12.5 2.5L12.5,13.5A0.5,0.5 0,0 1,12 14L11,14A0.5,0.5 0,0 1,10.5 13.5L10.5,2.5A0.5,0.5 0,0 1,11 2z"
+        android:pathData="M5.749,5C6.439,5 6.999,5.56 6.999,6.25L6.999,10.75C6.999,11.44 6.439,12 5.749,12C5.059,12 4.499,11.44 4.499,10.75L4.499,6.25C4.499,5.56 5.059,5 5.749,5Z"
         android:fillColor="#000"/>
     <path
-        android:pathData="M0.5,11L1.5,11A0.5,0.5 0,0 1,2 11.5L2,13.5A0.5,0.5 0,0 1,1.5 14L0.5,14A0.5,0.5 0,0 1,0 13.5L0,11.5A0.5,0.5 0,0 1,0.5 11z"
+        android:pathData="M10.249,3C10.939,3 11.499,3.56 11.499,4.25L11.499,10.75C11.499,11.44 10.939,12 10.249,12C9.559,12 8.999,11.44 8.999,10.75L8.999,4.25C8.999,3.56 9.559,3 10.249,3Z"
         android:fillColor="#000"/>
     <path
-        android:pathData="M14.5,0L15.5,0A0.5,0.5 0,0 1,16 0.5L16,13.5A0.5,0.5 0,0 1,15.5 14L14.5,14A0.5,0.5 0,0 1,14 13.5L14,0.5A0.5,0.5 0,0 1,14.5 0z"
+        android:pathData="M14.749,1.5C15.439,1.5 15.999,2.06 15.999,2.75L15.999,10.75C15.999,11.44 15.439,12 14.749,12C14.059,12 13.499,11.44 13.499,10.75L13.499,2.75C13.499,2.06 14.059,1.5 14.749,1.5Z"
         android:fillColor="#000"/>
     <path
-        android:pathData="M4,8L5,8A0.5,0.5 0,0 1,5.5 8.5L5.5,13.5A0.5,0.5 0,0 1,5 14L4,14A0.5,0.5 0,0 1,3.5 13.5L3.5,8.5A0.5,0.5 0,0 1,4 8z"
+        android:pathData="M19.249,0C19.939,0 20.499,0.56 20.499,1.25L20.499,10.75C20.499,11.44 19.939,12 19.249,12C18.559,12 17.999,11.44 17.999,10.75L17.999,1.25C17.999,0.56 18.559,0 19.249,0Z"
         android:fillColor="#000"/>
 </vector>
diff --git a/packages/SettingsLib/res/drawable/ic_mobile_5_5_bar_error.xml b/packages/SettingsLib/res/drawable/ic_mobile_5_5_bar_error.xml
index e63ca77..1728bc7 100644
--- a/packages/SettingsLib/res/drawable/ic_mobile_5_5_bar_error.xml
+++ b/packages/SettingsLib/res/drawable/ic_mobile_5_5_bar_error.xml
@@ -1,27 +1,49 @@
+<!--
+     Copyright (C) 2025 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT 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="14dp"
-        android:viewportWidth="18.0"
-        android:viewportHeight="14.0">
+    android:width="21dp"
+    android:height="12dp"
+    android:viewportHeight="12.0"
+    android:viewportWidth="20.5">
+    <!-- clip-out the circle which will contain the exclamation point (below this group) -->
+    <group>
+        <clip-path android:pathData="
+            M0,0
+            H20.5
+            V12.0
+            H0
+            Z
+            M19.499,13.5C22.261,13.5 24.499,11.261 24.499,8.5C24.499,5.739 22.261,3.5 19.499,3.5C16.738,3.5 14.499,5.739 14.499,8.5C14.499,11.261 16.738,13.5 19.499,13.5Z" />
+        <path
+            android:fillColor="#000"
+            android:pathData="M1.249,7C1.939,7 2.499,7.56 2.499,8.25L2.499,10.75C2.499,11.44 1.939,12 1.249,12C0.559,12 -0.001,11.44 -0.001,10.75L-0.001,8.25C-0.001,7.56 0.559,7 1.249,7Z" />
+        <path
+            android:fillColor="#000"
+            android:pathData="M5.749,5C6.439,5 6.999,5.56 6.999,6.25L6.999,10.75C6.999,11.44 6.439,12 5.749,12C5.059,12 4.499,11.44 4.499,10.75L4.499,6.25C4.499,5.56 5.059,5 5.749,5Z" />
+        <path
+            android:fillColor="#000"
+            android:pathData="M10.249,3C10.939,3 11.499,3.56 11.499,4.25L11.499,10.75C11.499,11.44 10.939,12 10.249,12C9.559,12 8.999,11.44 8.999,10.75L8.999,4.25C8.999,3.56 9.559,3 10.249,3Z" />
+        <path
+            android:fillColor="#000"
+            android:pathData="M14.749,1.5C15.439,1.5 15.999,2.06 15.999,2.75L15.999,10.75C15.999,11.44 15.439,12 14.749,12C14.059,12 13.499,11.44 13.499,10.75L13.499,2.75C13.499,2.06 14.059,1.5 14.749,1.5Z" />
+        <path
+            android:fillColor="#000"
+            android:pathData="M19.249,0C19.939,0 20.499,0.56 20.499,1.25L20.499,10.75C20.499,11.44 19.939,12 19.249,12C18.559,12 17.999,11.44 17.999,10.75L17.999,1.25C17.999,0.56 18.559,0 19.249,0Z" />
+    </group>
     <path
-        android:pathData="M7,5.5C7,5.224 7.224,5 7.5,5H8.5C8.776,5 9,5.224 9,5.5V13.5C9,13.776 8.776,14 8.5,14H7.5C7.224,14 7,13.776 7,13.5V5.5Z"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M10.5,2.5C10.5,2.224 10.724,2 11,2H12C12.276,2 12.5,2.224 12.5,2.5V13.5C12.5,13.776 12.276,14 12,14H11C10.724,14 10.5,13.776 10.5,13.5V2.5Z"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M0,11.5C0,11.224 0.224,11 0.5,11H1.5C1.776,11 2,11.224 2,11.5V13.5C2,13.776 1.776,14 1.5,14H0.5C0.224,14 0,13.776 0,13.5V11.5Z"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M3.5,8.5C3.5,8.224 3.724,8 4,8H5C5.276,8 5.5,8.224 5.5,8.5V13.5C5.5,13.776 5.276,14 5,14H4C3.724,14 3.5,13.776 3.5,13.5V8.5Z"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M14.5,0C14.224,0 14,0.224 14,0.5V3H16V0.5C16,0.224 15.776,0 15.5,0H14.5Z"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M16,13C16,12.448 16.448,12 17,12C17.552,12 18,12.448 18,13C18,13.552 17.552,14 17,14C16.448,14 16,13.552 16,13Z"
-        android:fillColor="#000"/>
-    <path
-        android:pathData="M16,5C16,4.724 16.224,4.5 16.5,4.5H17.5C17.776,4.5 18,4.724 18,5V10C18,10.276 17.776,10.5 17.5,10.5H16.5C16.224,10.5 16,10.276 16,10V5Z"
-        android:fillColor="#000"/>
+        android:fillColor="#000"
+        android:pathData="M19.499,5C19.089,5 18.749,5.34 18.749,5.75L18.749,8.75C18.749,9.16 19.089,9.5 19.499,9.5C19.909,9.5 20.249,9.16 20.249,8.75L20.249,5.75C20.249,5.34 19.909,5 19.499,5ZM19.499,12C19.909,12 20.249,11.66 20.249,11.25C20.249,10.84 19.909,10.5 19.499,10.5C19.089,10.5 18.749,10.84 18.749,11.25C18.749,11.66 19.089,12 19.499,12Z" />
 </vector>
diff --git a/packages/SettingsLib/res/values-af/arrays.xml b/packages/SettingsLib/res/values-af/arrays.xml
index e4eb72d..c4ba7eb 100644
--- a/packages/SettingsLib/res/values-af/arrays.xml
+++ b/packages/SettingsLib/res/values-af/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Slegs toestelskerm (verstek)"</item>
-    <item msgid="9161645858025071955">"Eksterne skerm"</item>
-    <item msgid="114384731934682483">"Fokusgebaseer"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Wys skakering net op toestelskerm"</item>
-    <item msgid="7795034287069726554">"Wys skerm op enkele eksterne skerm"</item>
-    <item msgid="5280431949814340475">"Wys toestel op laaste gefokusde skerm"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index f6364ff..3a7e452 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Laai vinnig"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Beheer deur administrateur"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Beheer deur Beperkte Instellings"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Onbeskikbaar tydens oproepe"</string>
     <string name="disabled" msgid="8017887509554714950">"Gedeaktiveer"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Toegelaat"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Nie toegelaat nie"</string>
diff --git a/packages/SettingsLib/res/values-am/arrays.xml b/packages/SettingsLib/res/values-am/arrays.xml
index 805f0d3..a151f83 100644
--- a/packages/SettingsLib/res/values-am/arrays.xml
+++ b/packages/SettingsLib/res/values-am/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"የመሣሪያ ማሳያ ብቻ (ነባሪ)"</item>
-    <item msgid="9161645858025071955">"ውጫዊ ማሳያ"</item>
-    <item msgid="114384731934682483">"ትኩረት ላይ የተመሰረተ"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"በመሣሪያ ማሳያ ላይ ብቻ ጥላ አሳይ"</item>
-    <item msgid="7795034287069726554">"መሣሪያን በአንድ ውጫዊ ማሳያ ላይ አሳይ"</item>
-    <item msgid="5280431949814340475">"በመጨረሻ ትኩረት የተደረገበት ማሳያ ላይ መሣሪያን አሳይ"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index d374a9a..25e9c5e 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"ፈጣን መሙያ"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"በአስተዳዳሪ ቁጥጥር የተደረገበት"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"በተገደበ ቅንብር ቁጥጥር የሚደረግበት"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"በጥሪዎች ጊዜ አይገኝም"</string>
     <string name="disabled" msgid="8017887509554714950">"ቦዝኗል"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"ይፈቀዳል"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"አይፈቀድም"</string>
diff --git a/packages/SettingsLib/res/values-ar/arrays.xml b/packages/SettingsLib/res/values-ar/arrays.xml
index 3ff5dc6..ebdb0c7 100644
--- a/packages/SettingsLib/res/values-ar/arrays.xml
+++ b/packages/SettingsLib/res/values-ar/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"شاشة الجهاز فقط (الإعداد التلقائي)"</item>
-    <item msgid="9161645858025071955">"الشاشة الخارجية"</item>
-    <item msgid="114384731934682483">"على الشاشة التي يتم التركيز عليها"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"عرض الظل على شاشة الجهاز فقط"</item>
-    <item msgid="7795034287069726554">"عرض الظل على شاشة خارجية واحدة"</item>
-    <item msgid="5280431949814340475">"عرض الظل على آخر شاشة تم التركيز عليها"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index 675a6a6..8956c44 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -251,7 +251,7 @@
     <string name="enable_adb_summary" msgid="3711526030096574316">"‏وضع تصحيح الأخطاء عند توصيل USB"</string>
     <string name="clear_adb_keys" msgid="3010148733140369917">"‏إلغاء عمليات تفويض تصحيح أخطاء USB"</string>
     <string name="enable_adb_wireless" msgid="6973226350963971018">"تصحيح الأخطاء اللاسلكي"</string>
-    <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"‏وضع تصحيح الأخطاء عندما يتم الاتصال بشبكة Wi‑Fi"</string>
+    <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"‏بدء تصحيح الأخطاء عند الاتصال بشبكة Wi‑Fi"</string>
     <string name="adb_wireless_error" msgid="721958772149779856">"خطأ"</string>
     <string name="adb_wireless_settings" msgid="2295017847215680229">"تصحيح الأخطاء اللاسلكي"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"لعرض الأجهزة المتاحة واستخدامها، فعِّل ميزة \"تصحيح الأخطاء اللاسلكي\"."</string>
@@ -674,7 +674,7 @@
     <string name="not_grant_admin" msgid="3557849576157702485">"لا أريد منح هذا المستخدم امتيازات المشرف."</string>
     <string name="guest_exit_dialog_button" msgid="1736401897067442044">"خروج"</string>
     <string name="guest_exit_dialog_title_non_ephemeral" msgid="7675327443743162986">"هل تريد حفظ النشاط في وضع الضيف؟"</string>
-    <string name="guest_exit_dialog_message_non_ephemeral" msgid="223385323235719442">"يمكنك حفظ نشاط من الجلسة الحالية أو حذف كلّ التطبيقات والبيانات."</string>
+    <string name="guest_exit_dialog_message_non_ephemeral" msgid="223385323235719442">"يمكنك حفظ نشاطك من الجلسة الحالية أو حذف كلّ التطبيقات والبيانات."</string>
     <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>
diff --git a/packages/SettingsLib/res/values-as/arrays.xml b/packages/SettingsLib/res/values-as/arrays.xml
index 4b5d5a0..451b47a 100644
--- a/packages/SettingsLib/res/values-as/arrays.xml
+++ b/packages/SettingsLib/res/values-as/arrays.xml
@@ -291,16 +291,19 @@
   <string-array name="shade_display_awareness_entries">
     <item msgid="816770658383209617">"কেৱল ডিভাইচৰ ডিছপ্লে’ (ডিফ’ল্ট)"</item>
     <item msgid="9161645858025071955">"বাহ্যিক ডিছপ্লে’"</item>
-    <item msgid="114384731934682483">"ফ’কাছ-আধাৰিত"</item>
+    <item msgid="23651860565814477">"শেহতীয়া স্থিতি দণ্ড স্পৰ্শ"</item>
+    <item msgid="7521112827893653392">"ফ’কাছ-আধাৰিত"</item>
   </string-array>
   <string-array name="shade_display_awareness_summaries">
     <item msgid="2964753205732912921">"কেৱল ডিভাইচৰ ডিছপ্লে’তহে শ্বেড দেখুৱাওক"</item>
-    <item msgid="7795034287069726554">"ডিভাইচটো এখনেই বাহ্যিক ডিছপ্লে’ত দেখুৱাওক"</item>
-    <item msgid="5280431949814340475">"ডিভাইচটো অন্তিম ফ’কাছ কৰা ডিছপ্লে’ত দেখুৱাওক"</item>
+    <item msgid="1955398604822147783">"কেৱল এখনেই বাহ্যিক ডিছপ্লে’ত শ্বেড দেখুৱাওক"</item>
+    <item msgid="391477482416751568">"যিখন ডিছপ্লে’ই অন্তিমবাৰ ইয়াৰ স্থিতি দণ্ডৰ সৈতে ভাৱ-বিনিময় কৰিছে সেইখনত শ্বেড দেখুৱাওক"</item>
+    <item msgid="1746820128097981528">"অন্তিম ফ’কাছ কৰা ডিছপ্লে’ত শ্বেড দেখুৱাওক"</item>
   </string-array>
   <string-array name="shade_display_awareness_values">
     <item msgid="3055776101992426514">"default_display"</item>
     <item msgid="774789415968826925">"any_external_display"</item>
     <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
+    <item msgid="4313165186636015195">"focused_display"</item>
   </string-array>
 </resources>
diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml
index c98d3de..bfacbb2 100644
--- a/packages/SettingsLib/res/values-as/strings.xml
+++ b/packages/SettingsLib/res/values-as/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"দ্ৰুত চাৰ্জিং"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"এডমিনৰ দ্বাৰা নিয়ন্ত্ৰিত"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"প্ৰতিবন্ধিত ছেটিঙৰ দ্বাৰা নিয়ন্ত্ৰিত"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"কল চলি থকাৰ সময়ত উপলব্ধ নহয়"</string>
     <string name="disabled" msgid="8017887509554714950">"নিষ্ক্ৰিয়"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"অনুমতি দিয়া হৈছে"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"অনুমতি দিয়া হোৱা নাই"</string>
diff --git a/packages/SettingsLib/res/values-az/arrays.xml b/packages/SettingsLib/res/values-az/arrays.xml
index 511e970..52cf498 100644
--- a/packages/SettingsLib/res/values-az/arrays.xml
+++ b/packages/SettingsLib/res/values-az/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Yalnız cihaz displeyi (defolt)"</item>
-    <item msgid="9161645858025071955">"Xarici displey"</item>
-    <item msgid="114384731934682483">"Fokus əsaslı"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Kölgəni yalnız cihaz displeyində göstərin"</item>
-    <item msgid="7795034287069726554">"Cihazı bir xarici displeydə göstərin"</item>
-    <item msgid="5280431949814340475">"Cihazı son fokuslanmış displeydə göstərin"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index db7d162..9013fb5 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Sürətli şarj"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Admin tərəfindən nəzarət olunur"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Məhdudlaşdırılmış Ayar ilə nəzarət edilir"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Zənglər zamanı əlçatan deyil"</string>
     <string name="disabled" msgid="8017887509554714950">"Deaktiv"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"İcazə verilib"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"İcazə verilməyib"</string>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml b/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml
index 4528314..3622808 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml
@@ -291,16 +291,19 @@
   <string-array name="shade_display_awareness_entries">
     <item msgid="816770658383209617">"Prikaz samo na uređaju (podrazumevano)"</item>
     <item msgid="9161645858025071955">"Spoljni ekran"</item>
-    <item msgid="114384731934682483">"Zasnovano na fokusu"</item>
+    <item msgid="23651860565814477">"Dodir na najnovijoj statusnoj traci"</item>
+    <item msgid="7521112827893653392">"Zasnovano na fokusu"</item>
   </string-array>
   <string-array name="shade_display_awareness_summaries">
     <item msgid="2964753205732912921">"Prikaži senku samo na ekranu uređaja"</item>
-    <item msgid="7795034287069726554">"Prikaži uređaj na jednom spoljnom ekranu"</item>
-    <item msgid="5280431949814340475">"Prikaži uređaj na poslednjem ekranu u fokusu"</item>
+    <item msgid="1955398604822147783">"Prikaži senku na jednom spoljnom ekranu"</item>
+    <item msgid="391477482416751568">"Prikaži senku na ekranu sa kojim je statusna traka poslednji put bila u interakciji"</item>
+    <item msgid="1746820128097981528">"Prikaži senku na poslednjem ekranu u fokusu"</item>
   </string-array>
   <string-array name="shade_display_awareness_values">
     <item msgid="3055776101992426514">"default_display"</item>
     <item msgid="774789415968826925">"any_external_display"</item>
     <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
+    <item msgid="4313165186636015195">"focused_display"</item>
   </string-array>
 </resources>
diff --git a/packages/SettingsLib/res/values-be/arrays.xml b/packages/SettingsLib/res/values-be/arrays.xml
index 3339361..48c3627 100644
--- a/packages/SettingsLib/res/values-be/arrays.xml
+++ b/packages/SettingsLib/res/values-be/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Толькі дысплэй прылады (стандартна)"</item>
-    <item msgid="9161645858025071955">"Знешні дысплэй"</item>
-    <item msgid="114384731934682483">"У залежнасці ад выкарыстання"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Паказваць шчыток толькі на дысплэі прылады"</item>
-    <item msgid="7795034287069726554">"Паказваць прыладу на адным знешнім дысплэі"</item>
-    <item msgid="5280431949814340475">"Паказваць прыладу на дысплэі, які выкарыстоўваўся апошнім"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index eb6e0a5..0ad8ac7 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Ідзе хуткая зарадка"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Кантралюецца адміністратарам"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Пад кіраваннем Абмежаванага наладжвання"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Недаступна падчас выклікаў"</string>
     <string name="disabled" msgid="8017887509554714950">"Адключанае"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Дазволена"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Забаронена"</string>
diff --git a/packages/SettingsLib/res/values-bg/arrays.xml b/packages/SettingsLib/res/values-bg/arrays.xml
index c3bc26f..21dfa06 100644
--- a/packages/SettingsLib/res/values-bg/arrays.xml
+++ b/packages/SettingsLib/res/values-bg/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Само на екрана на устройството (по подразбиране)"</item>
-    <item msgid="9161645858025071955">"Външен екран"</item>
-    <item msgid="114384731934682483">"Въз основа на фокуса"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Показване на падащия панел само на екрана на устройството"</item>
-    <item msgid="7795034287069726554">"Показване на устройството на един външен екран"</item>
-    <item msgid="5280431949814340475">"Показване на устройството на екрана, върху който последно е бил поставен фокусът"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index ede0a3a..8a87e57 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Зарежда се бързо"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Контролира се от администратор"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Управлява се чрез ограничена настройка"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Заето по време на обаждания"</string>
     <string name="disabled" msgid="8017887509554714950">"Деактивирано"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Има разрешение"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Няма разрешение"</string>
diff --git a/packages/SettingsLib/res/values-bn/arrays.xml b/packages/SettingsLib/res/values-bn/arrays.xml
index 6d5da27..b27264d 100644
--- a/packages/SettingsLib/res/values-bn/arrays.xml
+++ b/packages/SettingsLib/res/values-bn/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"শুধুমাত্র ডিভাইসের ডিসপ্লে (ডিফল্ট)"</item>
-    <item msgid="9161645858025071955">"এক্সটার্নাল ডিসপ্লে"</item>
-    <item msgid="114384731934682483">"ফোকাস অনুযায়ী"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"শুধুমাত্র ডিভাইসের ডিসপ্লেতে শেড দেখুন"</item>
-    <item msgid="7795034287069726554">"শেড একটি এক্সটার্নাল ডিসপ্লেতে দেখুন"</item>
-    <item msgid="5280431949814340475">"ফোকাস করা শেষ ডিসপ্লেতে ডিভাইস দেখুন"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index ab9c34a..1e7c7a2 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"ফাস্ট চার্জিং"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"প্রশাসকের দ্বারা নিয়ন্ত্রিত"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"এটি বিধিনিষেধ সেটিং থেকে নিয়ন্ত্রণ করা হয়"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"কল চলাকালীন উপলভ্য হবে না"</string>
     <string name="disabled" msgid="8017887509554714950">"অক্ষম হয়েছে"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"অনুমোদিত"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"অনুমোদিত নয়"</string>
diff --git a/packages/SettingsLib/res/values-bs/arrays.xml b/packages/SettingsLib/res/values-bs/arrays.xml
index 625112c..44bbfaf 100644
--- a/packages/SettingsLib/res/values-bs/arrays.xml
+++ b/packages/SettingsLib/res/values-bs/arrays.xml
@@ -291,16 +291,19 @@
   <string-array name="shade_display_awareness_entries">
     <item msgid="816770658383209617">"Samo zaslon uređaja (zadano)"</item>
     <item msgid="9161645858025071955">"Vanjski ekran"</item>
-    <item msgid="114384731934682483">"Na osnovu fokusa"</item>
+    <item msgid="23651860565814477">"Najnoviji dodir trake statusa"</item>
+    <item msgid="7521112827893653392">"Na temelju fokusa"</item>
   </string-array>
   <string-array name="shade_display_awareness_summaries">
     <item msgid="2964753205732912921">"Prikaži sjenu samo na ekranu uređaja"</item>
-    <item msgid="7795034287069726554">"Prikaži uređaj na jednom vanjskom ekranu"</item>
-    <item msgid="5280431949814340475">"Prikaži uređaj na posljednjem fokusiranom ekranu"</item>
+    <item msgid="1955398604822147783">"Prikaži sjenčanje na jednom vanjskom zaslonu"</item>
+    <item msgid="391477482416751568">"Prikaži sjenčanje na zaslonu na kojem je posljednje stupljeno u interakciju s trakom statusa"</item>
+    <item msgid="1746820128097981528">"Prikaži sjenčanje na posljednjem fokusiranom zaslonu"</item>
   </string-array>
   <string-array name="shade_display_awareness_values">
     <item msgid="3055776101992426514">"default_display"</item>
     <item msgid="774789415968826925">"any_external_display"</item>
     <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
+    <item msgid="4313165186636015195">"focused_display"</item>
   </string-array>
 </resources>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index 98e07b9..756a326 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -482,7 +482,7 @@
     <string name="daltonizer_type_overridden" msgid="4509604753672535721">"Zamjenjuje <xliff:g id="TITLE">%1$s</xliff:g>"</string>
     <string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
     <string name="power_charging_on_hold_settings_home_page" msgid="7690464049464805856">"<xliff:g id="LEVEL">%1$s</xliff:g> – punjenje je na čekanju radi zaštite baterije"</string>
-    <string name="power_incompatible_charging_settings_home_page" msgid="1322050766135126880">"<xliff:g id="LEVEL">%1$s</xliff:g> – provjerite opremu za punjenje"</string>
+    <string name="power_incompatible_charging_settings_home_page" msgid="1322050766135126880">"<xliff:g id="LEVEL">%1$s</xliff:g> – provjerite dodatak za punjenje"</string>
     <string name="power_remaining_duration_only" msgid="8264199158671531431">"Preostalo je još oko <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
     <string name="power_discharging_duration" msgid="1076561255466053220">"Preostalo je još oko <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
     <string name="power_remaining_duration_only_enhanced" msgid="2527842780666073218">"Preostalo je još oko <xliff:g id="TIME_REMAINING">%1$s</xliff:g> na osnovu vaše potrošnje"</string>
@@ -523,7 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Brzo punjenje"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Pod kontrolom administratora"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Kontrolira ograničena postavka"</string>
-    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Nije dostupno tijekom poziva"</string>
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Nije dostupno tokom poziva"</string>
     <string name="disabled" msgid="8017887509554714950">"Onemogućeno"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Dozvoljeno"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Nije dozvoljeno"</string>
diff --git a/packages/SettingsLib/res/values-ca/arrays.xml b/packages/SettingsLib/res/values-ca/arrays.xml
index e9b437e..f19551c 100644
--- a/packages/SettingsLib/res/values-ca/arrays.xml
+++ b/packages/SettingsLib/res/values-ca/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Només a la pantalla del dispositiu (opció predeterminada)"</item>
-    <item msgid="9161645858025071955">"Pantalla externa"</item>
-    <item msgid="114384731934682483">"Basat en l\'enfocament"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Mostra l\'ombra només a la pantalla del dispositiu"</item>
-    <item msgid="7795034287069726554">"Mostra el dispositiu en una sola pantalla externa"</item>
-    <item msgid="5280431949814340475">"Mostra el dispositiu a la darrera pantalla en què s\'hagi posat el focus"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index ef2920d..0548099 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Càrrega ràpida"</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 l\'opció de configuració restringida"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"No està disponible durant les trucades"</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>
diff --git a/packages/SettingsLib/res/values-cs/arrays.xml b/packages/SettingsLib/res/values-cs/arrays.xml
index 4bfdaf4..ad1cafd 100644
--- a/packages/SettingsLib/res/values-cs/arrays.xml
+++ b/packages/SettingsLib/res/values-cs/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Pouze zobrazení zařízení (výchozí)"</item>
-    <item msgid="9161645858025071955">"Externí displej"</item>
-    <item msgid="114384731934682483">"Výběr"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Zobrazovat panel pouze na displeji zařízení"</item>
-    <item msgid="7795034287069726554">"Zobrazovat panel na jednom externím displeji"</item>
-    <item msgid="5280431949814340475">"Zobrazovat panel na naposledy vybraném displeji"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-da/arrays.xml b/packages/SettingsLib/res/values-da/arrays.xml
index 6949755..ed45775 100644
--- a/packages/SettingsLib/res/values-da/arrays.xml
+++ b/packages/SettingsLib/res/values-da/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Kun på enhedens skærm (standard)"</item>
-    <item msgid="9161645858025071955">"Ekstern skærm"</item>
-    <item msgid="114384731934682483">"Fokusbaseret"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Vis kun skygge på enhedens skærm"</item>
-    <item msgid="7795034287069726554">"Vis enheden på en enkelt ekstern skærm"</item>
-    <item msgid="5280431949814340475">"Vis enheden på den skærm, der sidst var i fokus"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index 71c6be1..d7aa9b1 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Lynopladning"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Kontrolleret af administratoren"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Styres af en begrænset indstilling"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Kan ikke bruges under opkald"</string>
     <string name="disabled" msgid="8017887509554714950">"Deaktiveret"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Tilladt"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Ikke tilladt"</string>
diff --git a/packages/SettingsLib/res/values-de/arrays.xml b/packages/SettingsLib/res/values-de/arrays.xml
index adddd77..924718a 100644
--- a/packages/SettingsLib/res/values-de/arrays.xml
+++ b/packages/SettingsLib/res/values-de/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Nur Gerätedisplay (Standard)"</item>
-    <item msgid="9161645858025071955">"Externes Display"</item>
-    <item msgid="114384731934682483">"Fokusbasiert"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Leiste nur auf dem Display des Geräts anzeigen"</item>
-    <item msgid="7795034287069726554">"Gerät auf einem einzigen externen Display anzeigen"</item>
-    <item msgid="5280431949814340475">"Gerät auf zuletzt fokussiertem Display anzeigen"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index 1955da0..73268c5 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -56,7 +56,7 @@
     <string name="wifi_disabled_password_failure" msgid="6892387079613226738">"Authentifizierungsproblem"</string>
     <string name="wifi_cant_connect" msgid="5718417542623056783">"Verbindung nicht möglich"</string>
     <string name="wifi_cant_connect_to_ap" msgid="3099667989279700135">"Keine Verbindung zu \"<xliff:g id="AP_NAME">%1$s</xliff:g>\" möglich"</string>
-    <string name="wifi_check_password_try_again" msgid="8817789642851605628">"Prüfe das Passwort und versuch es noch einmal"</string>
+    <string name="wifi_check_password_try_again" msgid="8817789642851605628">"Prüfe das Passwort und versuche es noch einmal"</string>
     <string name="wifi_not_in_range" msgid="1541760821805777772">"Nicht in Reichweite"</string>
     <string name="wifi_no_internet_no_reconnect" msgid="821591791066497347">"Kein automatischer Verbindungsaufbau"</string>
     <string name="wifi_no_internet" msgid="1774198889176926299">"Kein Internetzugriff"</string>
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Schnelles Laden"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Durch den Administrator verwaltet"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Gesteuert durch eingeschränkte Einstellung"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Während Anrufen nicht verfügbar"</string>
     <string name="disabled" msgid="8017887509554714950">"Deaktiviert"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Zugelassen"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Nicht zugelassen"</string>
diff --git a/packages/SettingsLib/res/values-el/arrays.xml b/packages/SettingsLib/res/values-el/arrays.xml
index 9d7612c..41aefc0 100644
--- a/packages/SettingsLib/res/values-el/arrays.xml
+++ b/packages/SettingsLib/res/values-el/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Μόνο οθόνη συσκευής (Προεπιλογή)"</item>
-    <item msgid="9161645858025071955">"Εξωτερική οθόνη"</item>
-    <item msgid="114384731934682483">"Με εστίαση"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Εμφάνιση σκίασης μόνο στην οθόνη συσκευής"</item>
-    <item msgid="7795034287069726554">"Εμφάνιση συσκευής σε μία εξωτερική οθόνη"</item>
-    <item msgid="5280431949814340475">"Εμφάνιση συσκευής στην τελευταία οθόνη με εστίαση"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index 7f9f646..209b782 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Γρήγορη φόρτιση"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Ελέγχονται από το διαχειριστή"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Ελέγχεται από τη Ρύθμιση με περιορισμό"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Μη διαθέσιμη κατά τη διάρκεια κλήσεων"</string>
     <string name="disabled" msgid="8017887509554714950">"Απενεργοποιημένη"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Επιτρέπεται"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Δεν επιτρέπεται"</string>
diff --git a/packages/SettingsLib/res/values-en-rAU/arrays.xml b/packages/SettingsLib/res/values-en-rAU/arrays.xml
index 8c27ec6..6c7a7ff 100644
--- a/packages/SettingsLib/res/values-en-rAU/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rAU/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Device display only (default)"</item>
-    <item msgid="9161645858025071955">"External display"</item>
-    <item msgid="114384731934682483">"Focus-based"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Show shade on device display only"</item>
-    <item msgid="7795034287069726554">"Show device on single external display"</item>
-    <item msgid="5280431949814340475">"Show device on last focused display"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml
index 58bb7d8..d965c65 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Fast charging"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlled by admin"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Controlled by restricted setting"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Unavailable during calls"</string>
     <string name="disabled" msgid="8017887509554714950">"Disabled"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Allowed"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Not allowed"</string>
diff --git a/packages/SettingsLib/res/values-en-rCA/arrays.xml b/packages/SettingsLib/res/values-en-rCA/arrays.xml
index cfe77ca..48f2f5a 100644
--- a/packages/SettingsLib/res/values-en-rCA/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rCA/arrays.xml
@@ -291,16 +291,19 @@
   <string-array name="shade_display_awareness_entries">
     <item msgid="816770658383209617">"Device display only (Default)"</item>
     <item msgid="9161645858025071955">"External display"</item>
-    <item msgid="114384731934682483">"Focus-based"</item>
+    <item msgid="23651860565814477">"Latest status bar touch"</item>
+    <item msgid="7521112827893653392">"Focus-based"</item>
   </string-array>
   <string-array name="shade_display_awareness_summaries">
     <item msgid="2964753205732912921">"Show shade on device display only"</item>
-    <item msgid="7795034287069726554">"Show device on single external display"</item>
-    <item msgid="5280431949814340475">"Show device on last focused display"</item>
+    <item msgid="1955398604822147783">"Show shade on single external display"</item>
+    <item msgid="391477482416751568">"Show shade on display which last had its status bar interacted with"</item>
+    <item msgid="1746820128097981528">"Show shade on last focused display"</item>
   </string-array>
   <string-array name="shade_display_awareness_values">
     <item msgid="3055776101992426514">"default_display"</item>
     <item msgid="774789415968826925">"any_external_display"</item>
     <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
+    <item msgid="4313165186636015195">"focused_display"</item>
   </string-array>
 </resources>
diff --git a/packages/SettingsLib/res/values-en-rGB/arrays.xml b/packages/SettingsLib/res/values-en-rGB/arrays.xml
index 8c27ec6..6c7a7ff 100644
--- a/packages/SettingsLib/res/values-en-rGB/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rGB/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Device display only (default)"</item>
-    <item msgid="9161645858025071955">"External display"</item>
-    <item msgid="114384731934682483">"Focus-based"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Show shade on device display only"</item>
-    <item msgid="7795034287069726554">"Show device on single external display"</item>
-    <item msgid="5280431949814340475">"Show device on last focused display"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml
index 58bb7d8..d965c65 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Fast charging"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlled by admin"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Controlled by restricted setting"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Unavailable during calls"</string>
     <string name="disabled" msgid="8017887509554714950">"Disabled"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Allowed"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Not allowed"</string>
diff --git a/packages/SettingsLib/res/values-en-rIN/arrays.xml b/packages/SettingsLib/res/values-en-rIN/arrays.xml
index 8c27ec6..6c7a7ff 100644
--- a/packages/SettingsLib/res/values-en-rIN/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rIN/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Device display only (default)"</item>
-    <item msgid="9161645858025071955">"External display"</item>
-    <item msgid="114384731934682483">"Focus-based"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Show shade on device display only"</item>
-    <item msgid="7795034287069726554">"Show device on single external display"</item>
-    <item msgid="5280431949814340475">"Show device on last focused display"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml
index 58bb7d8..d965c65 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Fast charging"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlled by admin"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Controlled by restricted setting"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Unavailable during calls"</string>
     <string name="disabled" msgid="8017887509554714950">"Disabled"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Allowed"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Not allowed"</string>
diff --git a/packages/SettingsLib/res/values-es-rUS/arrays.xml b/packages/SettingsLib/res/values-es-rUS/arrays.xml
index daf9ab9..5894975 100644
--- a/packages/SettingsLib/res/values-es-rUS/arrays.xml
+++ b/packages/SettingsLib/res/values-es-rUS/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Solo en la pantalla del dispositivo (predeterminado)"</item>
-    <item msgid="9161645858025071955">"Pantalla externa"</item>
-    <item msgid="114384731934682483">"Basado en el enfoque"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Mostrar sobra solo en la pantalla del dispositivo"</item>
-    <item msgid="7795034287069726554">"Mostrar dispositivo en una sola pantalla externa"</item>
-    <item msgid="5280431949814340475">"Mostrar dispositivo en la última pantalla enfocada"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-es/arrays.xml b/packages/SettingsLib/res/values-es/arrays.xml
index a4bb49e..1e8c661 100644
--- a/packages/SettingsLib/res/values-es/arrays.xml
+++ b/packages/SettingsLib/res/values-es/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Solo en la pantalla del dispositivo (predeterminado)"</item>
-    <item msgid="9161645858025071955">"Pantalla externa"</item>
-    <item msgid="114384731934682483">"Basado en el enfoque"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Mostrar el panel solo en la pantalla del dispositivo"</item>
-    <item msgid="7795034287069726554">"Mostrar el dispositivo en una sola pantalla externa"</item>
-    <item msgid="5280431949814340475">"Mostrar el dispositivo en la última pantalla enfocada"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index b881994..00b987c 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Carga rápida"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlada por el administrador"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Controlado por ajustes restringidos"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"No disponible durante las llamadas"</string>
     <string name="disabled" msgid="8017887509554714950">"Inhabilitada"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Autorizadas"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"No autorizadas"</string>
diff --git a/packages/SettingsLib/res/values-et/arrays.xml b/packages/SettingsLib/res/values-et/arrays.xml
index 9a77991..88b8b98 100644
--- a/packages/SettingsLib/res/values-et/arrays.xml
+++ b/packages/SettingsLib/res/values-et/arrays.xml
@@ -291,16 +291,19 @@
   <string-array name="shade_display_awareness_entries">
     <item msgid="816770658383209617">"Ainult seadme ekraan (vaikimisi)"</item>
     <item msgid="9161645858025071955">"Väline ekraan"</item>
-    <item msgid="114384731934682483">"Fookusepõhine"</item>
+    <item msgid="23651860565814477">"Viimane olekuriba puudutus"</item>
+    <item msgid="7521112827893653392">"Fookusepõhine"</item>
   </string-array>
   <string-array name="shade_display_awareness_summaries">
     <item msgid="2964753205732912921">"Kuva menüü ainult seadme ekraanil"</item>
-    <item msgid="7795034287069726554">"Kuva seade ühe välisel ekraanil"</item>
-    <item msgid="5280431949814340475">"Kuva seade viimati esile tõstetud ekraanil"</item>
+    <item msgid="1955398604822147783">"Kuva menüü ühel välisel ekraanil"</item>
+    <item msgid="391477482416751568">"Kuva menüü ekraanil, mille olekuriba viimati kasutati"</item>
+    <item msgid="1746820128097981528">"Kuva menüü viimati esile tõstetud ekraanil"</item>
   </string-array>
   <string-array name="shade_display_awareness_values">
     <item msgid="3055776101992426514">"default_display"</item>
     <item msgid="774789415968826925">"any_external_display"</item>
     <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
+    <item msgid="4313165186636015195">"focused_display"</item>
   </string-array>
 </resources>
diff --git a/packages/SettingsLib/res/values-eu/arrays.xml b/packages/SettingsLib/res/values-eu/arrays.xml
index 3d59a27..a1528c2 100644
--- a/packages/SettingsLib/res/values-eu/arrays.xml
+++ b/packages/SettingsLib/res/values-eu/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Gailuaren pantailan soilik (lehenetsia)"</item>
-    <item msgid="9161645858025071955">"Kanpoko pantailan"</item>
-    <item msgid="114384731934682483">"Fokuaren arabera"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Erakutsi itzalak gailuaren pantailan soilik"</item>
-    <item msgid="7795034287069726554">"Erakutsi gailua kanpoko pantaila bakarrean"</item>
-    <item msgid="5280431949814340475">"Erakutsi gailua fokuratutako azken pantailan"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml
index a5235cf..1c422b6 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Kargatze bizkorra"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Administratzaileak kontrolatzen du"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Ezarpen mugatuak kontrolatzen du"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Ez dago erabilgarri deiak egin bitartean"</string>
     <string name="disabled" msgid="8017887509554714950">"Desgaituta"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Baimenduta"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Baimendu gabe"</string>
diff --git a/packages/SettingsLib/res/values-fa/arrays.xml b/packages/SettingsLib/res/values-fa/arrays.xml
index 9e1da41..d7face8 100644
--- a/packages/SettingsLib/res/values-fa/arrays.xml
+++ b/packages/SettingsLib/res/values-fa/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"۲"</item>
     <item msgid="4779928470672877922">"۳"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"فقط نمایشگر دستگاه (پیش‌فرض)"</item>
-    <item msgid="9161645858025071955">"نمایشگر خارجی"</item>
-    <item msgid="114384731934682483">"کانونی‌محور"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"نمایش سایه فقط در نمایشگر دستگاه"</item>
-    <item msgid="7795034287069726554">"نمایش دستگاه در یک نمایشگر خارجی"</item>
-    <item msgid="5280431949814340475">"نمایش دستگاه در آخرین نمایشگر کانونی‌شده"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"نمایشگر_پیش‌فرض"</item>
-    <item msgid="774789415968826925">"هر_نمایشگر_خارجی"</item>
-    <item msgid="7880769915418638436">"آخرین_لمس_نوار_وضعیت"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index 6d5e42b..b1f76fb 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"درحال شارژ سریع"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"توسط سرپرست سیستم کنترل می‌شود"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"با تنظیم «حالت محدود» کنترل می‌شود"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"درطول تماس دردسترس نیست"</string>
     <string name="disabled" msgid="8017887509554714950">"غیر فعال شد"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"مجاز بودن"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"مجاز نبودن"</string>
diff --git a/packages/SettingsLib/res/values-fi/arrays.xml b/packages/SettingsLib/res/values-fi/arrays.xml
index 0c970ec..a10dfbe 100644
--- a/packages/SettingsLib/res/values-fi/arrays.xml
+++ b/packages/SettingsLib/res/values-fi/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Vain laitteen näyttö (oletus)"</item>
-    <item msgid="9161645858025071955">"Ulkoinen näyttö"</item>
-    <item msgid="114384731934682483">"Kohdistusperustainen"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Näytä ilmoitusalue vain laitteen näytöllä"</item>
-    <item msgid="7795034287069726554">"Näytä laite yhdellä ulkoisella näytöllä"</item>
-    <item msgid="5280431949814340475">"Näytä laite viimeksi kohdistetulla näytöllä"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index 1e2db99..b59aa30 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Nopea lataus"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Järjestelmänvalvoja hallinnoi tätä asetusta."</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Rajoitettujen asetusten mukaisesti"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Ei käytettävissä puhelujen aikana"</string>
     <string name="disabled" msgid="8017887509554714950">"Pois päältä"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Sallittu"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Ei sallittu"</string>
diff --git a/packages/SettingsLib/res/values-fr-rCA/arrays.xml b/packages/SettingsLib/res/values-fr-rCA/arrays.xml
index 6fc0ed9..9eec65d 100644
--- a/packages/SettingsLib/res/values-fr-rCA/arrays.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Écran de l\'appareil seulement (par défaut)"</item>
-    <item msgid="9161645858025071955">"Écran externe"</item>
-    <item msgid="114384731934682483">"Affichage mis en évidence"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Afficher le volet sur l\'écran de l\'appareil seulement"</item>
-    <item msgid="7795034287069726554">"Afficher l\'appareil sur un seul écran externe"</item>
-    <item msgid="5280431949814340475">"Afficher l\'appareil sur le dernier affichage mis en évidence"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index f2a3454..99ba8b0 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Recharge rapide"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Contrôlé par l\'administrateur"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Contrôlé par les paramètres restreints"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Indisponible pendant les appels"</string>
     <string name="disabled" msgid="8017887509554714950">"Désactivée"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Autorisée"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Non autorisée"</string>
diff --git a/packages/SettingsLib/res/values-fr/arrays.xml b/packages/SettingsLib/res/values-fr/arrays.xml
index 36eb52d..3787509 100644
--- a/packages/SettingsLib/res/values-fr/arrays.xml
+++ b/packages/SettingsLib/res/values-fr/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Écran de l\'appareil uniquement (par défaut)"</item>
-    <item msgid="9161645858025071955">"Écran externe"</item>
-    <item msgid="114384731934682483">"Basé sur la sélection"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Afficher le volet sur l\'écran de l\'appareil uniquement"</item>
-    <item msgid="7795034287069726554">"Afficher l\'appareil sur un seul écran externe"</item>
-    <item msgid="5280431949814340475">"Afficher l\'appareil sur le dernier écran avec lequel l\'utilisateur a interagi"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index a017fa7..ba77d87 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Recharge rapide"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Contrôlé par l\'administrateur"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Contrôlé par les paramètres restreints"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Indisponible pendant les appels"</string>
     <string name="disabled" msgid="8017887509554714950">"Désactivée"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Autorisé"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Non autorisé"</string>
diff --git a/packages/SettingsLib/res/values-gl/arrays.xml b/packages/SettingsLib/res/values-gl/arrays.xml
index cd085fa..9307ba7 100644
--- a/packages/SettingsLib/res/values-gl/arrays.xml
+++ b/packages/SettingsLib/res/values-gl/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Só pantalla do dispositivo (opción predeterminada)"</item>
-    <item msgid="9161645858025071955">"Pantalla externa"</item>
-    <item msgid="114384731934682483">"En función do enfoque"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Mostrar panel despregable só na pantalla do dispositivo"</item>
-    <item msgid="7795034287069726554">"Mostrar dispositivo nunha única pantalla externa"</item>
-    <item msgid="5280431949814340475">"Mostrar dispositivo na última pantalla enfocada"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"pantalla_predeterminada"</item>
-    <item msgid="774789415968826925">"calquera_pantalla_externa"</item>
-    <item msgid="7880769915418638436">"último_toque_barra_estado"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index 6b28019..3d5a9bd 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Carga rápida"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Opción controlada polo administrador"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Baixo o control de opcións restrinxidas"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Non dispoñible durante as chamadas"</string>
     <string name="disabled" msgid="8017887509554714950">"Desactivada"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Permiso concedido"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Permiso non concedido"</string>
diff --git a/packages/SettingsLib/res/values-gu/arrays.xml b/packages/SettingsLib/res/values-gu/arrays.xml
index 912df2d..6026663b 100644
--- a/packages/SettingsLib/res/values-gu/arrays.xml
+++ b/packages/SettingsLib/res/values-gu/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"માત્ર ડિવાઇસનું ડિસ્પ્લે (ડિફૉલ્ટ)"</item>
-    <item msgid="9161645858025071955">"બાહ્ય ડિસ્પ્લે"</item>
-    <item msgid="114384731934682483">"ફોકસ-આધારિત"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"માત્ર ડિવાઇસના ડિસ્પ્લે પર શેડ બતાવો"</item>
-    <item msgid="7795034287069726554">"માત્ર એક બાહ્ય ડિસ્પ્લે પર ડિવાઇસ બતાવો"</item>
-    <item msgid="5280431949814340475">"છેલ્લે ફોકસ કરેલા ડિસ્પ્લે પર ડિવાઇસ બતાવો"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index fbf9afc..57ecad8 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -107,7 +107,7 @@
     <string name="tv_bluetooth_battery_level_untethered_right" msgid="8610019317279155595">"જમણી બાજુ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> બૅટરી"</string>
     <string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"સક્રિય"</string>
     <string name="bluetooth_saved_device" msgid="4895871321722311428">"સાચવેલું"</string>
-    <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"ચાલુ છે (માત્ર ડાબી બાજુ)"</string>
+    <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"સક્રિય (માત્ર ડાબી બાજુ)"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"ચાલુ છે (માત્ર જમણી બાજુ)"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"ચાલુ છે (ડાબી અને જમણી બાજુ)"</string>
     <string name="bluetooth_hearing_device_ambient_error" msgid="6035857289108813878">"આસપાસના અવાજો અપડેટ કરી શક્યા નથી"</string>
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"ઝડપી ચાર્જિંગ"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"વ્યવસ્થાપક દ્વારા નિયંત્રિત"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"પ્રતિબંધિત સેટિંગ દ્વારા નિયંત્રિત"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"કૉલ દરમિયાન અનુપલબ્ધ"</string>
     <string name="disabled" msgid="8017887509554714950">"બંધ કરી"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"મંજૂરી છે"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"મંજૂરી નથી"</string>
diff --git a/packages/SettingsLib/res/values-hi/arrays.xml b/packages/SettingsLib/res/values-hi/arrays.xml
index 25d6388..67de2ae 100644
--- a/packages/SettingsLib/res/values-hi/arrays.xml
+++ b/packages/SettingsLib/res/values-hi/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"सिर्फ़ डिवाइस का डिसप्ले (डिफ़ॉल्ट)"</item>
-    <item msgid="9161645858025071955">"बाहरी डिसप्ले पर"</item>
-    <item msgid="114384731934682483">"फ़ोकस के हिसाब से"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"सिर्फ़ डिवाइस के डिसप्ले पर शेड दिखाएं"</item>
-    <item msgid="7795034287069726554">"शेड को बाहरी डिसप्ले पर दिखाएं"</item>
-    <item msgid="5280431949814340475">"फ़ोकस किए गए पिछले डिसप्ले पर शेड दिखाएं"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index e883615..c1f4fe2 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -107,7 +107,7 @@
     <string name="tv_bluetooth_battery_level_untethered_right" msgid="8610019317279155595">"दाएं ईयरबड में <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> बैटरी बची है"</string>
     <string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"चालू"</string>
     <string name="bluetooth_saved_device" msgid="4895871321722311428">"सेव किया गया"</string>
-    <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"सिर्फ़ बाईं तरफ़ वाला चालू है"</string>
+    <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"सिर्फ़ बाईं ओर की मशीन चालू है"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"सिर्फ़ दाईं तरफ़ वाला चालू है"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"बाईं और दाईं तरफ़ वाला चालू है"</string>
     <string name="bluetooth_hearing_device_ambient_error" msgid="6035857289108813878">"वॉल्यूम को मैनेज करने की सेटिंग नहीं बदली जा सकी"</string>
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"फ़ास्ट चार्जिंग"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"इसका नियंत्रण एडमिन के पास है"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"इसे पाबंदी मोड वाली सेटिंग से कंट्रोल किया जाता है"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"कॉल के दौरान उपलब्ध नहीं है"</string>
     <string name="disabled" msgid="8017887509554714950">"बंद किया गया"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"अनुमति है"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"अनुमति नहीं है"</string>
diff --git a/packages/SettingsLib/res/values-hr/arrays.xml b/packages/SettingsLib/res/values-hr/arrays.xml
index 639e39e..d0ab9fd 100644
--- a/packages/SettingsLib/res/values-hr/arrays.xml
+++ b/packages/SettingsLib/res/values-hr/arrays.xml
@@ -291,16 +291,19 @@
   <string-array name="shade_display_awareness_entries">
     <item msgid="816770658383209617">"Samo zaslon uređaja (zadano)"</item>
     <item msgid="9161645858025071955">"Vanjski zaslon"</item>
-    <item msgid="114384731934682483">"Na temelju fokusa"</item>
+    <item msgid="23651860565814477">"Najnoviji dodir trake statusa"</item>
+    <item msgid="7521112827893653392">"Na temelju fokusa"</item>
   </string-array>
   <string-array name="shade_display_awareness_summaries">
     <item msgid="2964753205732912921">"Prikaži sjenu samo na zaslonu uređaja"</item>
-    <item msgid="7795034287069726554">"Prikaži uređaj na jednom vanjskom zaslonu"</item>
-    <item msgid="5280431949814340475">"Prikaži uređaj na posljednjem fokusiranom zaslonu"</item>
+    <item msgid="1955398604822147783">"Prikaži sjenčanje na jednom vanjskom zaslonu"</item>
+    <item msgid="391477482416751568">"Prikaži sjenčanje na zaslonu na kojem je posljednje stupljeno u interakciju s trakom statusa"</item>
+    <item msgid="1746820128097981528">"Prikaži sjenčanje na posljednjem fokusiranom zaslonu"</item>
   </string-array>
   <string-array name="shade_display_awareness_values">
     <item msgid="3055776101992426514">"default_display"</item>
     <item msgid="774789415968826925">"any_external_display"</item>
     <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
+    <item msgid="4313165186636015195">"focused_display"</item>
   </string-array>
 </resources>
diff --git a/packages/SettingsLib/res/values-hu/arrays.xml b/packages/SettingsLib/res/values-hu/arrays.xml
index d131966..d8d42f9 100644
--- a/packages/SettingsLib/res/values-hu/arrays.xml
+++ b/packages/SettingsLib/res/values-hu/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Csak az eszköz kijelzője (alapértelmezett)"</item>
-    <item msgid="9161645858025071955">"Külső kijelző"</item>
-    <item msgid="114384731934682483">"Fókusz alapján"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Felület megjelenítése csak az eszköz kijelzőjén"</item>
-    <item msgid="7795034287069726554">"Felület megjelenítése egyetlen külső kijelzőn"</item>
-    <item msgid="5280431949814340475">"Felület megjelenítése a legutóbb fókuszban lévő kijelzőn"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index 6627cb1..fa32155 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Gyors töltés…"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Rendszergazda által irányítva"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Korlátozott beállítás vezérli"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Nem áll rendelkezésre hívások közben"</string>
     <string name="disabled" msgid="8017887509554714950">"Letiltva"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Engedélyezett"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Nem engedélyezett"</string>
diff --git a/packages/SettingsLib/res/values-hy/arrays.xml b/packages/SettingsLib/res/values-hy/arrays.xml
index 5654501..b2133fb 100644
--- a/packages/SettingsLib/res/values-hy/arrays.xml
+++ b/packages/SettingsLib/res/values-hy/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Միայն սարքի էկրանը (կանխադրված)"</item>
-    <item msgid="9161645858025071955">"Արտաքին էկրան"</item>
-    <item msgid="114384731934682483">"Ֆոկուսի հիման վրա"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Ցույց տալ երանգը միայն սարքի էկրանին"</item>
-    <item msgid="7795034287069726554">"Ցույց տալ սարքը մեկ արտաքին էկրանին"</item>
-    <item msgid="5280431949814340475">"Ցույց տալ սարքը վերջին ֆոկուսավորված էկրանին"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index 2248b7b..fa87813 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Արագ լիցքավորում"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Վերահսկվում է ադմինիստրատորի կողմից"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Կառավարվում է սահմանափակ ռեժիմի կարգավորումներով"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Զանգի ընթացքում հասանելի չէ"</string>
     <string name="disabled" msgid="8017887509554714950">"Կասեցված է"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Թույլատրված է"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Արգելված"</string>
diff --git a/packages/SettingsLib/res/values-in/arrays.xml b/packages/SettingsLib/res/values-in/arrays.xml
index c256e8c..fa2fa9e 100644
--- a/packages/SettingsLib/res/values-in/arrays.xml
+++ b/packages/SettingsLib/res/values-in/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Hanya layar perangkat (Default)"</item>
-    <item msgid="9161645858025071955">"Layar eksternal"</item>
-    <item msgid="114384731934682483">"Berbasis fokus"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Tampilkan shade hanya di layar perangkat"</item>
-    <item msgid="7795034287069726554">"Tampilkan perangkat di satu layar eksternal"</item>
-    <item msgid="5280431949814340475">"Tampilkan perangkat di layar yang terakhir difokuskan"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index 5798f8d..1ff4b29 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Pengisian daya cepat"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Dikontrol oleh admin"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Dikontrol oleh Setelan Terbatas"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Tidak tersedia selama panggilan berlangsung"</string>
     <string name="disabled" msgid="8017887509554714950">"Dinonaktifkan"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Diizinkan"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Tidak diizinkan"</string>
diff --git a/packages/SettingsLib/res/values-is/arrays.xml b/packages/SettingsLib/res/values-is/arrays.xml
index 1d81344..851a7a49 100644
--- a/packages/SettingsLib/res/values-is/arrays.xml
+++ b/packages/SettingsLib/res/values-is/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Aðeins skjár tækis (sjálfgefið)"</item>
-    <item msgid="9161645858025071955">"Ytri skjár"</item>
-    <item msgid="114384731934682483">"Byggt á fókus"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Aðeins skyggja skjá tækis"</item>
-    <item msgid="7795034287069726554">"Sýna tæki á einum ytri skjá"</item>
-    <item msgid="5280431949814340475">"Sýna tæki á skjá sem var síðast í fókus"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index e8e49d0..804ea63 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Hraðhleðsla"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Stjórnað af kerfisstjóra"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Stýrt af takmarkaði stillingu"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Ekki í boði á meðan á símtölum stendur"</string>
     <string name="disabled" msgid="8017887509554714950">"Óvirkt"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Heimilað"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Ekki heimilað"</string>
diff --git a/packages/SettingsLib/res/values-it/arrays.xml b/packages/SettingsLib/res/values-it/arrays.xml
index 331410c..48777a3 100644
--- a/packages/SettingsLib/res/values-it/arrays.xml
+++ b/packages/SettingsLib/res/values-it/arrays.xml
@@ -291,16 +291,19 @@
   <string-array name="shade_display_awareness_entries">
     <item msgid="816770658383209617">"Solo display del dispositivo (impostazione predefinita)"</item>
     <item msgid="9161645858025071955">"Display esterno"</item>
-    <item msgid="114384731934682483">"In base alla selezione"</item>
+    <item msgid="23651860565814477">"Ultimo tocco alla barra di stato"</item>
+    <item msgid="7521112827893653392">"In base alla selezione"</item>
   </string-array>
   <string-array name="shade_display_awareness_summaries">
     <item msgid="2964753205732912921">"Mostra l\'area delle notifiche solo sul display del dispositivo"</item>
-    <item msgid="7795034287069726554">"Mostra il dispositivo su un singolo display esterno"</item>
-    <item msgid="5280431949814340475">"Mostra il dispositivo sull\'ultimo display selezionato"</item>
+    <item msgid="1955398604822147783">"Mostra l\'area delle notifiche su un singolo display esterno"</item>
+    <item msgid="391477482416751568">"Mostra l\'area delle notifiche sul display in cui è avvenuta l\'ultima interazione con la barra di stato"</item>
+    <item msgid="1746820128097981528">"Mostra l\'area delle notifiche sull\'ultimo display selezionato"</item>
   </string-array>
   <string-array name="shade_display_awareness_values">
     <item msgid="3055776101992426514">"default_display"</item>
     <item msgid="774789415968826925">"any_external_display"</item>
     <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
+    <item msgid="4313165186636015195">"focused_display"</item>
   </string-array>
 </resources>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index b2404cf..09ec5cc 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -107,7 +107,7 @@
     <string name="tv_bluetooth_battery_level_untethered_right" msgid="8610019317279155595">"Destra: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Attivo"</string>
     <string name="bluetooth_saved_device" msgid="4895871321722311428">"Dispositivo salvato"</string>
-    <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Attivo (solo sinistro)"</string>
+    <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Attiva (solo sinistra)"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Attivo (solo destro)"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Attivi (destro e sinistro)"</string>
     <string name="bluetooth_hearing_device_ambient_error" msgid="6035857289108813878">"Impossibile aggiornare audio ambientale"</string>
@@ -505,8 +505,8 @@
     <string name="power_charging_limited" msgid="4144004473976005214">"<xliff:g id="LEVEL">%1$s</xliff:g> - Ricarica in sospeso per proteggere la batteria"</string>
     <string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> ‑ In carica"</string>
     <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATUS">%2$s</xliff:g> - Ricarica completa entro <xliff:g id="TIME">%3$s</xliff:g>"</string>
-    <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> - Batteria completamente carica entro <xliff:g id="TIME">%2$s</xliff:g>"</string>
-    <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"Batteria completamente carica entro <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> - Batteria completamente carica entro: <xliff:g id="TIME">%2$s</xliff:g>"</string>
+    <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"Batteria completamente carica entro: <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"Ricarica completa entro le ore <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="battery_info_status_unknown" msgid="268625384868401114">"Sconosciuta"</string>
     <string name="battery_info_status_charging" msgid="4279958015430387405">"In carica"</string>
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Ricarica rapida"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Gestita dall\'amministratore"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Gestita tramite impostazioni con restrizioni"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Non disponibile durante le chiamate"</string>
     <string name="disabled" msgid="8017887509554714950">"Disattivato"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Autorizzazione concessa"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Autorizzazione non concessa"</string>
diff --git a/packages/SettingsLib/res/values-iw/arrays.xml b/packages/SettingsLib/res/values-iw/arrays.xml
index 5c1845f..9d176c0 100644
--- a/packages/SettingsLib/res/values-iw/arrays.xml
+++ b/packages/SettingsLib/res/values-iw/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"מסך המכשיר בלבד (ברירת המחדל)"</item>
-    <item msgid="9161645858025071955">"מסך חיצוני"</item>
-    <item msgid="114384731934682483">"לפי התמקדות"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"הצגת הצללה במסך המכשיר בלבד"</item>
-    <item msgid="7795034287069726554">"הצגת המכשיר במסך חיצוני אחד"</item>
-    <item msgid="5280431949814340475">"הצגת ההתראות במסך האחרון שהשתמשת בו"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index b520105..361dd18 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"טעינה מהירה"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"נמצא בשליטת מנהל מערכת"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"בשליטה של הגדרה מוגבלת"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"ההעדפה הזו לא זמינה במהלך שיחות"</string>
     <string name="disabled" msgid="8017887509554714950">"מושבת"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"מורשה"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"לא מורשה"</string>
@@ -617,7 +616,7 @@
     <string name="help_label" msgid="3528360748637781274">"עזרה ומשוב"</string>
     <string name="storage_category" msgid="2287342585424631813">"אחסון"</string>
     <string name="shared_data_title" msgid="1017034836800864953">"נתונים משותפים"</string>
-    <string name="shared_data_summary" msgid="5516326713822885652">"הצגה ושינוי של נתונים משותפים"</string>
+    <string name="shared_data_summary" msgid="5516326713822885652">"צפייה בנתונים המשותפים ושינוי שלהם"</string>
     <string name="shared_data_no_blobs_text" msgid="3108114670341737434">"אין נתונים משותפים למשתמש הזה."</string>
     <string name="shared_data_query_failure_text" msgid="3489828881998773687">"אירעה שגיאה באחזור הנתונים המשותפים. צריך לנסות שוב."</string>
     <string name="blob_id_text" msgid="8680078988996308061">"מזהה נתונים משותפים: <xliff:g id="BLOB_ID">%d</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-ja/arrays.xml b/packages/SettingsLib/res/values-ja/arrays.xml
index 9dc234b..d5d5ff1 100644
--- a/packages/SettingsLib/res/values-ja/arrays.xml
+++ b/packages/SettingsLib/res/values-ja/arrays.xml
@@ -291,16 +291,19 @@
   <string-array name="shade_display_awareness_entries">
     <item msgid="816770658383209617">"デバイスのディスプレイのみ(デフォルト)"</item>
     <item msgid="9161645858025071955">"外部ディスプレイ"</item>
-    <item msgid="114384731934682483">"フォーカスに基づく"</item>
+    <item msgid="23651860565814477">"ステータスバーの最新のタップ"</item>
+    <item msgid="7521112827893653392">"フォーカスに基づく"</item>
   </string-array>
   <string-array name="shade_display_awareness_summaries">
     <item msgid="2964753205732912921">"デバイスのディスプレイにのみシェードを表示する"</item>
-    <item msgid="7795034287069726554">"1 台の外部ディスプレイにデバイスを表示する"</item>
-    <item msgid="5280431949814340475">"最後にフォーカスされたディスプレイにデバイスを表示する"</item>
+    <item msgid="1955398604822147783">"1 台の外部ディスプレイにシェードを表示する"</item>
+    <item msgid="391477482416751568">"最後にステータスバーが操作されたディスプレイにシェードを表示する"</item>
+    <item msgid="1746820128097981528">"最後にフォーカスされたディスプレイにシェードを表示する"</item>
   </string-array>
   <string-array name="shade_display_awareness_values">
     <item msgid="3055776101992426514">"default_display"</item>
     <item msgid="774789415968826925">"any_external_display"</item>
     <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
+    <item msgid="4313165186636015195">"focused_display"</item>
   </string-array>
 </resources>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index 320c707..1170cd1 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -123,7 +123,7 @@
     <string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"有効(メディアのみ)、左のみ"</string>
     <string name="bluetooth_hearing_aid_media_only_right_active" msgid="3854140683042617230">"有効(メディアのみ)、右のみ"</string>
     <string name="bluetooth_hearing_aid_media_only_left_and_right_active" msgid="1299913413062528417">"有効(メディアのみ)、左右"</string>
-    <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"メディアの音声"</string>
+    <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>
diff --git a/packages/SettingsLib/res/values-ka/arrays.xml b/packages/SettingsLib/res/values-ka/arrays.xml
index 8d1adf6..8ee3338 100644
--- a/packages/SettingsLib/res/values-ka/arrays.xml
+++ b/packages/SettingsLib/res/values-ka/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"მხოლოდ მოწყობილობის ეკრანი (ნაგულისხმევი)"</item>
-    <item msgid="9161645858025071955">"გარე ეკრანი"</item>
-    <item msgid="114384731934682483">"ფოკუსის მიხედვით"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"ჩრდილის ჩვენება მხოლოდ მოწყობილობის ეკრანზე"</item>
-    <item msgid="7795034287069726554">"ჩრდილის ჩვენება ერთ გარე ეკრანზე"</item>
-    <item msgid="5280431949814340475">"მოწყობილობის ჩვენება ბოლო ფოკუსირებულ ეკრანზე"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-kk/arrays.xml b/packages/SettingsLib/res/values-kk/arrays.xml
index e8996de..6aa5f2b 100644
--- a/packages/SettingsLib/res/values-kk/arrays.xml
+++ b/packages/SettingsLib/res/values-kk/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Тек құрылғы дисплейі (әдепкі)"</item>
-    <item msgid="9161645858025071955">"Сыртқы дисплей"</item>
-    <item msgid="114384731934682483">"Назарға негізделген"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Құрылғы дисплейінде ғана реңк көрсету"</item>
-    <item msgid="7795034287069726554">"Жалғыз сыртқы дисплейі бар құрылғыны көрсету"</item>
-    <item msgid="5280431949814340475">"Соңғы рет назарда болған дисплейдегі құрылғыны көрсету"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index ebb723c..9082a56 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -506,7 +506,7 @@
     <string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> – Зарядталып жатыр"</string>
     <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATUS">%2$s</xliff:g> - Зарядталып болады: <xliff:g id="TIME">%3$s</xliff:g>"</string>
     <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> - Толық заряд алуға қалған уақыт: <xliff:g id="TIME">%2$s</xliff:g>"</string>
-    <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"Толық заряд алуға қалған уақыт: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"Толықтай зарядталып болады: <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"Заряд толуына қалған уақыт: <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="battery_info_status_unknown" msgid="268625384868401114">"Белгісіз"</string>
     <string name="battery_info_status_charging" msgid="4279958015430387405">"Зарядталуда"</string>
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Жылдам зарядтау"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Әкімші басқарады"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Шектелген параметрлер арқылы басқарылады."</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Қоңырау шалу кезінде қолжетімді емес."</string>
     <string name="disabled" msgid="8017887509554714950">"Өшірілген"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Рұқсат берілген"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Рұқсат етілмеген"</string>
diff --git a/packages/SettingsLib/res/values-km/arrays.xml b/packages/SettingsLib/res/values-km/arrays.xml
index ee6ee56..e9a21e8 100644
--- a/packages/SettingsLib/res/values-km/arrays.xml
+++ b/packages/SettingsLib/res/values-km/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"ផ្ទាំងអេក្រង់ឧបករណ៍តែប៉ុណ្ណោះ (លំនាំដើម)"</item>
-    <item msgid="9161645858025071955">"ផ្ទាំង​អេក្រង់​ខាង​ក្រៅ"</item>
-    <item msgid="114384731934682483">"ផ្អែកលើការផ្ដោត"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"បង្ហាញផ្ទាំងនៅលើផ្ទាំងអេក្រង់ឧបករណ៍តែប៉ុណ្ណោះ"</item>
-    <item msgid="7795034287069726554">"បង្ហាញឧបករណ៍នៅលើផ្ទាំងអេក្រង់ខាងក្រៅតែមួយ"</item>
-    <item msgid="5280431949814340475">"បង្ហាញឧបករណ៍នៅលើផ្ទាំងអេក្រង់ដែលផ្ដោតចុងក្រោយ"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-kn/arrays.xml b/packages/SettingsLib/res/values-kn/arrays.xml
index 51e6e15..dc9c7e0 100644
--- a/packages/SettingsLib/res/values-kn/arrays.xml
+++ b/packages/SettingsLib/res/values-kn/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"ಸಾಧನದ ಡಿಸ್‌ಪ್ಲೇ ಮಾತ್ರ (ಡೀಫಾಲ್ಟ್)"</item>
-    <item msgid="9161645858025071955">"ಬಾಹ್ಯ ಡಿಸ್‌ಪ್ಲೇ"</item>
-    <item msgid="114384731934682483">"ಫೋಕಸ್-ಆಧಾರಿತ"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"ಸಾಧನದ ಡಿಸ್‌ಪ್ಲೇನಲ್ಲಿ ಮಾತ್ರ ಶೇಡ್ ತೋರಿಸಿ"</item>
-    <item msgid="7795034287069726554">"ಒಂದೇ ಬಾಹ್ಯ ಡಿಸ್‌ಪ್ಲೇನಲ್ಲಿ ಸಾಧನವನ್ನು ತೋರಿಸಿ"</item>
-    <item msgid="5280431949814340475">"ಕೊನೆಯ ಕೇಂದ್ರೀಕೃತ ಡಿಸ್‌ಪ್ಲೇನಲ್ಲಿ ಸಾಧನವನ್ನು ತೋರಿಸಿ"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index b0b6fca..d2b2176 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"ಫಾಸ್ಟ್ ಚಾರ್ಜಿಂಗ್"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"ನಿರ್ವಾಹಕರ ಮೂಲಕ ನಿಯಂತ್ರಿಸಲಾಗಿದೆ"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"ನಿರ್ಬಂಧಿಸಲಾದ ಸೆಟ್ಟಿಂಗ್ ಮೂಲಕ ನಿಯಂತ್ರಿಸಲಾಗುತ್ತದೆ"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"ಕರೆಗಳ ಸಮಯದಲ್ಲಿ ಲಭ್ಯವಿಲ್ಲ"</string>
     <string name="disabled" msgid="8017887509554714950">"ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"ಅನುಮತಿಸಲಾಗಿದೆ"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"ಅನುಮತಿ ಇಲ್ಲ"</string>
diff --git a/packages/SettingsLib/res/values-ko/arrays.xml b/packages/SettingsLib/res/values-ko/arrays.xml
index dd1121f..1477497 100644
--- a/packages/SettingsLib/res/values-ko/arrays.xml
+++ b/packages/SettingsLib/res/values-ko/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"기기 디스플레이만(기본값)"</item>
-    <item msgid="9161645858025071955">"외부 디스플레이"</item>
-    <item msgid="114384731934682483">"포커스 기반"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"기기 디스플레이에만 음영 표시"</item>
-    <item msgid="7795034287069726554">"단일 외부 디스플레이에 기기 표시"</item>
-    <item msgid="5280431949814340475">"마지막으로 포커스된 디스플레이에 기기 표시"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index 9a2af37..bece637 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"급속 충전"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"관리자가 제어"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"제한된 설정으로 제어됨"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"통화 중에는 사용할 수 없습니다."</string>
     <string name="disabled" msgid="8017887509554714950">"사용 안함"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"허용됨"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"허용되지 않음"</string>
diff --git a/packages/SettingsLib/res/values-ky/arrays.xml b/packages/SettingsLib/res/values-ky/arrays.xml
index fe44fe0..54d9ecd 100644
--- a/packages/SettingsLib/res/values-ky/arrays.xml
+++ b/packages/SettingsLib/res/values-ky/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Түзмөктүн экраны гана (демейки)"</item>
-    <item msgid="9161645858025071955">"Тышкы экран"</item>
-    <item msgid="114384731934682483">"Focus-based"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Көлөкөнү түзмөктүн экранында гана көрсөтүү"</item>
-    <item msgid="7795034287069726554">"Түзмөктү бир тышкы экранда көрсөтүү"</item>
-    <item msgid="5280431949814340475">"Түзмөктү акыркы активдүү экранда көрсөтүү"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index a756d57..b6baf38 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Ыкчам кубаттоо"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Администратор тарабынан көзөмөлдөнөт"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Чектелген параметр аркылуу көзөмөлдөнөт"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Сүйлөшүп жаткан учурда жеткиликсиз"</string>
     <string name="disabled" msgid="8017887509554714950">"Өчүрүлгөн"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Уруксат берилген"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Тыюу салынган"</string>
diff --git a/packages/SettingsLib/res/values-lo/arrays.xml b/packages/SettingsLib/res/values-lo/arrays.xml
index d9da45b4..ccf645b 100644
--- a/packages/SettingsLib/res/values-lo/arrays.xml
+++ b/packages/SettingsLib/res/values-lo/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"ຈໍສະແດງຜົນຂອງອຸປະກອນເທົ່ານັ້ນ (ຄ່າເລີ່ມຕົ້ນ)"</item>
-    <item msgid="9161645858025071955">"ຈໍສະແດງຜົນພາຍນອກ"</item>
-    <item msgid="114384731934682483">"ອີງຕາມການໂຟກັສ"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"ສະແດງເສດສີໃນຈໍສະແດງຜົນຂອງອຸປະກອນເທົ່ານັ້ນ"</item>
-    <item msgid="7795034287069726554">"ສະແດງອຸປະກອນໃນຈໍສະແດງຜົນພາຍນອກເຄື່ອງດຽວ"</item>
-    <item msgid="5280431949814340475">"ສະແດງອຸປະກອນໃນຈໍສະແດງຜົນທີ່ໂຟກັສຫຼ້າສຸດ"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-lt/arrays.xml b/packages/SettingsLib/res/values-lt/arrays.xml
index 6129af9..1f40b1a 100644
--- a/packages/SettingsLib/res/values-lt/arrays.xml
+++ b/packages/SettingsLib/res/values-lt/arrays.xml
@@ -291,16 +291,19 @@
   <string-array name="shade_display_awareness_entries">
     <item msgid="816770658383209617">"Tik įrenginio ekranas (numatytasis nustatymas)"</item>
     <item msgid="9161645858025071955">"Išorinis ekranas"</item>
-    <item msgid="114384731934682483">"Pagal fokusavimą"</item>
+    <item msgid="23651860565814477">"Naujausias būsenos juostos palietimas"</item>
+    <item msgid="7521112827893653392">"Pagal fokusavimą"</item>
   </string-array>
   <string-array name="shade_display_awareness_summaries">
     <item msgid="2964753205732912921">"Rodyti šešėlį tik įrenginio ekrane"</item>
-    <item msgid="7795034287069726554">"Rodyti įrenginį viename išoriniame ekrane"</item>
-    <item msgid="5280431949814340475">"Rodyti įrenginį paskutiniame fokusuotame ekrane"</item>
+    <item msgid="1955398604822147783">"Rodyti šešėlį viename išoriniame ekrane"</item>
+    <item msgid="391477482416751568">"Rodyti šešėlį ekrane, kuriame paskutinį kartą buvo sąveikaujama su būsenos juosta"</item>
+    <item msgid="1746820128097981528">"Rodyti šešėlį paskutiniame fokusuotame ekrane"</item>
   </string-array>
   <string-array name="shade_display_awareness_values">
     <item msgid="3055776101992426514">"default_display"</item>
     <item msgid="774789415968826925">"any_external_display"</item>
     <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
+    <item msgid="4313165186636015195">"focused_display"</item>
   </string-array>
 </resources>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index caa5b18..f81caa8 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Spartusis įkrovimas"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Valdo administratorius"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Valdoma pagal apribotą nustatymą"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Nepasiekiama per skambučius"</string>
     <string name="disabled" msgid="8017887509554714950">"Neleidžiama"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Leidžiama"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Neleidžiama"</string>
diff --git a/packages/SettingsLib/res/values-lv/arrays.xml b/packages/SettingsLib/res/values-lv/arrays.xml
index 92d141e..6d293be 100644
--- a/packages/SettingsLib/res/values-lv/arrays.xml
+++ b/packages/SettingsLib/res/values-lv/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Tikai ierīces displejs (noklusējums)"</item>
-    <item msgid="9161645858025071955">"Ārējais displejs"</item>
-    <item msgid="114384731934682483">"Saskaņā ar fokusu"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Rādīt ēnu tikai ierīces displejā"</item>
-    <item msgid="7795034287069726554">"Rādīt ierīci vienā ārējā displejā"</item>
-    <item msgid="5280431949814340475">"Rādīt ierīci pēdējā fokusētajā displejā"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index 84bf692..987857b 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Ātrā uzlāde"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Kontrolē administrators"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Kontrolē ierobežots iestatījums"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Ierīce nav pieejama zvanu laikā"</string>
     <string name="disabled" msgid="8017887509554714950">"Atspējots"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Atļauts"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Nav atļauts"</string>
diff --git a/packages/SettingsLib/res/values-mk/arrays.xml b/packages/SettingsLib/res/values-mk/arrays.xml
index 8e9bb21..0490f28 100644
--- a/packages/SettingsLib/res/values-mk/arrays.xml
+++ b/packages/SettingsLib/res/values-mk/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Само на екранот на уредот (стандардно)"</item>
-    <item msgid="9161645858025071955">"Надворешен екран"</item>
-    <item msgid="114384731934682483">"Засновано на фокус"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Прикажувај сенка само на екранот на уредот"</item>
-    <item msgid="7795034287069726554">"Прикажувај сенка на еден надворешен екран"</item>
-    <item msgid="5280431949814340475">"Прикажувај сенка на последниот фокусиран екран"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"стандарден_екран"</item>
-    <item msgid="774789415968826925">"кој_било_надворешен_екран"</item>
-    <item msgid="7880769915418638436">"последен_допир_на_статусната_лента"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index a06da85..fa65437 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Се полни брзо"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Контролирано од администраторот"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Контролирано со ограничени поставки"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Недостапно при повици"</string>
     <string name="disabled" msgid="8017887509554714950">"Оневозможено"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Со дозвола"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Без дозвола"</string>
diff --git a/packages/SettingsLib/res/values-ml/arrays.xml b/packages/SettingsLib/res/values-ml/arrays.xml
index 4b8dbce..811c03d 100644
--- a/packages/SettingsLib/res/values-ml/arrays.xml
+++ b/packages/SettingsLib/res/values-ml/arrays.xml
@@ -291,16 +291,19 @@
   <string-array name="shade_display_awareness_entries">
     <item msgid="816770658383209617">"ഉപകരണ ഡിസ്പ്ലേ മാത്രം (ഡിഫോൾട്ട്)"</item>
     <item msgid="9161645858025071955">"ബാഹ്യ ഡിസ്പ്ലേ"</item>
-    <item msgid="114384731934682483">"ഫോക്കസ്-അടിസ്ഥാനമാക്കിയുള്ളത്"</item>
+    <item msgid="23651860565814477">"ഏറ്റവും പുതിയ സ്റ്റാറ്റസ് ബാർ ടച്ച്"</item>
+    <item msgid="7521112827893653392">"ഫോക്കസ്-അടിസ്ഥാനമാക്കിയുള്ളത്"</item>
   </string-array>
   <string-array name="shade_display_awareness_summaries">
     <item msgid="2964753205732912921">"ഉപകരണ ഡിസ്പ്ലേയിൽ മാത്രം ഷെയ്‌ഡ് കാണിക്കുക"</item>
-    <item msgid="7795034287069726554">"ഒരൊറ്റ ബാഹ്യ ഡിസ്പ്ലേയിൽ ഉപകരണം കാണിക്കുക"</item>
-    <item msgid="5280431949814340475">"അവസാനം ഫോക്കസ് ചെയ്ത ഡിസ്പ്ലേയിൽ ഉപകരണം കാണിക്കുക"</item>
+    <item msgid="1955398604822147783">"ഒരൊറ്റ ബാഹ്യ ഡിസ്പ്ലേയിൽ ഷെയ്‌ഡ് കാണിക്കുക"</item>
+    <item msgid="391477482416751568">"അവസാനം അതിന്റെ സ്റ്റാറ്റസ് ബാർ ഇടപഴകിയ ഡിസ്പ്ലേയിൽ ഷെയ്‌ഡ് കാണിക്കുക"</item>
+    <item msgid="1746820128097981528">"അവസാനം ഫോക്കസ് ചെയ്ത ഡിസ്പ്ലേയിൽ ഷേഡ് കാണിക്കുക"</item>
   </string-array>
   <string-array name="shade_display_awareness_values">
     <item msgid="3055776101992426514">"default_display"</item>
     <item msgid="774789415968826925">"any_external_display"</item>
     <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
+    <item msgid="4313165186636015195">"focused_display"</item>
   </string-array>
 </resources>
diff --git a/packages/SettingsLib/res/values-mn/arrays.xml b/packages/SettingsLib/res/values-mn/arrays.xml
index 5d5b8f9..ca103af 100644
--- a/packages/SettingsLib/res/values-mn/arrays.xml
+++ b/packages/SettingsLib/res/values-mn/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Зөвхөн төхөөрөмжийн дэлгэц (өгөгдмөл)"</item>
-    <item msgid="9161645858025071955">"Гаднын дэлгэц"</item>
-    <item msgid="114384731934682483">"Төвлөрөлд тулгуурласан"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Зөвхөн төхөөрөмж дээрх дэлгэцэд сүүдрийг харуулах"</item>
-    <item msgid="7795034287069726554">"Зөвхөн гаднын нэг дэлгэц дээр төхөөрөмжийг харуулах"</item>
-    <item msgid="5280431949814340475">"Сүүлд төвлөрсөн дэлгэц дээр төхөөрөмжийг харуулах"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index c1652132..e8e9e0c 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Шуурхай цэнэглэх"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Админ удирдсан"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Хязгаарлагдсан тохиргоогоор хянадаг"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Дуудлагын үер боломжгүй"</string>
     <string name="disabled" msgid="8017887509554714950">"Идэвхгүйжүүлсэн"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Зөвшөөрсөн"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Зөвшөөрөөгүй"</string>
diff --git a/packages/SettingsLib/res/values-mr/arrays.xml b/packages/SettingsLib/res/values-mr/arrays.xml
index 959499c..1437a2c 100644
--- a/packages/SettingsLib/res/values-mr/arrays.xml
+++ b/packages/SettingsLib/res/values-mr/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"फक्त डिव्हाइस डिस्प्ले (डीफॉल्ट)"</item>
-    <item msgid="9161645858025071955">"बाह्य डिस्प्ले"</item>
-    <item msgid="114384731934682483">"फोकसवर आधारित"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"फक्त डिव्हाइस डिस्प्लेवर शेड दाखवा"</item>
-    <item msgid="7795034287069726554">"एकल बाह्य डिस्प्लेवर डिव्हाइस दाखवा"</item>
-    <item msgid="5280431949814340475">"शेवटच्या फोकस केलेल्या डिस्प्लेवर डिव्हाइस दाखवा"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index d47f8ff..f1f5cab 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"फास्ट चार्जिंग"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"प्रशासकाने नियंत्रित केलेले"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"प्रतिबंधित केलेल्या सेटिंग द्वारे नियंत्रित"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"कॉल दरम्‍यान उपलब्ध नाही"</string>
     <string name="disabled" msgid="8017887509554714950">"अक्षम"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"अनुमती आहे"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"अनुमती नाही"</string>
diff --git a/packages/SettingsLib/res/values-ms/arrays.xml b/packages/SettingsLib/res/values-ms/arrays.xml
index 7b6cbe1..464a0c7 100644
--- a/packages/SettingsLib/res/values-ms/arrays.xml
+++ b/packages/SettingsLib/res/values-ms/arrays.xml
@@ -291,16 +291,19 @@
   <string-array name="shade_display_awareness_entries">
     <item msgid="816770658383209617">"Paparan peranti sahaja (Lalai)"</item>
     <item msgid="9161645858025071955">"Paparan luaran"</item>
-    <item msgid="114384731934682483">"Berasaskan fokus"</item>
+    <item msgid="23651860565814477">"Sentuhan bar status terbaharu"</item>
+    <item msgid="7521112827893653392">"Berasaskan fokus"</item>
   </string-array>
   <string-array name="shade_display_awareness_summaries">
     <item msgid="2964753205732912921">"Tunjukkan rona warna pada paparan peranti sahaja"</item>
-    <item msgid="7795034287069726554">"Tunjukkan peranti pada satu paparan luaran"</item>
-    <item msgid="5280431949814340475">"Tunjukkan peranti pada paparan terakhir yang difokuskan"</item>
+    <item msgid="1955398604822147783">"Tunjukkan rona warna pada satu paparan luaran"</item>
+    <item msgid="391477482416751568">"Tunjukkan rona warna pada paparan yang terakhir berinteraksi dengan bar status"</item>
+    <item msgid="1746820128097981528">"Tunjukkan rona warna pada paparan fokus terakhir"</item>
   </string-array>
   <string-array name="shade_display_awareness_values">
     <item msgid="3055776101992426514">"default_display"</item>
     <item msgid="774789415968826925">"any_external_display"</item>
     <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
+    <item msgid="4313165186636015195">"focused_display"</item>
   </string-array>
 </resources>
diff --git a/packages/SettingsLib/res/values-my/arrays.xml b/packages/SettingsLib/res/values-my/arrays.xml
index 71a1c7c..aef22b2 100644
--- a/packages/SettingsLib/res/values-my/arrays.xml
+++ b/packages/SettingsLib/res/values-my/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"စက်ဖန်သားပြင် သီးသန့် (မူရင်း)"</item>
-    <item msgid="9161645858025071955">"ပြင်ပဖန်သားပြင်"</item>
-    <item msgid="114384731934682483">"ပြသမှုအခြေပြု"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"စက်ဖန်သားပြင်တွင်သာ အရိပ်ပြပါ"</item>
-    <item msgid="7795034287069726554">"ပြင်ပဖန်သားပြင်တစ်ခုတွင် စက်ကိုပြပါ"</item>
-    <item msgid="5280431949814340475">"နောက်ဆုံးပြသထားသော ဖန်သားပြင်တွင် စက်ကိုပြပါ"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"မူရင်းဖန်သားပြင်"</item>
-    <item msgid="774789415968826925">"မည်သည့်ပြင်ပဖန်သားပြင်မဆို"</item>
-    <item msgid="7880769915418638436">"အခြေအနေပြဘား နောက်ဆုံးထိတွေ့မှု"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index 4ba82fd..cf493cf 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"အမြန်အားသွင်းခြင်း"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"စီမံခန့်ခွဲသူမှ ထိန်းချုပ်ပါသည်"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"ကန့်သတ်ဆက်တင်ဖြင့် ထိန်းချုပ်ထားသည်"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"ဖုန်းခေါ်ဆိုနေချိန်တွင် မရနိုင်ပါ"</string>
     <string name="disabled" msgid="8017887509554714950">"ပိတ်ထားပြီး"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"ခွင့်ပြုထားသည်"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"ခွင့်မပြုပါ"</string>
diff --git a/packages/SettingsLib/res/values-nb/arrays.xml b/packages/SettingsLib/res/values-nb/arrays.xml
index 8d52693..88f193c 100644
--- a/packages/SettingsLib/res/values-nb/arrays.xml
+++ b/packages/SettingsLib/res/values-nb/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Bare enhetsskjermen (standard)"</item>
-    <item msgid="9161645858025071955">"Ekstern skjerm"</item>
-    <item msgid="114384731934682483">"Fokusbasert"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Vis skyggen bare på enhetsskjermen"</item>
-    <item msgid="7795034287069726554">"Vis enheten på én ekstern skjerm"</item>
-    <item msgid="5280431949814340475">"Vis enheten på den sist fokuserte skjermen"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"Standardskjerm"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index f6de346..045318a 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Hurtiglading"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Kontrollert av administratoren"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Kontrollert av en begrenset innstilling"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Utilgjengelig under samtaler"</string>
     <string name="disabled" msgid="8017887509554714950">"Deaktivert"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Tillatt"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Ikke tillatt"</string>
diff --git a/packages/SettingsLib/res/values-ne/arrays.xml b/packages/SettingsLib/res/values-ne/arrays.xml
index cd8448f..1989994 100644
--- a/packages/SettingsLib/res/values-ne/arrays.xml
+++ b/packages/SettingsLib/res/values-ne/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"२"</item>
     <item msgid="4779928470672877922">"३"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"डिभाइसको डिस्प्ले मात्र (डिफल्ट)"</item>
-    <item msgid="9161645858025071955">"बाह्य डिस्प्ले"</item>
-    <item msgid="114384731934682483">"फोकसमा आधारित"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"यो सेड डिभाइसकै डिस्प्लेमा मात्र देखाउनुहोस्"</item>
-    <item msgid="7795034287069726554">"यो डिभाइस एकल बाह्य डिस्प्लेमा देखाउनुहोस्"</item>
-    <item msgid="5280431949814340475">"यो डिभाइस पछिल्लो पटक फोकस गरिएको डिस्प्लेमा देखाउनुहोस्"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index 28d02a1..d637a4b 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -262,7 +262,7 @@
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"कनेक्ट गरिएका डिभाइस"</string>
     <string name="adb_wireless_device_connected_summary" msgid="3039660790249148713">"हाल जोडिएको छ"</string>
     <string name="adb_wireless_device_details_title" msgid="7129369670526565786">"डिभाइसको विवरण"</string>
-    <string name="adb_device_forget" msgid="193072400783068417">"बिर्सनुहोस्"</string>
+    <string name="adb_device_forget" msgid="193072400783068417">"हटाउनुहोस्"</string>
     <string name="adb_device_fingerprint_title_format" msgid="291504822917843701">"डिभाइसको फिंगरप्रिन्ट: <xliff:g id="FINGERPRINT_PARAM">%1$s</xliff:g>"</string>
     <string name="adb_wireless_connection_failed_title" msgid="664211177427438438">"वायरलेसमा जोड्न सकिएन"</string>
     <string name="adb_wireless_connection_failed_message" msgid="9213896700171602073">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> सही नेटवर्कमा जोडिएको कुरा सुनिश्चित गर्नुहोस्"</string>
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"फास्ट चार्जिङ"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"प्रशासकद्वारा नियन्त्रित"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"प्रतिबन्धित सेटिङले नियन्त्रण गरेको"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"कल चलिरहेका बेला उपलब्ध छैन"</string>
     <string name="disabled" msgid="8017887509554714950">"असक्षम पारियो"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"अनुमति छ"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"अनुमति छैन"</string>
diff --git a/packages/SettingsLib/res/values-nl/arrays.xml b/packages/SettingsLib/res/values-nl/arrays.xml
index d92b806..12c9551 100644
--- a/packages/SettingsLib/res/values-nl/arrays.xml
+++ b/packages/SettingsLib/res/values-nl/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Alleen apparaatscherm (standaard)"</item>
-    <item msgid="9161645858025071955">"Extern scherm"</item>
-    <item msgid="114384731934682483">"Op focus gebaseerd"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Alleen paneel tonen op apparaatscherm"</item>
-    <item msgid="7795034287069726554">"Apparaat tonen op één extern scherm"</item>
-    <item msgid="5280431949814340475">"Apparaat tonen op laatste gefocuste scherm"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-or/arrays.xml b/packages/SettingsLib/res/values-or/arrays.xml
index f9beb8a..9782303 100644
--- a/packages/SettingsLib/res/values-or/arrays.xml
+++ b/packages/SettingsLib/res/values-or/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"କେବଳ ଡିଭାଇସ ଡିସପ୍ଲେ (ଡିଫଲ୍ଟ)"</item>
-    <item msgid="9161645858025071955">"ଏକ୍ସଟର୍ନଲ ଡିସପ୍ଲେ"</item>
-    <item msgid="114384731934682483">"ଫୋକସ-ଆଧାରିତ"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"କେବଳ ଡିଭାଇସରେ ଡିସପ୍ଲେ ସେଡ ଦେଖାନ୍ତୁ"</item>
-    <item msgid="7795034287069726554">"ସିଙ୍ଗଲ ଏକ୍ସଟର୍ନଲ ଡିସପ୍ଲେରେ ଡିଭାଇସ ଦେଖାନ୍ତୁ"</item>
-    <item msgid="5280431949814340475">"ଫୋକସ କରାଯାଇଥିବା ଗତ ଡିସପ୍ଲେରେ ଡିଭାଇସ ଦେଖାନ୍ତୁ"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml
index 69d57a6..bcde4e9 100644
--- a/packages/SettingsLib/res/values-or/strings.xml
+++ b/packages/SettingsLib/res/values-or/strings.xml
@@ -129,7 +129,7 @@
     <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">"SIM ଆକ୍ସେସ"</string>
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"ଫାଷ୍ଟ ଚାର୍ଜିଂ"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"ଆଡ୍‌ମିନ୍‌ ଦ୍ୱାରା ନିୟନ୍ତ୍ରିତ"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"ପ୍ରତିବନ୍ଧିତ ସେଟିଂ ଦ୍ୱାରା ନିୟନ୍ତ୍ରଣ କରାଯାଇଛି"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"କଲ କରିବାବେଳେ ଉପଲବ୍ଧ ନଥାଏ"</string>
     <string name="disabled" msgid="8017887509554714950">"ଅକ୍ଷମ ହୋଇଛି"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"ଅନୁମତି ଦିଆଯାଇଛି"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"ଅନୁମତି ନାହିଁ"</string>
diff --git a/packages/SettingsLib/res/values-pa/arrays.xml b/packages/SettingsLib/res/values-pa/arrays.xml
index 1e7f055..afb85ca 100644
--- a/packages/SettingsLib/res/values-pa/arrays.xml
+++ b/packages/SettingsLib/res/values-pa/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"ਸਿਰਫ਼ ਡੀਵਾਈਸ ਦੀ ਡਿਸਪਲੇ (ਪੂਰਵ-ਨਿਰਧਾਰਿਤ)"</item>
-    <item msgid="9161645858025071955">"ਬਾਹਰੀ ਡਿਸਪਲੇ"</item>
-    <item msgid="114384731934682483">"ਫੋਕਸ-ਆਧਾਰਿਤ"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"ਸਿਰਫ਼ ਡੀਵਾਈਸ ਦੀ ਡਿਸਪਲੇ \'ਤੇ ਸ਼ੇਡ ਦਿਖਾਓ"</item>
-    <item msgid="7795034287069726554">"ਇਕਹਿਰੀ ਬਾਹਰੀ ਡਿਸਪਲੇ \'ਤੇ ਡੀਵਾਈਸ ਦਿਖਾਓ"</item>
-    <item msgid="5280431949814340475">"ਫੋਕਸ ਕੀਤੀ ਗਈ ਪਿਛਲੀ ਡਿਸਪਲੇ \'ਤੇ ਡੀਵਾਈਸ ਦਿਖਾਓ"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index e12c2c0..821c84e 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -128,7 +128,7 @@
     <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">"ਲਿਖਤ ਸੁਨੇਹੇ"</string>
diff --git a/packages/SettingsLib/res/values-pl/arrays.xml b/packages/SettingsLib/res/values-pl/arrays.xml
index a9892b3..59791c0 100644
--- a/packages/SettingsLib/res/values-pl/arrays.xml
+++ b/packages/SettingsLib/res/values-pl/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Tylko wyświetlanie na urządzeniu (domyślnie)"</item>
-    <item msgid="9161645858025071955">"Wyświetlacz zewnętrzny"</item>
-    <item msgid="114384731934682483">"Na podstawie zaznaczenia"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Pokaż cień tylko na wyświetlaczu urządzenia"</item>
-    <item msgid="7795034287069726554">"Pokaż urządzenie na pojedynczym wyświetlaczu zewnętrznym"</item>
-    <item msgid="5280431949814340475">"Pokaż urządzenie na ostatnim aktywnym wyświetlaczu"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index 9fc2765..9f6eb4c 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Szybkie ładowanie"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Kontrolowane przez administratora"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Obowiązują ustawienia z ograniczonym dostępem"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Niedostępne w trakcie połączeń"</string>
     <string name="disabled" msgid="8017887509554714950">"Wyłączona"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Dozwolone"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Niedozwolone"</string>
diff --git a/packages/SettingsLib/res/values-pt-rBR/arrays.xml b/packages/SettingsLib/res/values-pt-rBR/arrays.xml
index 35aa3b0..2e61272 100644
--- a/packages/SettingsLib/res/values-pt-rBR/arrays.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/arrays.xml
@@ -291,16 +291,19 @@
   <string-array name="shade_display_awareness_entries">
     <item msgid="816770658383209617">"Somente a tela do dispositivo (padrão)"</item>
     <item msgid="9161645858025071955">"Tela externa"</item>
-    <item msgid="114384731934682483">"Com base no foco"</item>
+    <item msgid="23651860565814477">"Toque mais recente na barra de status"</item>
+    <item msgid="7521112827893653392">"Com base no foco"</item>
   </string-array>
   <string-array name="shade_display_awareness_summaries">
     <item msgid="2964753205732912921">"Mostrar sombra apenas na tela do dispositivo"</item>
-    <item msgid="7795034287069726554">"Mostrar o dispositivo em uma única tela externa"</item>
-    <item msgid="5280431949814340475">"Mostrar o dispositivo na última tela focada"</item>
+    <item msgid="1955398604822147783">"Mostrar sombra em uma única tela externa"</item>
+    <item msgid="391477482416751568">"Mostrar sombra na tela que teve a última interação na barra de status"</item>
+    <item msgid="1746820128097981528">"Mostrar sombra na última tela focada"</item>
   </string-array>
   <string-array name="shade_display_awareness_values">
     <item msgid="3055776101992426514">"default_display"</item>
     <item msgid="774789415968826925">"any_external_display"</item>
     <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
+    <item msgid="4313165186636015195">"focused_display"</item>
   </string-array>
 </resources>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index 1e45965..72f25be 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -123,13 +123,13 @@
     <string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Ativo (apenas mídia), apenas esquerdo"</string>
     <string name="bluetooth_hearing_aid_media_only_right_active" msgid="3854140683042617230">"Ativo (apenas mídia), somente direito"</string>
     <string name="bluetooth_hearing_aid_media_only_left_and_right_active" msgid="1299913413062528417">"Ativo (apenas mídia), esquerdo e direito"</string>
-    <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Áudio da mídia"</string>
+    <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Áudio de 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>
     <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">"Permitir acesso a contatos e ao histórico de ligações"</string>
-    <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"As informações serão usadas para fazer o anúncio de ligações e mais"</string>
+    <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"As informações serão usadas para avisar sobre ligações e mais"</string>
     <string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Compartilhamento de conexão à Internet"</string>
     <string name="bluetooth_profile_map" msgid="8907204701162107271">"Mensagens de texto"</string>
     <string name="bluetooth_profile_sap" msgid="8304170950447934386">"Acesso ao chip"</string>
@@ -515,7 +515,7 @@
     <string name="battery_info_status_charging_wireless" msgid="8924722966861282197">"Carregando sem fio"</string>
     <string name="battery_info_status_charging_dock" msgid="8573274094093364791">"Carregando"</string>
     <string name="battery_info_status_discharging" msgid="6962689305413556485">"Não está carregando"</string>
-    <string name="battery_info_status_not_charging" msgid="1103084691314264664">"Conectado, mas não está carregando"</string>
+    <string name="battery_info_status_not_charging" msgid="1103084691314264664">"Dispositivo conectado, mas não está carregando"</string>
     <string name="battery_info_status_full" msgid="1339002294876531312">"Carregada"</string>
     <string name="battery_info_status_full_charged" msgid="3536054261505567948">"Carga completa"</string>
     <string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"Carregamento suspenso"</string>
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Carregamento rápido"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlada pelo admin"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Controlada pelas configurações restritas"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Indisponível durante ligações"</string>
     <string name="disabled" msgid="8017887509554714950">"Desativado"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Permitido"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Não permitido"</string>
diff --git a/packages/SettingsLib/res/values-pt-rPT/arrays.xml b/packages/SettingsLib/res/values-pt-rPT/arrays.xml
index 2829f20..64fad64 100644
--- a/packages/SettingsLib/res/values-pt-rPT/arrays.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/arrays.xml
@@ -291,16 +291,19 @@
   <string-array name="shade_display_awareness_entries">
     <item msgid="816770658383209617">"Apenas no ecrã do dispositivo (predefinição)"</item>
     <item msgid="9161645858025071955">"Ecrã externo"</item>
-    <item msgid="114384731934682483">"Com base no foco"</item>
+    <item msgid="23651860565814477">"Toque mais recente na barra de estado"</item>
+    <item msgid="7521112827893653392">"Com base no foco"</item>
   </string-array>
   <string-array name="shade_display_awareness_summaries">
     <item msgid="2964753205732912921">"Mostrar a sombra apenas no ecrã do dispositivo"</item>
-    <item msgid="7795034287069726554">"Mostrar o dispositivo num único ecrã externo"</item>
-    <item msgid="5280431949814340475">"Apresente o dispositivo no último ecrã focado"</item>
+    <item msgid="1955398604822147783">"Mostrar a sombra num único ecrã externo"</item>
+    <item msgid="391477482416751568">"Mostrar a sombra no ecrã em que ocorreu a última interação com a barra de estado"</item>
+    <item msgid="1746820128097981528">"Mostrar a sombra no último ecrã focado"</item>
   </string-array>
   <string-array name="shade_display_awareness_values">
     <item msgid="3055776101992426514">"default_display"</item>
     <item msgid="774789415968826925">"any_external_display"</item>
     <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
+    <item msgid="4313165186636015195">"focused_display"</item>
   </string-array>
 </resources>
diff --git a/packages/SettingsLib/res/values-pt/arrays.xml b/packages/SettingsLib/res/values-pt/arrays.xml
index 35aa3b0..2e61272 100644
--- a/packages/SettingsLib/res/values-pt/arrays.xml
+++ b/packages/SettingsLib/res/values-pt/arrays.xml
@@ -291,16 +291,19 @@
   <string-array name="shade_display_awareness_entries">
     <item msgid="816770658383209617">"Somente a tela do dispositivo (padrão)"</item>
     <item msgid="9161645858025071955">"Tela externa"</item>
-    <item msgid="114384731934682483">"Com base no foco"</item>
+    <item msgid="23651860565814477">"Toque mais recente na barra de status"</item>
+    <item msgid="7521112827893653392">"Com base no foco"</item>
   </string-array>
   <string-array name="shade_display_awareness_summaries">
     <item msgid="2964753205732912921">"Mostrar sombra apenas na tela do dispositivo"</item>
-    <item msgid="7795034287069726554">"Mostrar o dispositivo em uma única tela externa"</item>
-    <item msgid="5280431949814340475">"Mostrar o dispositivo na última tela focada"</item>
+    <item msgid="1955398604822147783">"Mostrar sombra em uma única tela externa"</item>
+    <item msgid="391477482416751568">"Mostrar sombra na tela que teve a última interação na barra de status"</item>
+    <item msgid="1746820128097981528">"Mostrar sombra na última tela focada"</item>
   </string-array>
   <string-array name="shade_display_awareness_values">
     <item msgid="3055776101992426514">"default_display"</item>
     <item msgid="774789415968826925">"any_external_display"</item>
     <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
+    <item msgid="4313165186636015195">"focused_display"</item>
   </string-array>
 </resources>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index 1e45965..72f25be 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -123,13 +123,13 @@
     <string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Ativo (apenas mídia), apenas esquerdo"</string>
     <string name="bluetooth_hearing_aid_media_only_right_active" msgid="3854140683042617230">"Ativo (apenas mídia), somente direito"</string>
     <string name="bluetooth_hearing_aid_media_only_left_and_right_active" msgid="1299913413062528417">"Ativo (apenas mídia), esquerdo e direito"</string>
-    <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Áudio da mídia"</string>
+    <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Áudio de 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>
     <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">"Permitir acesso a contatos e ao histórico de ligações"</string>
-    <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"As informações serão usadas para fazer o anúncio de ligações e mais"</string>
+    <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"As informações serão usadas para avisar sobre ligações e mais"</string>
     <string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Compartilhamento de conexão à Internet"</string>
     <string name="bluetooth_profile_map" msgid="8907204701162107271">"Mensagens de texto"</string>
     <string name="bluetooth_profile_sap" msgid="8304170950447934386">"Acesso ao chip"</string>
@@ -515,7 +515,7 @@
     <string name="battery_info_status_charging_wireless" msgid="8924722966861282197">"Carregando sem fio"</string>
     <string name="battery_info_status_charging_dock" msgid="8573274094093364791">"Carregando"</string>
     <string name="battery_info_status_discharging" msgid="6962689305413556485">"Não está carregando"</string>
-    <string name="battery_info_status_not_charging" msgid="1103084691314264664">"Conectado, mas não está carregando"</string>
+    <string name="battery_info_status_not_charging" msgid="1103084691314264664">"Dispositivo conectado, mas não está carregando"</string>
     <string name="battery_info_status_full" msgid="1339002294876531312">"Carregada"</string>
     <string name="battery_info_status_full_charged" msgid="3536054261505567948">"Carga completa"</string>
     <string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"Carregamento suspenso"</string>
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Carregamento rápido"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlada pelo admin"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Controlada pelas configurações restritas"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Indisponível durante ligações"</string>
     <string name="disabled" msgid="8017887509554714950">"Desativado"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Permitido"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Não permitido"</string>
diff --git a/packages/SettingsLib/res/values-ro/arrays.xml b/packages/SettingsLib/res/values-ro/arrays.xml
index dba734c..8bfeb70 100644
--- a/packages/SettingsLib/res/values-ro/arrays.xml
+++ b/packages/SettingsLib/res/values-ro/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Numai pe ecranul dispozitivului (prestabilit)"</item>
-    <item msgid="9161645858025071955">"Ecran extern"</item>
-    <item msgid="114384731934682483">"În funcție de focalizare"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Afișează umbra doar pe ecranul dispozitivului"</item>
-    <item msgid="7795034287069726554">"Afișează dispozitivul pe un singur ecran extern"</item>
-    <item msgid="5280431949814340475">"Afișează dispozitivul pe ultimul ecran focalizat"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index af09734..26fdce8 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Încărcare rapidă"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlată de administrator"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Controlată de setarea restricționată"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Indisponibil în timpul apelurilor"</string>
     <string name="disabled" msgid="8017887509554714950">"Dezactivată"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Permise"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Nepermise"</string>
diff --git a/packages/SettingsLib/res/values-ru/arrays.xml b/packages/SettingsLib/res/values-ru/arrays.xml
index f0782eb..52b2549 100644
--- a/packages/SettingsLib/res/values-ru/arrays.xml
+++ b/packages/SettingsLib/res/values-ru/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Только экран устройства (по умолчанию)"</item>
-    <item msgid="9161645858025071955">"Внешний дисплей"</item>
-    <item msgid="114384731934682483">"Активный дисплей"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Показывать тень только на экране устройства"</item>
-    <item msgid="7795034287069726554">"Показывать устройство на одном внешнем дисплее"</item>
-    <item msgid="5280431949814340475">"Показывать устройство на последнем активном дисплее"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-si/arrays.xml b/packages/SettingsLib/res/values-si/arrays.xml
index 855bbc9..66f1ba7 100644
--- a/packages/SettingsLib/res/values-si/arrays.xml
+++ b/packages/SettingsLib/res/values-si/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"උපාංග සංදර්ශකය පමණි (පෙරනිමි)"</item>
-    <item msgid="9161645858025071955">"බාහිර සංදර්ශකය"</item>
-    <item msgid="114384731934682483">"නාභිගත කිරීම-පාදක"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"උපාංග සංදර්ශකයේ පමණක් සෙවන පෙන්වන්න"</item>
-    <item msgid="7795034287069726554">"උපාංගය තනි බාහිර සංදර්ශකයක පෙන්වන්න"</item>
-    <item msgid="5280431949814340475">"අවසන් වරට නාභිගත කළ සංදර්ශකයේ උපාංගය පෙන්වන්න"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index 1b02d28..94e1ed4 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"වේගවත් ආරෝපණය"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"පරිපාලක විසින් පාලනය කරන ලදී"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"සීමා කළ සැකසීම මගින් පාලනය වේ"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"ඇමතුම් අතරතුර නොපවතී"</string>
     <string name="disabled" msgid="8017887509554714950">"අබල කර ඇත"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"ඉඩ දුන්"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"ඉඩ නොදෙන"</string>
diff --git a/packages/SettingsLib/res/values-sk/arrays.xml b/packages/SettingsLib/res/values-sk/arrays.xml
index 3473e28..f8363cd 100644
--- a/packages/SettingsLib/res/values-sk/arrays.xml
+++ b/packages/SettingsLib/res/values-sk/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Iba obrazovka zariadenia (predvolené)"</item>
-    <item msgid="9161645858025071955">"Externá obrazovka"</item>
-    <item msgid="114384731934682483">"Na základe označenia"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Zobraziť panel iba na obrazovke zariadenia"</item>
-    <item msgid="7795034287069726554">"Zobraziť zariadenie na jednej externej obrazovke"</item>
-    <item msgid="5280431949814340475">"Zobraziť zariadenie na poslednej označenej obrazovke"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-sl/arrays.xml b/packages/SettingsLib/res/values-sl/arrays.xml
index c3bf79c..2a128ef 100644
--- a/packages/SettingsLib/res/values-sl/arrays.xml
+++ b/packages/SettingsLib/res/values-sl/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Prikaz samo v napravi (privzeto)"</item>
-    <item msgid="9161645858025071955">"Zunanji zaslon"</item>
-    <item msgid="114384731934682483">"Na podlagi fokusa"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Prikaz podokna samo na zaslonu naprave"</item>
-    <item msgid="7795034287069726554">"Prikaz naprave na enem zunanjem zaslonu"</item>
-    <item msgid="5280431949814340475">"Prikaz naprave na zadnjem zaslonu s fokusom"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-sq/arrays.xml b/packages/SettingsLib/res/values-sq/arrays.xml
index 7136bf75..3b0994a 100644
--- a/packages/SettingsLib/res/values-sq/arrays.xml
+++ b/packages/SettingsLib/res/values-sq/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Vetëm ekrani i pajisjes (parazgjedhja)"</item>
-    <item msgid="9161645858025071955">"Ekrani i jashtëm"</item>
-    <item msgid="114384731934682483">"Bazuar te fokusi"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Shfaq hijen vetëm në ekranin e pajisjes"</item>
-    <item msgid="7795034287069726554">"Shfaq pajisjen në një ekran të vetëm të jashtëm"</item>
-    <item msgid="5280431949814340475">"Shfaq pajisjen në ekranin e fundit të fokusuar"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index e98046e..2d2c02b 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Karikim i shpejtë"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Kontrolluar nga administratori"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Kontrollohet nga \"Cilësimet e kufizuara\""</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Nuk ofrohet gjatë telefonatave"</string>
     <string name="disabled" msgid="8017887509554714950">"Çaktivizuar"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Lejohet"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Nuk lejohet"</string>
diff --git a/packages/SettingsLib/res/values-sr/arrays.xml b/packages/SettingsLib/res/values-sr/arrays.xml
index 84d0a7e..fd23a64 100644
--- a/packages/SettingsLib/res/values-sr/arrays.xml
+++ b/packages/SettingsLib/res/values-sr/arrays.xml
@@ -291,16 +291,19 @@
   <string-array name="shade_display_awareness_entries">
     <item msgid="816770658383209617">"Приказ само на уређају (подразумевано)"</item>
     <item msgid="9161645858025071955">"Спољни екран"</item>
-    <item msgid="114384731934682483">"Засновано на фокусу"</item>
+    <item msgid="23651860565814477">"Додир на најновијој статусној траци"</item>
+    <item msgid="7521112827893653392">"Засновано на фокусу"</item>
   </string-array>
   <string-array name="shade_display_awareness_summaries">
     <item msgid="2964753205732912921">"Прикажи сенку само на екрану уређаја"</item>
-    <item msgid="7795034287069726554">"Прикажи уређај на једном спољном екрану"</item>
-    <item msgid="5280431949814340475">"Прикажи уређај на последњем екрану у фокусу"</item>
+    <item msgid="1955398604822147783">"Прикажи сенку на једном спољном екрану"</item>
+    <item msgid="391477482416751568">"Прикажи сенку на екрану са којим је статусна трака последњи пут била у интеракцији"</item>
+    <item msgid="1746820128097981528">"Прикажи сенку на последњем екрану у фокусу"</item>
   </string-array>
   <string-array name="shade_display_awareness_values">
     <item msgid="3055776101992426514">"default_display"</item>
     <item msgid="774789415968826925">"any_external_display"</item>
     <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
+    <item msgid="4313165186636015195">"focused_display"</item>
   </string-array>
 </resources>
diff --git a/packages/SettingsLib/res/values-sv/arrays.xml b/packages/SettingsLib/res/values-sv/arrays.xml
index b5ae7dd..8a77fdd 100644
--- a/packages/SettingsLib/res/values-sv/arrays.xml
+++ b/packages/SettingsLib/res/values-sv/arrays.xml
@@ -291,16 +291,19 @@
   <string-array name="shade_display_awareness_entries">
     <item msgid="816770658383209617">"Endast enhetens skärm (standard)"</item>
     <item msgid="9161645858025071955">"Extern skärm"</item>
-    <item msgid="114384731934682483">"Fokusbaserad"</item>
+    <item msgid="23651860565814477">"Senaste interaktion med statusfältet"</item>
+    <item msgid="7521112827893653392">"Fokusbaserad"</item>
   </string-array>
   <string-array name="shade_display_awareness_summaries">
     <item msgid="2964753205732912921">"Visa endast skugga på enhetens skärm"</item>
-    <item msgid="7795034287069726554">"Visa skugga på en enda extern skärm"</item>
-    <item msgid="5280431949814340475">"Visa enheten på skärmen som sist var i fokus"</item>
+    <item msgid="1955398604822147783">"Visa skugga på en enda extern skärm"</item>
+    <item msgid="391477482416751568">"Visa skugga på skärmen där statusfältet senast interagerades med"</item>
+    <item msgid="1746820128097981528">"Visa skugga på skärmen som sist var i fokus"</item>
   </string-array>
   <string-array name="shade_display_awareness_values">
     <item msgid="3055776101992426514">"default_display"</item>
     <item msgid="774789415968826925">"any_external_display"</item>
     <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
+    <item msgid="4313165186636015195">"focused_display"</item>
   </string-array>
 </resources>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index 4f8ea1e..e0897cb 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Snabbladdning"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Strys av administratören"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Styrs av spärrad inställning"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Ej tillgänglig under samtal"</string>
     <string name="disabled" msgid="8017887509554714950">"Inaktiverad"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Tillåts"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Tillåts inte"</string>
diff --git a/packages/SettingsLib/res/values-sw/arrays.xml b/packages/SettingsLib/res/values-sw/arrays.xml
index 145b56c..652c358 100644
--- a/packages/SettingsLib/res/values-sw/arrays.xml
+++ b/packages/SettingsLib/res/values-sw/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Kwenye skrini ya kifaa pekee (Chaguomsingi)"</item>
-    <item msgid="9161645858025071955">"Skrini ya nje"</item>
-    <item msgid="114384731934682483">"Inayoangaziwa"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Onyesha kiwango kwenye skrini ya kifaa pekee"</item>
-    <item msgid="7795034287069726554">"Onyesha kifaa kwenye skrini moja ya nje"</item>
-    <item msgid="5280431949814340475">"Onyesha kifaa kwenye skrini ya mwisho iliyoangaziwa"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index 2b175f5..f12597f 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Inachaji kwa kasi"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Imedhibitiwa na msimamizi"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Imedhibitiwa na Mpangilio wenye Mipaka"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Haipatikani wakati unaongea kwa simu"</string>
     <string name="disabled" msgid="8017887509554714950">"Imezimwa"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Imeruhusiwa"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Hairuhusiwi"</string>
diff --git a/packages/SettingsLib/res/values-ta/arrays.xml b/packages/SettingsLib/res/values-ta/arrays.xml
index 6881289..503cd8f 100644
--- a/packages/SettingsLib/res/values-ta/arrays.xml
+++ b/packages/SettingsLib/res/values-ta/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"சாதனக் காட்சி மட்டும் (இயல்பு)"</item>
-    <item msgid="9161645858025071955">"வெளிப்புறக் காட்சி"</item>
-    <item msgid="114384731934682483">"ஃபோகஸ் அடிப்படையிலானது"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"சாதனக் காட்சியில் மட்டும் ஷேடைக் காட்டும்"</item>
-    <item msgid="7795034287069726554">"ஒற்றை வெளிப்புறக் காட்சியில் சாதனத்தைக் காட்டும்"</item>
-    <item msgid="5280431949814340475">"கடைசியாக ஃபோகஸ் செய்யப்பட்ட காட்சியில் சாதனத்தைக் காட்டும்"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index dd5a5a4..1bd2c34 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"விரைவு சார்ஜிங்"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"நிர்வாகி கட்டுப்படுத்துகிறார்"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"வரையறுக்கப்பட்ட அமைப்பால் கட்டுப்படுத்தப்படுகிறது"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"அழைப்புகளின்போது பயன்படுத்த முடியாது"</string>
     <string name="disabled" msgid="8017887509554714950">"முடக்கப்பட்டது"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"அனுமதிக்கப்பட்டது"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"அனுமதிக்கப்படவில்லை"</string>
diff --git a/packages/SettingsLib/res/values-te/arrays.xml b/packages/SettingsLib/res/values-te/arrays.xml
index 8dea6ed..f72e4cd 100644
--- a/packages/SettingsLib/res/values-te/arrays.xml
+++ b/packages/SettingsLib/res/values-te/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"పరికర డిస్‌ప్లేలో మాత్రమే (ఆటోమేటిక్ సెట్టింగ్)"</item>
-    <item msgid="9161645858025071955">"ఎక్స్‌టర్నల్ డిస్‌ప్లే"</item>
-    <item msgid="114384731934682483">"ఫోకస్-ఆధారిత"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"షేడ్‌ను పరికర డిస్‌ప్లేలో మాత్రమే చూపండి"</item>
-    <item msgid="7795034287069726554">"పరికరాన్ని ఒక ఎక్స్‌టర్నల్ డిస్‌ప్లేలో మాత్రమే చూపండి"</item>
-    <item msgid="5280431949814340475">"పరికరాన్ని చివరగా యాక్టివ్‌గా ఉన్న స్క్రీన్‌లో చూపండి"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index 12e45c2..010344f 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"ఫాస్ట్ ఛార్జింగ్"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"నిర్వాహకుని ద్వారా నియంత్రించబడింది"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"పరిమితం చేసిన సెట్టింగ్ ద్వారా నియంత్రించబడుతుంది"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"కాల్స్ సమయంలో అందుబాటులో ఉండదు"</string>
     <string name="disabled" msgid="8017887509554714950">"డిజేబుల్ చేయబడింది"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"అనుమతించినవి"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"అనుమతించబడలేదు"</string>
diff --git a/packages/SettingsLib/res/values-th/arrays.xml b/packages/SettingsLib/res/values-th/arrays.xml
index 11cb2ec..adb274d 100644
--- a/packages/SettingsLib/res/values-th/arrays.xml
+++ b/packages/SettingsLib/res/values-th/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"จอแสดงผลของอุปกรณ์เท่านั้น (ค่าเริ่มต้น)"</item>
-    <item msgid="9161645858025071955">"จอแสดงผลภายนอก"</item>
-    <item msgid="114384731934682483">"Focus-based"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"แสดงเฉดสีในจอแสดงผลของอุปกรณ์เท่านั้น"</item>
-    <item msgid="7795034287069726554">"แสดงอุปกรณ์ในจอแสดงผลภายนอกเครื่องเดียว"</item>
-    <item msgid="5280431949814340475">"แสดงอุปกรณ์ในจอแสดงผลที่โฟกัสล่าสุด"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-tl/arrays.xml b/packages/SettingsLib/res/values-tl/arrays.xml
index eae269c..0153375a 100644
--- a/packages/SettingsLib/res/values-tl/arrays.xml
+++ b/packages/SettingsLib/res/values-tl/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Display ng device lang (Default)"</item>
-    <item msgid="9161645858025071955">"External na display"</item>
-    <item msgid="114384731934682483">"Focus-based"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Ipakita ang shade sa display ng device lang"</item>
-    <item msgid="7795034287069726554">"Ipakita ang device sa isang external na display"</item>
-    <item msgid="5280431949814340475">"Ipakita ang device sa huling na-focus na display"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-tr/arrays.xml b/packages/SettingsLib/res/values-tr/arrays.xml
index fdb9d21..6fbbb12 100644
--- a/packages/SettingsLib/res/values-tr/arrays.xml
+++ b/packages/SettingsLib/res/values-tr/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Yalnızca cihaz ekranı (Varsayılan)"</item>
-    <item msgid="9161645858025071955">"Harici ekran"</item>
-    <item msgid="114384731934682483">"Odaklanmaya dayalı"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Gölgeyi yalnızca cihaz ekranında göster"</item>
-    <item msgid="7795034287069726554">"Cihazı tek bir harici ekranda göster"</item>
-    <item msgid="5280431949814340475">"Cihazı son odaklanılan ekranda göster"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index 8dcc48f..c993223 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Hızlı şarj"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Yönetici tarafından denetleniyor"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Kısıtlanmış ayar tarafından kontrol ediliyor"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Telefon aramaları sırasında kullanılamaz"</string>
     <string name="disabled" msgid="8017887509554714950">"Devre dışı"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"İzin verildi"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"İzin verilmiyor"</string>
diff --git a/packages/SettingsLib/res/values-uk/arrays.xml b/packages/SettingsLib/res/values-uk/arrays.xml
index 2949471..a371c9c 100644
--- a/packages/SettingsLib/res/values-uk/arrays.xml
+++ b/packages/SettingsLib/res/values-uk/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Лише екран пристрою (за умовчанням)"</item>
-    <item msgid="9161645858025071955">"Зовнішній дисплей"</item>
-    <item msgid="114384731934682483">"На основі фокусування"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Показувати панель лише на екрані пристрою"</item>
-    <item msgid="7795034287069726554">"Показувати панель на одному зовнішньому дисплеї"</item>
-    <item msgid="5280431949814340475">"Показувати панель на останньому активному дисплеї"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index 259cf6c..fd1ade6 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Швидке заряджання"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Керується адміністратором"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Керується налаштуваннями з обмеженнями"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Недоступно під час викликів"</string>
     <string name="disabled" msgid="8017887509554714950">"Вимкнено"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Дозволено"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Заборонено"</string>
diff --git a/packages/SettingsLib/res/values-ur/arrays.xml b/packages/SettingsLib/res/values-ur/arrays.xml
index a9eadb8..5ce9fb4 100644
--- a/packages/SettingsLib/res/values-ur/arrays.xml
+++ b/packages/SettingsLib/res/values-ur/arrays.xml
@@ -291,16 +291,19 @@
   <string-array name="shade_display_awareness_entries">
     <item msgid="816770658383209617">"صرف آلے کا ڈسپلے (ڈیفالٹ)"</item>
     <item msgid="9161645858025071955">"بیرونی ڈسپلے"</item>
-    <item msgid="114384731934682483">"فوکس پر مبنی"</item>
+    <item msgid="23651860565814477">"تازہ ترین اسٹیٹس بار ٹچ"</item>
+    <item msgid="7521112827893653392">"فوکس پر مبنی"</item>
   </string-array>
   <string-array name="shade_display_awareness_summaries">
     <item msgid="2964753205732912921">"صرف آلے کے ڈسپلے پر شیڈ دکھائیں"</item>
-    <item msgid="7795034287069726554">"آلے کو واحد بیرونی ڈسپلے پر دکھائیں"</item>
-    <item msgid="5280431949814340475">"آلے کو آخری فوکس کردہ ڈسپلے پر دکھائیں"</item>
+    <item msgid="1955398604822147783">"واحد بیرونی ڈسپلے پر شیڈ دکھائیں"</item>
+    <item msgid="391477482416751568">"اس ڈسپلے پر شیڈ دکھائیں جس کے اسٹیٹس بار کے ساتھ آخری بار تعامل کیا گیا تھا"</item>
+    <item msgid="1746820128097981528">"شیڈ کو آخری فوکس کردہ ڈسپلے پر دکھائیں"</item>
   </string-array>
   <string-array name="shade_display_awareness_values">
     <item msgid="3055776101992426514">"default_display"</item>
     <item msgid="774789415968826925">"any_external_display"</item>
     <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
+    <item msgid="4313165186636015195">"focused_display"</item>
   </string-array>
 </resources>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index 425a0ed..13ffeb1 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"فاسٹ چارجنگ"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"کنٹرول کردہ بذریعہ منتظم"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"محدود کردہ ترتیب کے زیر انتظام ہے"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"کالز کے دوران غیر دستیاب"</string>
     <string name="disabled" msgid="8017887509554714950">"غیر فعال"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"اجازت ہے"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"اجازت نہیں ہے"</string>
diff --git a/packages/SettingsLib/res/values-uz/arrays.xml b/packages/SettingsLib/res/values-uz/arrays.xml
index f3cae41..cf1a096 100644
--- a/packages/SettingsLib/res/values-uz/arrays.xml
+++ b/packages/SettingsLib/res/values-uz/arrays.xml
@@ -291,16 +291,19 @@
   <string-array name="shade_display_awareness_entries">
     <item msgid="816770658383209617">"Faqat qurilma displeyi (birlamchi)"</item>
     <item msgid="9161645858025071955">"Tashqi displey"</item>
-    <item msgid="114384731934682483">"Fokusga asoslangan"</item>
+    <item msgid="23651860565814477">"Holat qatori bilan oxirgi oʻzaro aloqa"</item>
+    <item msgid="7521112827893653392">"Fokusga asoslangan"</item>
   </string-array>
   <string-array name="shade_display_awareness_summaries">
     <item msgid="2964753205732912921">"Faqat qurilma displeyida soyani koʻrsatish"</item>
-    <item msgid="7795034287069726554">"Qurilmani alohida tashqi displeyda koʻrsatish"</item>
-    <item msgid="5280431949814340475">"Qurilmani oxirgi fokuslangan displeyda koʻrsatish"</item>
+    <item msgid="1955398604822147783">"Soyani alohida tashqi displeyda koʻrsatish"</item>
+    <item msgid="391477482416751568">"Oxirgi marta holat qatori qaysi soya bilan munosabatga kirishganini koʻrsatish"</item>
+    <item msgid="1746820128097981528">"Soyani oxirgi fokuslangan displeyda koʻrsatish"</item>
   </string-array>
   <string-array name="shade_display_awareness_values">
     <item msgid="3055776101992426514">"default_display"</item>
     <item msgid="774789415968826925">"any_external_display"</item>
     <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
+    <item msgid="4313165186636015195">"focused_display"</item>
   </string-array>
 </resources>
diff --git a/packages/SettingsLib/res/values-vi/arrays.xml b/packages/SettingsLib/res/values-vi/arrays.xml
index e0ebc9f..8e4cf53 100644
--- a/packages/SettingsLib/res/values-vi/arrays.xml
+++ b/packages/SettingsLib/res/values-vi/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Chỉ hiển thị trên thiết bị (Mặc định)"</item>
-    <item msgid="9161645858025071955">"Màn hình ngoài"</item>
-    <item msgid="114384731934682483">"Theo tiêu điểm"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Chỉ hiện ngăn thông báo trên màn hình thiết bị"</item>
-    <item msgid="7795034287069726554">"Hiện thiết bị trên một màn hình ngoài"</item>
-    <item msgid="5280431949814340475">"Hiện thiết bị trên màn hình được lấy tiêu điểm gần đây nhất"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index 59d4b4d..2763c01 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Đang sạc nhanh"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Do quản trị viên kiểm soát"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Do chế độ Cài đặt hạn chế kiểm soát"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Không dùng được khi có cuộc gọi"</string>
     <string name="disabled" msgid="8017887509554714950">"Đã tắt"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Được phép"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Không được phép"</string>
diff --git a/packages/SettingsLib/res/values-zh-rCN/arrays.xml b/packages/SettingsLib/res/values-zh-rCN/arrays.xml
index c2147c7..5c82865 100644
--- a/packages/SettingsLib/res/values-zh-rCN/arrays.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"仅设备显示屏(默认)"</item>
-    <item msgid="9161645858025071955">"外接显示屏"</item>
-    <item msgid="114384731934682483">"基于焦点"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"仅在设备显示屏上显示通知栏"</item>
-    <item msgid="7795034287069726554">"在单个外接显示屏上显示设备"</item>
-    <item msgid="5280431949814340475">"在最近一次获得焦点的显示屏上显示设备"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index 08e931b..934c525 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"正在快速充电"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"由管理员控制"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"由受限设置控制"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"通话期间无法使用"</string>
     <string name="disabled" msgid="8017887509554714950">"已停用"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"允许"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"不允许"</string>
diff --git a/packages/SettingsLib/res/values-zh-rHK/arrays.xml b/packages/SettingsLib/res/values-zh-rHK/arrays.xml
index 37d7b29..2e06059 100644
--- a/packages/SettingsLib/res/values-zh-rHK/arrays.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"只限裝置顯示屏 (預設)"</item>
-    <item msgid="9161645858025071955">"外部顯示屏"</item>
-    <item msgid="114384731934682483">"突顯"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"只在裝置顯示屏上顯示陰影"</item>
-    <item msgid="7795034287069726554">"在單獨外部顯示屏上顯示裝置"</item>
-    <item msgid="5280431949814340475">"在上一次突顯的顯示屏上顯示裝置"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index 8cc65c8..037f531 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -506,7 +506,7 @@
     <string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> ‑ 充電中"</string>
     <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATUS">%2$s</xliff:g> - 在 <xliff:g id="TIME">%3$s</xliff:g>前充滿電"</string>
     <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> • 在 <xliff:g id="TIME">%2$s</xliff:g>前充滿電"</string>
-    <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"在 <xliff:g id="TIME">%1$s</xliff:g>前充滿電"</string>
+    <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"在<xliff:g id="TIME">%1$s</xliff:g> 前充滿電"</string>
     <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"<xliff:g id="TIME">%1$s</xliff:g> 前充滿電"</string>
     <string name="battery_info_status_unknown" msgid="268625384868401114">"未知"</string>
     <string name="battery_info_status_charging" msgid="4279958015430387405">"充電中"</string>
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"快速充電"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"已由管理員停用"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"由「受限設定」控制"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"通話時無法使用"</string>
     <string name="disabled" msgid="8017887509554714950">"已停用"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"允許"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"不允許"</string>
diff --git a/packages/SettingsLib/res/values-zh-rTW/arrays.xml b/packages/SettingsLib/res/values-zh-rTW/arrays.xml
index c4d820c..5b48ad4 100644
--- a/packages/SettingsLib/res/values-zh-rTW/arrays.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"僅裝置螢幕 (預設)"</item>
-    <item msgid="9161645858025071955">"外接螢幕"</item>
-    <item msgid="114384731934682483">"使用中的螢幕"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"只在裝置螢幕顯示通知欄"</item>
-    <item msgid="7795034287069726554">"在單一外接螢幕顯示通知欄"</item>
-    <item msgid="5280431949814340475">"在最新使用的螢幕顯示通知欄"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"預設螢幕"</item>
-    <item msgid="774789415968826925">"任何外接螢幕"</item>
-    <item msgid="7880769915418638436">"最新觸控狀態列"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index d639e71..0ef65e6 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"快速充電"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"已由管理員停用"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"由受限制的設定控管"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"通話時無法使用"</string>
     <string name="disabled" msgid="8017887509554714950">"已停用"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"允許"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"不允許"</string>
diff --git a/packages/SettingsLib/res/values-zu/arrays.xml b/packages/SettingsLib/res/values-zu/arrays.xml
index 27ca40c..1a61f8b 100644
--- a/packages/SettingsLib/res/values-zu/arrays.xml
+++ b/packages/SettingsLib/res/values-zu/arrays.xml
@@ -288,19 +288,10 @@
     <item msgid="3753634915787796632">"2"</item>
     <item msgid="4779928470672877922">"3"</item>
   </string-array>
-  <string-array name="shade_display_awareness_entries">
-    <item msgid="816770658383209617">"Ukuboniswa kwedivayisi kuphela (Okuzenzakalelayo)"</item>
-    <item msgid="9161645858025071955">"Ukubonisa Kwangaphandle"</item>
-    <item msgid="114384731934682483">"Kusekelwe ekugxileni"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_summaries">
-    <item msgid="2964753205732912921">"Bonisa umthunzi esibonisini sedivayisi kuphela"</item>
-    <item msgid="7795034287069726554">"Bonisa idivayisi esibonisini sangaphandle esisodwa"</item>
-    <item msgid="5280431949814340475">"Bonisa idivayisi esibonisini sokugcina esigxilile"</item>
-  </string-array>
-  <string-array name="shade_display_awareness_values">
-    <item msgid="3055776101992426514">"default_display"</item>
-    <item msgid="774789415968826925">"any_external_display"</item>
-    <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
-  </string-array>
+    <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+    <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+    <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+    <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+    <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+    <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
 </resources>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index 4fd2c8d..de62628 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -523,8 +523,7 @@
     <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Ishaja ngokushesha"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Kulawulwa umqondisi"</string>
     <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Kulawulwe Isethingi Elikhawulelwe"</string>
-    <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
-    <skip />
+    <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Akutholakali ngesikhathi samakholi"</string>
     <string name="disabled" msgid="8017887509554714950">"Akusebenzi"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Kuvumelekile"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Akuvumelekile"</string>
diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml
index a3e42f1..4b0400f 100644
--- a/packages/SettingsLib/res/values/strings.xml
+++ b/packages/SettingsLib/res/values/strings.xml
@@ -236,6 +236,14 @@
     <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>, 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 status and battery level for temporary bond device. [CHAR LIMIT=NONE] -->
+    <string name="bluetooth_guest_battery_level">Guest device. <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 status and battery level for temporary bond untethered headset. [CHAR LIMIT=NONE] -->
+    <string name="bluetooth_guest_battery_level_untethered">Guest device. L: <xliff:g id="battery_level_as_percentage" example="25%">%1$s</xliff:g>, R: <xliff:g id="battery_level_as_percentage" example="25%">%2$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 temporary bond device. [CHAR LIMIT=NONE] -->
+    <string name="bluetooth_guest_media_only_battery_level">Guest device (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 temporary bond untethered headset. [CHAR LIMIT=NONE] -->
+    <string name="bluetooth_guest_media_only_battery_level_untethered">Guest device (media only). L: <xliff:g id="battery_level_as_percentage" example="25%">%1$s</xliff:g>, 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] -->
@@ -246,10 +254,22 @@
     <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> battery.</string>
     <!-- Connected devices settings. Message when Bluetooth is connected but not in use, showing no battery information, supports audio sharing. [CHAR LIMIT=NONE] -->
     <string name="bluetooth_no_battery_level_lea_support">Connected (supports audio sharing)</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_guest_battery_level_lea_support">Guest device (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_guest_battery_level_untethered_lea_support">Guest device (supports audio sharing). L: <xliff:g id="battery_level_as_percentage" example="25%">%1$s</xliff:g>, 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 no battery information, supports audio sharing. [CHAR LIMIT=NONE] -->
+    <string name="bluetooth_guest_no_battery_level_lea_support">Guest device (supports audio sharing)</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 when Bluetooth is connected but not in use with no battery information, showing remote device status for temporary bond device. [CHAR LIMIT=NONE] -->
+    <string name="bluetooth_guest_no_battery_level">Guest device</string>
+    <!-- Connected devices settings. Message when Bluetooth is connected and active for media only but no battery information, showing remote device status for temporary bond device. [CHAR LIMIT=NONE] -->
+    <string name="bluetooth_guest_media_only_no_battery_level">Guest device (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 devices settings. Message shown when temporary bond bluetooth device is disconnected but is a known, previously connected device, supports audio sharing [CHAR LIMIT=NONE] -->
+    <string name="bluetooth_guest_saved_device_lea_support">Guest device. 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>
@@ -1103,6 +1123,13 @@
     <!-- Developer settings: text for the WebView provider selection toast shown if an invalid provider was chosen (i.e. the setting list was stale). [CHAR LIMIT=NONE] -->
     <string name="select_webview_provider_toast_text">This choice is no longer valid. Try again.</string>
 
+    <!-- [CHAR LIMIT=50] Label for button to launch current WebView provider's DevTools (developer tools) UI -->
+    <string name="webview_launch_devtools_title">WebView DevTools</string>
+    <!-- [CHAR LIMIT=50] Error toast shown to user when no (current) WebView package is found (when trying to launch DevTools) -->
+    <string name="webview_launch_devtools_no_package">WebView package not found.</string>
+    <!-- [CHAR LIMIT=50] Error toast shown to user when DevTools (developer tools) activity could not be launched (despite there being a WebView package) -->
+    <string name="webview_launch_devtools_no_activity">Could not launch DevTools.</string>
+
     <!-- Name of feature to change color setting for the display [CHAR LIMIT=60] -->
     <string name="picture_color_mode">Picture color mode</string>
 
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
index 7374f80..97a345e 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
@@ -16,8 +16,7 @@
 
 package com.android.settingslib.bluetooth;
 
-import static com.android.settingslib.flags.Flags.enableSetPreferredTransportForLeAudioDevice;
-import static com.android.settingslib.flags.Flags.ignoreA2dpDisconnectionForAndroidAuto;
+import static com.android.settingslib.media.flags.Flags.enableTvMediaOutputDialog;
 
 import android.annotation.CallbackExecutor;
 import android.annotation.StringRes;
@@ -53,7 +52,7 @@
 import com.android.internal.util.ArrayUtils;
 import com.android.settingslib.R;
 import com.android.settingslib.Utils;
-import com.android.settingslib.media.flags.Flags;
+import com.android.settingslib.flags.Flags;
 import com.android.settingslib.utils.ThreadUtils;
 import com.android.settingslib.widget.AdaptiveOutlineDrawable;
 
@@ -264,7 +263,7 @@
                             mHandler.removeMessages(profile.getProfileId());
                             if (profile.getConnectionPolicy(mDevice) >
                                     BluetoothProfile.CONNECTION_POLICY_FORBIDDEN) {
-                                if (ignoreA2dpDisconnectionForAndroidAuto()
+                                if (Flags.ignoreA2dpDisconnectionForAndroidAuto()
                                         && profile instanceof A2dpProfile && isAndroidAuto()) {
                                     Log.w(TAG,
                                             "onProfileStateChanged(): Skip setting A2DP "
@@ -306,7 +305,7 @@
                         mLocalNapRoleConnected = true;
                     }
                 }
-                if (enableSetPreferredTransportForLeAudioDevice()
+                if (Flags.enableSetPreferredTransportForLeAudioDevice()
                         && profile instanceof HidProfile) {
                     updatePreferredTransport();
                 }
@@ -322,7 +321,7 @@
                 mLocalNapRoleConnected = false;
             }
 
-            if (enableSetPreferredTransportForLeAudioDevice()
+            if (Flags.enableSetPreferredTransportForLeAudioDevice()
                     && profile instanceof LeAudioProfile) {
                 updatePreferredTransport();
             }
@@ -1345,6 +1344,8 @@
         if (mBluetoothManager == null) {
             mBluetoothManager = LocalBluetoothManager.getInstance(mContext, null);
         }
+        boolean isTempBond = Flags.enableTemporaryBondDevicesUi()
+                && BluetoothUtils.isTemporaryBondDevice(getDevice());
         if (BluetoothUtils.hasConnectedBroadcastSource(this, mBluetoothManager)) {
             // Gets summary for the buds which are in the audio sharing.
             int groupId = BluetoothUtils.getGroupId(this);
@@ -1363,14 +1364,23 @@
                         shortSummary);
             } else {
                 // The buds are not primary buds
-                return getSummaryWithBatteryInfo(
-                        R.string.bluetooth_active_media_only_battery_level_untethered,
-                        R.string.bluetooth_active_media_only_battery_level,
-                        R.string.bluetooth_active_media_only_no_battery_level,
-                        leftBattery,
-                        rightBattery,
-                        batteryLevelPercentageString,
-                        shortSummary);
+                return isTempBond
+                        ? getSummaryWithBatteryInfo(
+                                R.string.bluetooth_guest_media_only_battery_level_untethered,
+                                R.string.bluetooth_guest_media_only_battery_level,
+                                R.string.bluetooth_guest_media_only_no_battery_level,
+                                leftBattery,
+                                rightBattery,
+                                batteryLevelPercentageString,
+                                shortSummary)
+                        : getSummaryWithBatteryInfo(
+                                R.string.bluetooth_active_media_only_battery_level_untethered,
+                                R.string.bluetooth_active_media_only_battery_level,
+                                R.string.bluetooth_active_media_only_no_battery_level,
+                                leftBattery,
+                                rightBattery,
+                                batteryLevelPercentageString,
+                                shortSummary);
             }
         } else {
             // Gets summary for the buds which are not in the audio sharing.
@@ -1381,16 +1391,28 @@
                                             && profile.isEnabled(getDevice()))) {
                 // The buds support le audio.
                 if (isConnected()) {
-                    return getSummaryWithBatteryInfo(
-                            R.string.bluetooth_battery_level_untethered_lea_support,
-                            R.string.bluetooth_battery_level_lea_support,
-                            R.string.bluetooth_no_battery_level_lea_support,
-                            leftBattery,
-                            rightBattery,
-                            batteryLevelPercentageString,
-                            shortSummary);
+                    return isTempBond
+                            ? getSummaryWithBatteryInfo(
+                                    R.string.bluetooth_guest_battery_level_untethered_lea_support,
+                                    R.string.bluetooth_guest_battery_level_lea_support,
+                                    R.string.bluetooth_guest_no_battery_level_lea_support,
+                                    leftBattery,
+                                    rightBattery,
+                                    batteryLevelPercentageString,
+                                    shortSummary)
+                            : getSummaryWithBatteryInfo(
+                                    R.string.bluetooth_battery_level_untethered_lea_support,
+                                    R.string.bluetooth_battery_level_lea_support,
+                                    R.string.bluetooth_no_battery_level_lea_support,
+                                    leftBattery,
+                                    rightBattery,
+                                    batteryLevelPercentageString,
+                                    shortSummary);
                 } else {
-                    return mContext.getString(R.string.bluetooth_saved_device_lea_support);
+                    return isTempBond
+                            ? mContext.getString(
+                                    R.string.bluetooth_guest_saved_device_lea_support)
+                            : mContext.getString(R.string.bluetooth_saved_device_lea_support);
                 }
             }
         }
@@ -1509,11 +1531,19 @@
             leftBattery = getLeftBatteryLevel();
             rightBattery = getRightBatteryLevel();
 
+            boolean isTempBond = Flags.enableTemporaryBondDevicesUi()
+                    && BluetoothUtils.isTemporaryBondDevice(getDevice());
             // Set default string with battery level in device connected situation.
             if (isTwsBatteryAvailable(leftBattery, rightBattery)) {
-                stringRes = R.string.bluetooth_battery_level_untethered;
+                stringRes =
+                        isTempBond
+                                ? R.string.bluetooth_guest_battery_level_untethered
+                                : R.string.bluetooth_battery_level_untethered;
             } else if (batteryLevelPercentageString != null && !shortSummary) {
-                stringRes = R.string.bluetooth_battery_level;
+                stringRes =
+                        isTempBond
+                                ? R.string.bluetooth_guest_battery_level
+                                : R.string.bluetooth_battery_level;
             }
 
             // Set active string in following device connected situation, also show battery
@@ -1529,11 +1559,20 @@
                         || (mIsActiveDeviceA2dp && !isOnCall)
                         || mIsActiveDeviceLeAudio) {
                     if (isTwsBatteryAvailable(leftBattery, rightBattery) && !shortSummary) {
-                        stringRes = R.string.bluetooth_active_battery_level_untethered;
+                        stringRes =
+                                isTempBond
+                                        ? R.string.bluetooth_guest_battery_level_untethered
+                                        : R.string.bluetooth_active_battery_level_untethered;
                     } else if (batteryLevelPercentageString != null && !shortSummary) {
-                        stringRes = R.string.bluetooth_active_battery_level;
+                        stringRes =
+                                isTempBond
+                                        ? R.string.bluetooth_guest_battery_level
+                                        : R.string.bluetooth_active_battery_level;
                     } else {
-                        stringRes = R.string.bluetooth_active_no_battery_level;
+                        stringRes =
+                                isTempBond
+                                        ? R.string.bluetooth_guest_no_battery_level
+                                        : R.string.bluetooth_active_no_battery_level;
                     }
                 }
 
@@ -1559,7 +1598,7 @@
                 || stringRes == R.string.bluetooth_active_battery_level_untethered_left
                 || stringRes == R.string.bluetooth_active_battery_level_untethered_right
                 || stringRes == R.string.bluetooth_battery_level_untethered;
-        if (isTvSummary && summaryIncludesBatteryLevel && Flags.enableTvMediaOutputDialog()) {
+        if (isTvSummary && summaryIncludesBatteryLevel && enableTvMediaOutputDialog()) {
             return getTvBatterySummary(
                     getMinBatteryLevelWithMemberDevices(),
                     leftBattery,
diff --git a/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java b/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java
index 13a0601..671dfa2 100644
--- a/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java
+++ b/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java
@@ -128,12 +128,20 @@
 
     @Override
     public int getIntrinsicWidth() {
-        return mIntrinsicSize;
+        if (newStatusBarIcons()) {
+            return super.getIntrinsicWidth();
+        } else {
+            return mIntrinsicSize;
+        }
     }
 
     @Override
     public int getIntrinsicHeight() {
-        return mIntrinsicSize;
+        if (newStatusBarIcons()) {
+            return super.getIntrinsicHeight();
+        } else {
+            return mIntrinsicSize;
+        }
     }
 
     private void updateAnimation() {
diff --git a/packages/SettingsLib/src/com/android/settingslib/notification/data/repository/ZenModeRepository.kt b/packages/SettingsLib/src/com/android/settingslib/notification/data/repository/ZenModeRepository.kt
index f446bb8..c4e7245 100644
--- a/packages/SettingsLib/src/com/android/settingslib/notification/data/repository/ZenModeRepository.kt
+++ b/packages/SettingsLib/src/com/android/settingslib/notification/data/repository/ZenModeRepository.kt
@@ -93,10 +93,9 @@
                     IntentFilter().apply {
                         addAction(NotificationManager.ACTION_INTERRUPTION_FILTER_CHANGED)
                         addAction(NotificationManager.ACTION_NOTIFICATION_POLICY_CHANGED)
-                        if (android.app.Flags.modesApi())
-                            addAction(
-                                NotificationManager.ACTION_CONSOLIDATED_NOTIFICATION_POLICY_CHANGED
-                            )
+                        addAction(
+                            NotificationManager.ACTION_CONSOLIDATED_NOTIFICATION_POLICY_CHANGED
+                        )
                     },
                     /* broadcastPermission = */ null,
                     /* scheduler = */ backgroundHandler,
@@ -109,16 +108,13 @@
     }
 
     override val consolidatedNotificationPolicy: StateFlow<NotificationManager.Policy?> by lazy {
-        if (android.app.Flags.modesApi())
-            flowFromBroadcast(NotificationManager.ACTION_CONSOLIDATED_NOTIFICATION_POLICY_CHANGED) {
-                // If available, get the value from extras to avoid a potential binder call.
-                it?.extras?.getParcelable(EXTRA_NOTIFICATION_POLICY)
-                    ?: notificationManager.consolidatedNotificationPolicy
-            }
-        else
-            flowFromBroadcast(NotificationManager.ACTION_NOTIFICATION_POLICY_CHANGED) {
-                notificationManager.consolidatedNotificationPolicy
-            }
+        flowFromBroadcast(NotificationManager.ACTION_CONSOLIDATED_NOTIFICATION_POLICY_CHANGED) {
+            // If available, get the value from extras to avoid a potential binder call.
+            it?.extras?.getParcelable(
+                EXTRA_NOTIFICATION_POLICY,
+                NotificationManager.Policy::class.java
+            ) ?: notificationManager.consolidatedNotificationPolicy
+        }
     }
 
     override val globalZenMode: StateFlow<Int?> by lazy {
diff --git a/packages/SettingsLib/src/com/android/settingslib/notification/modes/EnableDndDialogFactory.java b/packages/SettingsLib/src/com/android/settingslib/notification/modes/EnableDndDialogFactory.java
index f0e7fb8..52d62b6 100644
--- a/packages/SettingsLib/src/com/android/settingslib/notification/modes/EnableDndDialogFactory.java
+++ b/packages/SettingsLib/src/com/android/settingslib/notification/modes/EnableDndDialogFactory.java
@@ -19,7 +19,6 @@
 import android.app.ActivityManager;
 import android.app.AlarmManager;
 import android.app.AlertDialog;
-import android.app.Flags;
 import android.app.NotificationManager;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -42,8 +41,6 @@
 import android.widget.ScrollView;
 import android.widget.TextView;
 
-import androidx.annotation.Nullable;
-
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.policy.PhoneWindow;
 import com.android.settingslib.R;
@@ -80,7 +77,6 @@
     private static final int SECONDS_MS = 1000;
     private static final int MINUTES_MS = 60 * SECONDS_MS;
 
-    @Nullable
     private final EnableDndDialogMetricsLogger mMetricsLogger;
 
     @VisibleForTesting
@@ -152,16 +148,10 @@
                                     Slog.d(TAG, "Invalid manual condition: " + tag.condition);
                                 }
                                 // always triggers priority-only dnd with chosen condition
-                                if (Flags.modesApi()) {
-                                    mNotificationManager.setZenMode(
-                                            Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS,
-                                            getRealConditionId(tag.condition), TAG,
-                                            /* fromUser= */ true);
-                                } else {
-                                    mNotificationManager.setZenMode(
-                                            Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS,
-                                            getRealConditionId(tag.condition), TAG);
-                                }
+                                mNotificationManager.setZenMode(
+                                        Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS,
+                                        getRealConditionId(tag.condition), TAG,
+                                        /* fromUser= */ true);
                             }
                         });
 
diff --git a/packages/SettingsLib/src/com/android/settingslib/utils/CustomDialogHelper.java b/packages/SettingsLib/src/com/android/settingslib/utils/CustomDialogHelper.java
index 6e64c59..34e08af 100644
--- a/packages/SettingsLib/src/com/android/settingslib/utils/CustomDialogHelper.java
+++ b/packages/SettingsLib/src/com/android/settingslib/utils/CustomDialogHelper.java
@@ -34,6 +34,8 @@
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
+import androidx.annotation.NonNull;
+
 /**
  * This class is used to create custom dialog with icon, title, message and custom view that are
  * horizontally centered.
@@ -191,20 +193,52 @@
     }
 
     /**
+     * Sets title of the dialog by string.
+     */
+    @NonNull public CustomDialogHelper setTitle(@NonNull CharSequence title) {
+        mDialogTitle.setText(title);
+        return this;
+    }
+
+    /**
+     * Sets title padding of the dialog.
+     */
+    @NonNull public CustomDialogHelper setTitlePadding(int left, int top, int right, int bottom) {
+        mDialogTitle.setPadding(left, top, right, bottom);
+        return this;
+    }
+
+    /**
      * Sets message of the dialog.
      */
-    public CustomDialogHelper setMessage(@StringRes int resid) {
+   @NonNull public CustomDialogHelper setMessage(@StringRes int resid) {
         mDialogMessage.setText(resid);
         return this;
     }
 
     /**
+     * Sets message of the dialog by string.
+     */
+    @NonNull public CustomDialogHelper setMessage(@NonNull CharSequence message) {
+        mDialogMessage.setText(message);
+        return this;
+    }
+
+    /**
      * Sets message padding of the dialog.
      */
-    public CustomDialogHelper setMessagePadding(int dp) {
+    @NonNull public CustomDialogHelper setMessagePadding(int dp) {
         mDialogMessage.setPadding(dp, dp, dp, dp);
         return this;
     }
+    /**
+     * Sets message padding of the dialog.
+     */
+    @NonNull
+    public CustomDialogHelper setMessagePadding(int left, int top, int right, int bottom) {
+        mDialogMessage.setPadding(left, top, right, bottom);
+        return this;
+    }
 
     /**
      * Sets icon of the dialog.
@@ -215,6 +249,15 @@
     }
 
     /**
+     * Sets icon padding of the dialog.
+     */
+    @NonNull
+    public CustomDialogHelper setIconPadding(int left, int top, int right, int bottom) {
+        mDialogIcon.setPadding(left, top, right, bottom);
+        return this;
+    }
+
+    /**
      * Removes all views that were previously added to the custom layout part.
      */
     public CustomDialogHelper clearCustomLayout() {
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/display/DisplayDensityUtilsTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/display/DisplayDensityUtilsTest.java
new file mode 100644
index 0000000..bba278a
--- /dev/null
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/display/DisplayDensityUtilsTest.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.display;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.hardware.display.DisplayManager;
+import android.hardware.display.DisplayManagerGlobal;
+import android.os.RemoteException;
+import android.view.Display;
+import android.view.DisplayAdjustments;
+import android.view.DisplayInfo;
+import android.view.IWindowManager;
+import android.view.WindowManagerGlobal;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.settingslib.R;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class DisplayDensityUtilsTest {
+
+    private static final float MAX_SCALE = 1.33f;
+    private static final float MIN_SCALE = 0.85f;
+    private static final float MIN_INTERVAL = 0.09f;
+    @Mock
+    private Context mContext;
+    @Mock
+    private Resources mResources;
+    @Mock
+    private DisplayManager mDisplayManager;
+    @Mock
+    private DisplayManagerGlobal mDisplayManagerGlobal;
+    @Mock
+    private IWindowManager mIWindowManager;
+    private IWindowManager mWindowManagerToRestore;
+    private DisplayDensityUtils mDisplayDensityUtils;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        doReturn(mDisplayManager).when(mContext).getSystemService((Class<Object>) any());
+        mWindowManagerToRestore = WindowManagerGlobal.getWindowManagerService();
+        WindowManagerGlobal.setWindowManagerServiceForSystemProcess(mIWindowManager);
+        when(mContext.getResources()).thenReturn(mResources);
+        when(mResources.getFraction(R.fraction.display_density_max_scale, 1, 1)).thenReturn(
+                MAX_SCALE);
+        when(mResources.getFraction(R.fraction.display_density_min_scale, 1, 1)).thenReturn(
+                MIN_SCALE);
+        when(mResources.getFraction(R.fraction.display_density_min_scale_interval, 1,
+                1)).thenReturn(MIN_INTERVAL);
+        when(mResources.getString(anyInt())).thenReturn("summary");
+    }
+
+    @After
+    public void teardown() {
+        WindowManagerGlobal.setWindowManagerServiceForSystemProcess(mWindowManagerToRestore);
+    }
+
+    @Test
+    public void createDisplayDensityUtil_onlyDefaultDisplay() throws RemoteException {
+        var info = createDisplayInfoForDisplay(Display.DEFAULT_DISPLAY, Display.TYPE_INTERNAL, 2560,
+                1600, 320);
+        var display = new Display(mDisplayManagerGlobal, info.displayId, info,
+                (DisplayAdjustments) null);
+        doReturn(new Display[]{display}).when(mDisplayManager).getDisplays(any());
+        doReturn(display).when(mDisplayManager).getDisplay(info.displayId);
+
+        mDisplayDensityUtils = new DisplayDensityUtils(mContext);
+
+        assertThat(mDisplayDensityUtils.getValues()).isEqualTo(new int[]{272, 320, 354, 390, 424});
+    }
+
+    @Test
+    public void createDisplayDensityUtil_multipleInternalDisplays() throws RemoteException {
+        // Default display
+        var defaultDisplayInfo = createDisplayInfoForDisplay(Display.DEFAULT_DISPLAY,
+                Display.TYPE_INTERNAL, 2000, 2000, 390);
+        var defaultDisplay = new Display(mDisplayManagerGlobal, defaultDisplayInfo.displayId,
+                defaultDisplayInfo,
+                (DisplayAdjustments) null);
+        doReturn(defaultDisplay).when(mDisplayManager).getDisplay(defaultDisplayInfo.displayId);
+
+        // Create another internal display
+        var internalDisplayInfo = createDisplayInfoForDisplay(1, Display.TYPE_INTERNAL,
+                2000, 1000, 390);
+        var internalDisplay = new Display(mDisplayManagerGlobal, internalDisplayInfo.displayId,
+                internalDisplayInfo,
+                (DisplayAdjustments) null);
+        doReturn(internalDisplay).when(mDisplayManager).getDisplay(internalDisplayInfo.displayId);
+
+        doReturn(new Display[]{defaultDisplay, internalDisplay}).when(mDisplayManager).getDisplays(
+                anyString());
+
+        mDisplayDensityUtils = new DisplayDensityUtils(mContext);
+
+        assertThat(mDisplayDensityUtils.getValues()).isEqualTo(new int[]{330, 390, 426, 462, 500});
+    }
+
+    private DisplayInfo createDisplayInfoForDisplay(int displayId, int displayType,
+            int width, int height, int density) throws RemoteException {
+        var displayInfo = new DisplayInfo();
+        displayInfo.displayId = displayId;
+        displayInfo.type = displayType;
+        displayInfo.logicalWidth = width;
+        displayInfo.logicalHeight = height;
+        displayInfo.logicalDensityDpi = density;
+
+        doReturn(displayInfo).when(mDisplayManagerGlobal).getDisplayInfo(displayInfo.displayId);
+        doReturn(displayInfo.logicalDensityDpi).when(mIWindowManager).getInitialDisplayDensity(
+                displayInfo.displayId);
+        return displayInfo;
+    }
+}
+
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java
index d933a1c..f6e26a7 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java
@@ -17,6 +17,7 @@
 
 import static com.android.settingslib.flags.Flags.FLAG_ENABLE_LE_AUDIO_SHARING;
 import static com.android.settingslib.flags.Flags.FLAG_ENABLE_SET_PREFERRED_TRANSPORT_FOR_LE_AUDIO_DEVICE;
+import static com.android.settingslib.flags.Flags.FLAG_ENABLE_TEMPORARY_BOND_DEVICES_UI;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -78,11 +79,14 @@
     private static final String TWS_BATTERY_RIGHT = "25";
     private static final String TWS_LOW_BATTERY_THRESHOLD_LOW = "10";
     private static final String TWS_LOW_BATTERY_THRESHOLD_HIGH = "25";
+    private static final String TEMP_BOND_METADATA =
+            "<TEMP_BOND_TYPE>le_audio_sharing</TEMP_BOND_TYPE>";
     private static final short RSSI_1 = 10;
     private static final short RSSI_2 = 11;
     private static final boolean JUSTDISCOVERED_1 = true;
     private static final boolean JUSTDISCOVERED_2 = false;
     private static final int LOW_BATTERY_COLOR = android.R.color.holo_red_dark;
+    private static final int METADATA_FAST_PAIR_CUSTOMIZED_FIELDS = 25;
     @Mock
     private LocalBluetoothProfileManager mProfileManager;
     @Mock
@@ -128,6 +132,7 @@
         mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_TV_MEDIA_OUTPUT_DIALOG);
         mSetFlagsRule.enableFlags(FLAG_ENABLE_SET_PREFERRED_TRANSPORT_FOR_LE_AUDIO_DEVICE);
         mSetFlagsRule.enableFlags(FLAG_ENABLE_LE_AUDIO_SHARING);
+        mSetFlagsRule.enableFlags(FLAG_ENABLE_TEMPORARY_BOND_DEVICES_UI);
         mContext = RuntimeEnvironment.application;
         mAudioManager = mContext.getSystemService(AudioManager.class);
         mShadowBluetoothAdapter = Shadow.extract(BluetoothAdapter.getDefaultAdapter());
@@ -2075,6 +2080,87 @@
     }
 
     @Test
+    public void getConnectionSummary_GuestDeviceBroadcastPrimary_activeDevice_returnActive() {
+        when(mBroadcast.isEnabled(any())).thenReturn(true);
+        when(mCachedDevice.getDevice()).thenReturn(mDevice);
+        Settings.Secure.putInt(
+                mContext.getContentResolver(),
+                BluetoothUtils.getPrimaryGroupIdUriForBroadcast(),
+                BluetoothCsipSetCoordinator.GROUP_ID_INVALID);
+        when(mDevice.getMetadata(METADATA_FAST_PAIR_CUSTOMIZED_FIELDS))
+                .thenReturn(TEMP_BOND_METADATA.getBytes());
+
+        List<Long> bisSyncState = new ArrayList<>();
+        bisSyncState.add(1L);
+        when(mLeBroadcastReceiveState.getBisSyncState()).thenReturn(bisSyncState);
+        List<BluetoothLeBroadcastReceiveState> sourceList = new ArrayList<>();
+        sourceList.add(mLeBroadcastReceiveState);
+        when(mAssistant.getAllSources(any())).thenReturn(sourceList);
+
+        when(mCachedDevice.getGroupId()).thenReturn(1);
+        when(mCachedDevice.isActiveDevice(BluetoothProfile.LE_AUDIO)).thenReturn(true);
+
+        assertThat(mCachedDevice.getConnectionSummary(false))
+                .isEqualTo(mContext.getString(R.string.bluetooth_active_no_battery_level));
+    }
+
+    @Test
+    public void getConnectionSummary_GuestDeviceBroadcastSecondary_activeDevice_returnGuestMedia() {
+        when(mBroadcast.isEnabled(any())).thenReturn(true);
+        when(mCachedDevice.getDevice()).thenReturn(mDevice);
+        Settings.Secure.putInt(
+                mContext.getContentResolver(),
+                BluetoothUtils.getPrimaryGroupIdUriForBroadcast(),
+                1);
+        when(mDevice.getMetadata(METADATA_FAST_PAIR_CUSTOMIZED_FIELDS))
+                .thenReturn(TEMP_BOND_METADATA.getBytes());
+
+        List<Long> bisSyncState = new ArrayList<>();
+        bisSyncState.add(1L);
+        when(mLeBroadcastReceiveState.getBisSyncState()).thenReturn(bisSyncState);
+        List<BluetoothLeBroadcastReceiveState> sourceList = new ArrayList<>();
+        sourceList.add(mLeBroadcastReceiveState);
+        when(mAssistant.getAllSources(any())).thenReturn(sourceList);
+
+        when(mCachedDevice.getGroupId()).thenReturn(BluetoothCsipSetCoordinator.GROUP_ID_INVALID);
+
+        assertThat(mCachedDevice.getConnectionSummary(false))
+                .isEqualTo(
+                        mContext.getString(R.string.bluetooth_guest_media_only_no_battery_level));
+    }
+
+    @Test
+    public void getConnectionSummary_GuestDeviceSupportsBroadcastConnected_returnGuestSupportLe() {
+        when(mBroadcast.isEnabled(any())).thenReturn(true);
+        when(mCachedDevice.getDevice()).thenReturn(mDevice);
+        when(mLeAudioProfile.isEnabled(mDevice)).thenReturn(true);
+        when(mDevice.getMetadata(METADATA_FAST_PAIR_CUSTOMIZED_FIELDS))
+                .thenReturn(TEMP_BOND_METADATA.getBytes());
+
+        when(mCachedDevice.getProfiles()).thenReturn(ImmutableList.of(mLeAudioProfile));
+        when(mCachedDevice.isConnected()).thenReturn(true);
+
+        assertThat(mCachedDevice.getConnectionSummary(false))
+                .isEqualTo(
+                        mContext.getString(R.string.bluetooth_guest_no_battery_level_lea_support));
+    }
+
+    @Test
+    public void getConnectionSummary_GuestDeviceSupportsBroadcastNotConnected_returnSavedGuest() {
+        when(mBroadcast.isEnabled(any())).thenReturn(true);
+        when(mCachedDevice.getDevice()).thenReturn(mDevice);
+        when(mLeAudioProfile.isEnabled(mDevice)).thenReturn(true);
+        when(mDevice.getMetadata(METADATA_FAST_PAIR_CUSTOMIZED_FIELDS))
+                .thenReturn(TEMP_BOND_METADATA.getBytes());
+
+        when(mCachedDevice.getProfiles()).thenReturn(ImmutableList.of(mLeAudioProfile));
+        when(mCachedDevice.isConnected()).thenReturn(false);
+
+        assertThat(mCachedDevice.getConnectionSummary(false))
+                .isEqualTo(mContext.getString(R.string.bluetooth_guest_saved_device_lea_support));
+    }
+
+    @Test
     public void isHearingDevice_supportHearingRelatedProfiles_returnTrue() {
         when(mCachedDevice.getProfiles()).thenReturn(
                 ImmutableList.of(mHapClientProfile, mHearingAidProfile));
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/notification/data/repository/ZenModeRepositoryTest.kt b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/notification/data/repository/ZenModeRepositoryTest.kt
index 388af61..b364368 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/notification/data/repository/ZenModeRepositoryTest.kt
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/notification/data/repository/ZenModeRepositoryTest.kt
@@ -91,7 +91,6 @@
             )
     }
 
-    @EnableFlags(android.app.Flags.FLAG_MODES_API)
     @Test
     fun consolidatedPolicyChanges_repositoryEmits_flagsOn() {
         testScope.runTest {
@@ -110,7 +109,6 @@
         }
     }
 
-    @EnableFlags(android.app.Flags.FLAG_MODES_API)
     @Test
     fun consolidatedPolicyChanges_repositoryEmitsFromExtras() {
         testScope.runTest {
diff --git a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
index 27a3cf1..60fe156 100644
--- a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
+++ b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
@@ -124,6 +124,7 @@
         Settings.Secure.POWER_MENU_LOCKED_SHOW_CONTENT,
         Settings.Secure.DOZE_ENABLED,
         Settings.Secure.DOZE_ALWAYS_ON,
+        Settings.Secure.DOZE_ALWAYS_ON_WALLPAPER_ENABLED,
         Settings.Secure.DOZE_PICK_UP_GESTURE,
         Settings.Secure.DOZE_DOUBLE_TAP_GESTURE,
         Settings.Secure.DOZE_TAP_SCREEN_GESTURE,
diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
index 9591b43..3d941e8 100644
--- a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
+++ b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
@@ -184,6 +184,7 @@
         VALIDATORS.put(Secure.STATUS_BAR_SHOW_VIBRATE_ICON, BOOLEAN_VALIDATOR);
         VALIDATORS.put(Secure.DOZE_ENABLED, BOOLEAN_VALIDATOR);
         VALIDATORS.put(Secure.DOZE_ALWAYS_ON, BOOLEAN_VALIDATOR);
+        VALIDATORS.put(Secure.DOZE_ALWAYS_ON_WALLPAPER_ENABLED, BOOLEAN_VALIDATOR);
         VALIDATORS.put(Secure.DOZE_PICK_UP_GESTURE, BOOLEAN_VALIDATOR);
         VALIDATORS.put(Secure.DOZE_DOUBLE_TAP_GESTURE, BOOLEAN_VALIDATOR);
         VALIDATORS.put(Secure.DOZE_TAP_SCREEN_GESTURE, BOOLEAN_VALIDATOR);
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
index 4f52031..ed11e12 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
@@ -209,7 +209,7 @@
 
         // Get datatype for B&R metrics logging.
         String datatype = "";
-        if (Flags.enableMetricsSettingsBackupAgents()) {
+        if (areAgentMetricsEnabled()) {
             datatype = SettingsBackupRestoreKeys.getKeyFromUri(destination);
         }
 
@@ -299,7 +299,7 @@
             contentValues.put(Settings.NameValueTable.NAME, name);
             contentValues.put(Settings.NameValueTable.VALUE, value);
             cr.insert(destination, contentValues);
-            if (Flags.enableMetricsSettingsBackupAgents()) {
+            if (areAgentMetricsEnabled()) {
                 mBackupRestoreEventLogger.logItemsRestored(datatype, /* count= */ 1);
             }
         } catch (Exception e) {
@@ -308,7 +308,7 @@
             sendBroadcastSystemUI = false;
             sendBroadcastAccessibility = false;
             Log.e(TAG, "Failed to restore setting name: " + name + " + value: " + value, e);
-            if (Flags.enableMetricsSettingsBackupAgents()) {
+            if (areAgentMetricsEnabled()) {
                 mBackupRestoreEventLogger.logItemsRestoreFailed(
                     datatype, /* count= */ 1, ERROR_FAILED_TO_RESTORE_SETTING);
             }
@@ -785,12 +785,12 @@
 
             am.updatePersistentConfigurationWithAttribution(config, mContext.getOpPackageName(),
                     mContext.getAttributionTag());
-            if (Flags.enableMetricsSettingsBackupAgents() && mBackupRestoreEventLogger != null) {
+            if (areAgentMetricsEnabled()) {
                 mBackupRestoreEventLogger
                     .logItemsRestored(SettingsBackupRestoreKeys.KEY_LOCALE, localeList.size());
             }
         } catch (RemoteException e) {
-            if (Flags.enableMetricsSettingsBackupAgents() && mBackupRestoreEventLogger != null) {
+            if (areAgentMetricsEnabled()) {
                 mBackupRestoreEventLogger
                     .logItemsRestoreFailed(
                         SettingsBackupRestoreKeys.KEY_LOCALE,
@@ -817,4 +817,8 @@
     void setBackupRestoreEventLogger(BackupRestoreEventLogger backupRestoreEventLogger) {
         mBackupRestoreEventLogger = backupRestoreEventLogger;
     }
+
+    private boolean areAgentMetricsEnabled() {
+        return Flags.enableMetricsSettingsBackupAgents() && mBackupRestoreEventLogger != null;
+    }
 }
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/WritableNamespacePrefixes.java b/packages/SettingsProvider/src/com/android/providers/settings/WritableNamespacePrefixes.java
index 74fd828..274fd35 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/WritableNamespacePrefixes.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/WritableNamespacePrefixes.java
@@ -124,6 +124,7 @@
                 "privacy",
                 "private_compute_services",
                 "profcollect_native_boot",
+                "profiling_testing",
                 "remote_auth",
                 "remote_key_provisioning_native",
                 "rollback",
diff --git a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
index 246aa71..85617ba 100644
--- a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
+++ b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
@@ -809,7 +809,9 @@
                  Settings.Secure.DND_CONFIGS_MIGRATED,
                  Settings.Secure.NAVIGATION_MODE_RESTORE,
                  Settings.Secure.V_TO_U_RESTORE_ALLOWLIST,
-                 Settings.Secure.V_TO_U_RESTORE_DENYLIST);
+                 Settings.Secure.V_TO_U_RESTORE_DENYLIST,
+                 Settings.Secure.REDACT_OTP_NOTIFICATION_WHILE_CONNECTED_TO_WIFI,
+                 Settings.Secure.REDACT_OTP_NOTIFICATION_IMMEDIATELY);
 
     @Test
     public void systemSettingsBackedUpOrDenied() {
diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsHelperRestoreTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsHelperRestoreTest.java
index 62c03dd..cb3f54e 100644
--- a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsHelperRestoreTest.java
+++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsHelperRestoreTest.java
@@ -20,6 +20,8 @@
 
 import static junit.framework.Assert.assertEquals;
 
+import android.app.backup.BackupAnnotations.OperationType;
+import android.app.backup.BackupRestoreEventLogger;
 import android.content.ContentResolver;
 import android.content.ContentValues;
 import android.content.Context;
@@ -60,11 +62,14 @@
     private static final float FLOAT_TOLERANCE = 0.01f;
     private ContentResolver mContentResolver;
     private SettingsHelper mSettingsHelper;
+    private BackupRestoreEventLogger mBackupRestoreEventLogger;
 
     @Before
     public void setUp() {
         mContentResolver = mInterceptingContext.getContentResolver();
         mSettingsHelper = new SettingsHelper(mInterceptingContext);
+        mBackupRestoreEventLogger = new BackupRestoreEventLogger(OperationType.RESTORE);
+        mSettingsHelper.setBackupRestoreEventLogger(mBackupRestoreEventLogger);
     }
 
     @After
diff --git a/packages/Shell/res/values-cs/strings.xml b/packages/Shell/res/values-cs/strings.xml
index ab031a4..d2931d9 100644
--- a/packages/Shell/res/values-cs/strings.xml
+++ b/packages/Shell/res/values-cs/strings.xml
@@ -22,7 +22,7 @@
     <string name="bugreport_finished_title" msgid="4429132808670114081">"Zpráva o chybě <xliff:g id="ID">#%d</xliff:g> byla vytvořena"</string>
     <string name="bugreport_updating_title" msgid="4423539949559634214">"Přidávání podrobností do zprávy o chybě"</string>
     <string name="bugreport_updating_wait" msgid="3322151947853929470">"Čekejte prosím…"</string>
-    <string name="bugreport_finished_text" product="watch" msgid="1223616207145252689">"Na telefonu se brzy zobrazí zpráva o chybě."</string>
+    <string name="bugreport_finished_text" product="watch" msgid="1223616207145252689">"Zpráva o chybě se brzy zobrazí na telefonu."</string>
     <string name="bugreport_finished_text" product="tv" msgid="5758325479058638893">"Zprávu o chybě můžete sdílet klepnutím"</string>
     <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"Zprávu o chybě můžete sdílet klepnutím"</string>
     <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"Přejetím můžete zprávu o chybě sdílet bez snímku obrazovky, nebo vyčkejte, než se snímek připraví"</string>
diff --git a/packages/Shell/res/values-pl/strings.xml b/packages/Shell/res/values-pl/strings.xml
index 1ff4bbd..0a60565 100644
--- a/packages/Shell/res/values-pl/strings.xml
+++ b/packages/Shell/res/values-pl/strings.xml
@@ -22,7 +22,7 @@
     <string name="bugreport_finished_title" msgid="4429132808670114081">"Raport o błędzie <xliff:g id="ID">#%d</xliff:g> został zapisany"</string>
     <string name="bugreport_updating_title" msgid="4423539949559634214">"Dodaję szczegóły do raportu o błędzie"</string>
     <string name="bugreport_updating_wait" msgid="3322151947853929470">"Czekaj..."</string>
-    <string name="bugreport_finished_text" product="watch" msgid="1223616207145252689">"Raport o błędzie będzie pojawiał się na telefonie przez chwilę"</string>
+    <string name="bugreport_finished_text" product="watch" msgid="1223616207145252689">"Raport o błędzie za chwilę pojawi się na telefonie"</string>
     <string name="bugreport_finished_text" product="tv" msgid="5758325479058638893">"Wybierz, by udostępnić raport o błędzie"</string>
     <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"Kliknij, by udostępnić raport o błędzie"</string>
     <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"Wybierz, by udostępnić raport o błędzie bez zrzutu ekranu, lub poczekaj, aż zostanie on wygenerowany"</string>
diff --git a/packages/Shell/res/values-sl/strings.xml b/packages/Shell/res/values-sl/strings.xml
index 76702d6..ab6d51a 100644
--- a/packages/Shell/res/values-sl/strings.xml
+++ b/packages/Shell/res/values-sl/strings.xml
@@ -19,7 +19,7 @@
     <string name="app_label" msgid="3701846017049540910">"Lupina"</string>
     <string name="bugreport_notification_channel" msgid="2574150205913861141">"Poročila o napakah"</string>
     <string name="bugreport_in_progress_title" msgid="4311705936714972757">"Poročilo o napaki <xliff:g id="ID">#%d</xliff:g> je v izdelavi"</string>
-    <string name="bugreport_finished_title" msgid="4429132808670114081">"Poročilo o napaki <xliff:g id="ID">#%d</xliff:g> zajeto"</string>
+    <string name="bugreport_finished_title" msgid="4429132808670114081">"Poročilo o napaki <xliff:g id="ID">#%d</xliff:g> je zajeto"</string>
     <string name="bugreport_updating_title" msgid="4423539949559634214">"Dodajanje podrobnosti v poročilo o napakah"</string>
     <string name="bugreport_updating_wait" msgid="3322151947853929470">"Počakajte ..."</string>
     <string name="bugreport_finished_text" product="watch" msgid="1223616207145252689">"Poročilo o napakah bo kmalu prikazano v telefonu"</string>
diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp
index 19806e7..49cdec1 100644
--- a/packages/SystemUI/Android.bp
+++ b/packages/SystemUI/Android.bp
@@ -60,6 +60,7 @@
         "src-release/**/*.kt",
         "src-release/**/*.java",
     ],
+    path: "src-release",
     visibility: ["//visibility:private"],
 }
 
@@ -69,6 +70,7 @@
         "src-debug/**/*.kt",
         "src-debug/**/*.java",
     ],
+    path: "src-debug",
     visibility: ["//visibility:private"],
 }
 
@@ -315,11 +317,11 @@
         "tests/src/**/systemui/temporarydisplay/TemporaryViewDisplayControllerTest.kt",
         "tests/src/**/systemui/statusbar/policy/WalletControllerImplTest.kt",
         "tests/src/**/keyguard/ClockEventControllerTest.kt",
-        "tests/src/**/systemui/bluetooth/qsdialog/BluetoothStateInteractorTest.kt",
         "tests/src/**/systemui/bluetooth/qsdialog/BluetoothDetailsContentManagerTest.kt",
+        "tests/src/**/systemui/bluetooth/qsdialog/BluetoothDetailsContentViewModelTest.kt",
+        "tests/src/**/systemui/bluetooth/qsdialog/BluetoothStateInteractorTest.kt",
         "tests/src/**/systemui/bluetooth/qsdialog/BluetoothTileDialogDelegateTest.kt",
         "tests/src/**/systemui/bluetooth/qsdialog/BluetoothTileDialogRepositoryTest.kt",
-        "tests/src/**/systemui/bluetooth/qsdialog/BluetoothTileDialogViewModelTest.kt",
         "tests/src/**/systemui/bluetooth/qsdialog/DeviceItemFactoryTest.kt",
         "tests/src/**/systemui/bluetooth/qsdialog/DeviceItemInteractorTest.kt",
         "tests/src/**/systemui/broadcast/UserBroadcastDispatcherTest.kt",
@@ -430,12 +432,21 @@
     ],
 }
 
-android_library {
-    name: "SystemUI-core",
+filegroup {
+    name: "SystemUI-core-srcs",
     srcs: [
         "src/**/*.kt",
         "src/**/*.java",
         "src/**/I*.aidl",
+    ],
+    path: "src",
+    visibility: ["//visibility:private"],
+}
+
+android_library {
+    name: "SystemUI-core",
+    srcs: [
+        ":SystemUI-core-srcs",
         ":ReleaseJavaFiles",
         "compose/features/src/**/*.kt",
         "compose/facade/enabled/src/**/*.kt",
@@ -731,9 +742,7 @@
     srcs: [
         "tests/src/**/*.kt",
         "tests/src/**/*.java",
-        "src/**/*.kt",
-        "src/**/*.java",
-        "src/**/I*.aidl",
+        ":SystemUI-core-srcs",
         ":ReleaseJavaFiles",
         ":SystemUI-tests-multivalent",
         ":SystemUI-tests-utils",
@@ -841,7 +850,7 @@
         "androidx.test.uiautomator_uiautomator",
         "androidx.core_core-animation-testing",
         "androidx.test.ext.junit",
-        "inline-mockito-robolectric-prebuilt",
+        "inline-mockito5-robolectric-prebuilt",
         "mockito-kotlin-nodeps",
         "platform-parametric-runner-lib",
         "SystemUICustomizationTestUtils",
diff --git a/packages/SystemUI/aconfig/Android.bp b/packages/SystemUI/aconfig/Android.bp
index 088ec13..f5bff85 100644
--- a/packages/SystemUI/aconfig/Android.bp
+++ b/packages/SystemUI/aconfig/Android.bp
@@ -28,6 +28,7 @@
         "//frameworks/libs/systemui/tracinglib:__subpackages__",
         "//frameworks/base/services/accessibility:__subpackages__",
         "//frameworks/base/services/tests:__subpackages__",
+        "//packages/apps/Settings:__subpackages__",
         "//platform_testing:__subpackages__",
         "//vendor:__subpackages__",
         "//cts:__subpackages__",
diff --git a/packages/SystemUI/aconfig/systemui.aconfig b/packages/SystemUI/aconfig/systemui.aconfig
index 910f712..0ccb20c 100644
--- a/packages/SystemUI/aconfig/systemui.aconfig
+++ b/packages/SystemUI/aconfig/systemui.aconfig
@@ -67,6 +67,13 @@
 }
 
 flag {
+  name: "notifications_redesign_guts"
+  namespace: "systemui"
+  description: "Notifications Redesign: Update the look of the notification guts (that appear on long press). This includes using the new cache for app icons."
+  bug: "394822197"
+}
+
+flag {
    name: "notification_row_content_binder_refactor"
    namespace: "systemui"
    description: "Convert the NotificationContentInflater to Kotlin and restructure it to support modern views"
@@ -957,16 +964,6 @@
 }
 
 flag {
-    name: "dedicated_notif_inflation_thread"
-    namespace: "systemui"
-    description: "Create a separate background thread for inflating notifications"
-    bug: "308967184"
-    metadata {
-        purpose: PURPOSE_BUGFIX
-    }
-}
-
-flag {
     name: "bind_keyguard_media_visibility"
     namespace: "systemui"
     description: "Binds Keyguard Media Controller Visibility to MediaContainerView"
@@ -1258,13 +1255,6 @@
 }
 
 flag {
-    name: "glanceable_hub_back_action"
-    namespace: "systemui"
-    description: "Support back action from glanceable hub"
-    bug: "382771533"
-}
-
-flag {
     name: "dream_overlay_updated_font"
     namespace: "systemui"
     description: "Flag to enable updated font settings for dream overlay"
@@ -1997,6 +1987,16 @@
 }
 
 flag {
+  name: "expand_collapse_privacy_dialog"
+  namespace: "systemui"
+  description: "Add expand and collapse actions to accessibility, to allow announcement in TalkBack when state changes."
+  bug: "380161221"
+  metadata {
+    purpose: PURPOSE_BUGFIX
+  }
+}
+
+flag {
     name: "show_locked_by_your_watch_keyguard_indicator"
     namespace: "systemui"
     description: "Show a Locked by your watch indicator on the keyguard when the device is locked by the watch."
@@ -2016,3 +2016,13 @@
     description: "Enables the clock fidget animation"
     bug: "364664389"
 }
+
+flag {
+    name: "notifications_launch_radius"
+    namespace: "systemui"
+    description: "Fixes a discrepancy in corner radius between expanding notification and opening window during launch animations."
+    bug: "396054791"
+    metadata {
+        purpose: PURPOSE_BUGFIX
+    }
+}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerScene.kt
index fad8ae7..2f38dc2 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerScene.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerScene.kt
@@ -24,6 +24,7 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.DisposableEffect
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.testTag
 import com.android.compose.animation.scene.ContentScope
 import com.android.compose.animation.scene.ElementKey
 import com.android.compose.animation.scene.UserAction
@@ -102,6 +103,8 @@
             viewModel,
             dialogFactory,
             Modifier.element(Bouncer.Elements.Content)
+                // TODO(b/393516240): Use the same sysuiResTag() as views instead.
+                .testTag(Bouncer.Elements.Content.testTag)
                 .overscroll(verticalOverscrollEffect)
                 .sysuiResTag(Bouncer.TestTags.Root)
                 .fillMaxSize(),
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/common/ui/compose/Icon.kt b/packages/SystemUI/compose/features/src/com/android/systemui/common/ui/compose/Icon.kt
index 8b0c005..09db2d6 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/common/ui/compose/Icon.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/common/ui/compose/Icon.kt
@@ -19,10 +19,12 @@
 import androidx.compose.material3.Icon
 import androidx.compose.material3.LocalContentColor
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.asImageBitmap
 import androidx.compose.ui.res.painterResource
-import com.android.compose.ui.graphics.painter.rememberDrawablePainter
+import androidx.core.graphics.drawable.toBitmap
 import com.android.systemui.common.shared.model.Icon
 
 /**
@@ -35,7 +37,12 @@
     val contentDescription = icon.contentDescription?.load()
     when (icon) {
         is Icon.Loaded -> {
-            Icon(rememberDrawablePainter(icon.drawable), contentDescription, modifier, tint)
+            Icon(
+                remember(icon.drawable) { icon.drawable.toBitmap().asImageBitmap() },
+                contentDescription,
+                modifier,
+                tint,
+            )
         }
         is Icon.Resource -> Icon(painterResource(icon.res), contentDescription, modifier, tint)
     }
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 2ca7055..0b17a3f 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
@@ -200,8 +200,9 @@
         scene(
             CommunalScenes.Blank,
             userActions =
-                if (viewModel.v2FlagEnabled()) emptyMap()
-                else mapOf(Swipe.Start(fromSource = Edge.End) to CommunalScenes.Communal),
+                if (viewModel.swipeToHubEnabled())
+                    mapOf(Swipe.Start(fromSource = Edge.End) to CommunalScenes.Communal)
+                else emptyMap(),
         ) {
             // This scene shows nothing only allowing for transitions to the communal scene.
             Box(modifier = Modifier.fillMaxSize())
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 9c57efc..835dd7a 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
@@ -76,7 +76,7 @@
 import androidx.compose.foundation.rememberScrollState
 import androidx.compose.foundation.selection.selectable
 import androidx.compose.foundation.shape.RoundedCornerShape
-import androidx.compose.foundation.text.AutoSize
+import androidx.compose.foundation.text.TextAutoSize
 import androidx.compose.foundation.text.BasicText
 import androidx.compose.foundation.verticalScroll
 import androidx.compose.material.icons.Icons
@@ -1045,7 +1045,7 @@
                         color = colors.onPrimary,
                         textAlign = TextAlign.Center,
                     ),
-                autoSize = AutoSize.StepBased(maxFontSize = 36.sp, stepSize = 0.1.sp),
+                autoSize = TextAutoSize.StepBased(maxFontSize = 36.sp, stepSize = 0.1.sp),
                 modifier =
                     Modifier.focusable().semantics(mergeDescendants = true) {
                         contentDescription = titleForEmptyStateCTA
@@ -1705,15 +1705,38 @@
     contentScope: ContentScope?,
     modifier: Modifier = Modifier,
 ) {
-    if (SceneContainerFlag.isEnabled && contentScope != null) {
-        contentScope.MediaCarousel(
-            modifier = modifier.fillMaxSize(),
-            isVisible = true,
-            mediaHost = viewModel.mediaHost,
-            carouselController = viewModel.mediaCarouselController,
-        )
-    } else {
-        UmoLegacy(viewModel, modifier)
+    val showNextActionLabel = stringResource(R.string.accessibility_action_label_umo_show_next)
+    val showPreviousActionLabel =
+        stringResource(R.string.accessibility_action_label_umo_show_previous)
+
+    Box(
+        modifier =
+            modifier.thenIf(!viewModel.isEditMode) {
+                Modifier.semantics {
+                    customActions =
+                        listOf(
+                            CustomAccessibilityAction(showNextActionLabel) {
+                                viewModel.onShowNextMedia()
+                                true
+                            },
+                            CustomAccessibilityAction(showPreviousActionLabel) {
+                                viewModel.onShowPreviousMedia()
+                                true
+                            },
+                        )
+                }
+            }
+    ) {
+        if (SceneContainerFlag.isEnabled && contentScope != null) {
+            contentScope.MediaCarousel(
+                modifier = modifier.fillMaxSize(),
+                isVisible = true,
+                mediaHost = viewModel.mediaHost,
+                carouselController = viewModel.mediaCarouselController,
+            )
+        } else {
+            UmoLegacy(viewModel, modifier)
+        }
     }
 }
 
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/ContentListState.kt b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/ContentListState.kt
index 16002bc..8ad96a5 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/ContentListState.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/ContentListState.kt
@@ -57,7 +57,8 @@
 internal constructor(
     communalContent: List<CommunalContentModel>,
     private val onAddWidget: (componentName: ComponentName, user: UserHandle, rank: Int) -> Unit,
-    private val onDeleteWidget: (id: Int, componentName: ComponentName, rank: Int) -> Unit,
+    private val onDeleteWidget:
+        (id: Int, key: String, componentName: ComponentName, rank: Int) -> Unit,
     private val onReorderWidgets: (widgetIdToRankMap: Map<Int, Int>) -> Unit,
     private val onResizeWidget:
         (
@@ -81,7 +82,7 @@
         if (list[indexToRemove].isWidgetContent()) {
             val widget = list[indexToRemove] as CommunalContentModel.WidgetContent
             list.apply { removeAt(indexToRemove) }
-            onDeleteWidget(widget.appWidgetId, widget.componentName, widget.rank)
+            onDeleteWidget(widget.appWidgetId, widget.key, widget.componentName, widget.rank)
         }
     }
 
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/ResponsiveLazyHorizontalGrid.kt b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/ResponsiveLazyHorizontalGrid.kt
index 62aa31b..73a2425 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/ResponsiveLazyHorizontalGrid.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/ResponsiveLazyHorizontalGrid.kt
@@ -50,7 +50,6 @@
 import androidx.window.layout.WindowMetricsCalculator
 import com.android.systemui.communal.util.WindowSizeUtils.COMPACT_HEIGHT
 import com.android.systemui.communal.util.WindowSizeUtils.COMPACT_WIDTH
-import com.android.systemui.communal.util.WindowSizeUtils.MEDIUM_WIDTH
 
 /**
  * Renders a responsive [LazyHorizontalGrid] with dynamic columns and rows. Each cell will maintain
@@ -267,9 +266,8 @@
 }
 
 private fun calculateNumCellsWidth(width: Dp) =
-    // See https://developer.android.com/develop/ui/views/layout/use-window-size-classes
     when {
-        width >= MEDIUM_WIDTH -> 3
+        width >= 900.dp -> 3
         width >= COMPACT_WIDTH -> 2
         else -> 1
     }
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 ba85f95..5806458 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
@@ -20,11 +20,8 @@
 import androidx.compose.foundation.layout.Box
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.DisposableEffect
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.rememberCoroutineScope
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.platform.LocalView
-import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import com.android.compose.animation.scene.ContentScope
 import com.android.internal.jank.Cuj
 import com.android.internal.jank.Cuj.CujType
@@ -70,8 +67,7 @@
             rememberViewModel("LockscreenContent-scrimViewModel") {
                 notificationScrimViewModelFactory.create()
             }
-        val isContentVisible: Boolean by viewModel.isContentVisible.collectAsStateWithLifecycle()
-        if (!isContentVisible) {
+        if (!viewModel.isContentVisible) {
             // If the content isn't supposed to be visible, show a large empty box as it's needed
             // for scene transition animations (can't just skip rendering everything or shared
             // elements won't have correct final/initial bounds from animating in and out of the
@@ -80,15 +76,13 @@
             return
         }
 
-        val coroutineScope = rememberCoroutineScope()
-        val blueprintId by viewModel.blueprintId(coroutineScope).collectAsStateWithLifecycle()
         DisposableEffect(view) {
             clockInteractor.clockEventController.registerListeners(view)
 
             onDispose { clockInteractor.clockEventController.unregisterListeners() }
         }
 
-        val blueprint = blueprintByBlueprintId[blueprintId] ?: return
+        val blueprint = blueprintByBlueprintId[viewModel.blueprintId] ?: return
         with(blueprint) {
             Content(viewModel, modifier.sysuiResTag("keyguard_root_view"))
             NotificationLockscreenScrim(notificationLockscreenScrimViewModel)
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/LockscreenScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/LockscreenScene.kt
index 5e61af6..aa07370 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
@@ -19,6 +19,7 @@
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.testTag
 import com.android.compose.animation.scene.ContentScope
 import com.android.compose.animation.scene.UserAction
 import com.android.compose.animation.scene.UserActionResult
@@ -55,7 +56,11 @@
 
     @Composable
     override fun ContentScope.Content(modifier: Modifier) {
-        LockscreenScene(lockscreenContent = lockscreenContent, modifier = modifier)
+        LockscreenScene(
+            lockscreenContent = lockscreenContent,
+            // TODO(b/393516240): Use the same sysuiResTag() as views instead.
+            modifier = modifier.testTag(key.rootElementKey.testTag),
+        )
     }
 }
 
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 6e25c8a..590a74e 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
@@ -23,7 +23,6 @@
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.padding
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.graphicsLayer
@@ -31,7 +30,7 @@
 import androidx.compose.ui.res.dimensionResource
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.IntRect
-import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import androidx.compose.ui.unit.dp
 import com.android.compose.animation.scene.ContentScope
 import com.android.compose.modifiers.padding
 import com.android.systemui.compose.modifiers.sysuiResTag
@@ -44,6 +43,8 @@
 import com.android.systemui.keyguard.ui.composable.section.StatusBarSection
 import com.android.systemui.keyguard.ui.composable.section.TopAreaSection
 import com.android.systemui.keyguard.ui.viewmodel.LockscreenContentViewModel
+import com.android.systemui.keyguard.ui.viewmodel.LockscreenContentViewModel.NotificationsPlacement.BelowClock
+import com.android.systemui.keyguard.ui.viewmodel.LockscreenContentViewModel.NotificationsPlacement.BesideClock
 import com.android.systemui.res.R
 import java.util.Optional
 import javax.inject.Inject
@@ -70,11 +71,8 @@
     @Composable
     override fun ContentScope.Content(viewModel: LockscreenContentViewModel, modifier: Modifier) {
         val isUdfpsVisible = viewModel.isUdfpsVisible
-        val isShadeLayoutWide by viewModel.isShadeLayoutWide.collectAsStateWithLifecycle()
-        val unfoldTranslations by viewModel.unfoldTranslations.collectAsStateWithLifecycle()
-        val areNotificationsVisible by
-            viewModel.areNotificationsVisible().collectAsStateWithLifecycle(initialValue = false)
-        val isBypassEnabled by viewModel.isBypassEnabled.collectAsStateWithLifecycle()
+        val isBypassEnabled = viewModel.isBypassEnabled
+        val notificationsPlacement = viewModel.notificationsPlacement
 
         if (isBypassEnabled) {
             with(notificationSection) { HeadsUpNotifications() }
@@ -91,7 +89,9 @@
                                 modifier =
                                     Modifier.fillMaxWidth()
                                         .padding(
-                                            horizontal = { unfoldTranslations.start.roundToInt() }
+                                            horizontal = {
+                                                viewModel.unfoldTranslations.start.roundToInt()
+                                            }
                                         )
                             )
                         }
@@ -100,29 +100,29 @@
                             with(topAreaSection) {
                                 DefaultClockLayout(
                                     smartSpacePaddingTop = viewModel::getSmartSpacePaddingTop,
-                                    isShadeLayoutWide = isShadeLayoutWide,
                                     modifier =
                                         Modifier.fillMaxWidth().graphicsLayer {
-                                            translationX = unfoldTranslations.start
+                                            translationX = viewModel.unfoldTranslations.start
                                         },
                                 )
                             }
-                            if (isShadeLayoutWide && !isBypassEnabled) {
+                            if (notificationsPlacement is BesideClock && !isBypassEnabled) {
                                 with(notificationSection) {
                                     Box(modifier = Modifier.fillMaxHeight()) {
                                         AodPromotedNotificationArea(
                                             modifier =
                                                 Modifier.fillMaxWidth(0.5f)
-                                                    .align(alignment = Alignment.TopEnd)
+                                                    .align(notificationsPlacement.alignment)
                                         )
                                         Notifications(
-                                            areNotificationsVisible = areNotificationsVisible,
-                                            isShadeLayoutWide = true,
+                                            areNotificationsVisible =
+                                                viewModel.areNotificationsVisible,
                                             burnInParams = null,
                                             modifier =
                                                 Modifier.fillMaxWidth(0.5f)
                                                     .fillMaxHeight()
-                                                    .align(alignment = Alignment.TopEnd),
+                                                    .align(notificationsPlacement.alignment)
+                                                    .padding(top = 12.dp),
                                         )
                                     }
                                 }
@@ -137,7 +137,7 @@
                             dimensionResource(R.dimen.below_clock_padding_start_icons)
 
                         with(notificationSection) {
-                            if (!isShadeLayoutWide && !isBypassEnabled) {
+                            if (notificationsPlacement is BelowClock && !isBypassEnabled) {
                                 Box(modifier = Modifier.weight(weight = 1f)) {
                                     Column(Modifier.align(alignment = Alignment.TopStart)) {
                                         AodPromotedNotificationArea(
@@ -149,14 +149,13 @@
                                         )
                                     }
                                     Notifications(
-                                        areNotificationsVisible = areNotificationsVisible,
-                                        isShadeLayoutWide = false,
+                                        areNotificationsVisible = viewModel.areNotificationsVisible,
                                         burnInParams = null,
                                     )
                                 }
                             } else {
                                 Column {
-                                    if (!isShadeLayoutWide) {
+                                    if (viewModel.notificationsPlacement is BelowClock) {
                                         AodPromotedNotificationArea(
                                             modifier =
                                                 Modifier.padding(top = aodPromotedNotifTopPadding)
@@ -204,13 +203,17 @@
                             isStart = true,
                             applyPadding = true,
                             modifier =
-                                Modifier.graphicsLayer { translationX = unfoldTranslations.start },
+                                Modifier.graphicsLayer {
+                                    translationX = viewModel.unfoldTranslations.start
+                                },
                         )
                         Shortcut(
                             isStart = false,
                             applyPadding = true,
                             modifier =
-                                Modifier.graphicsLayer { translationX = unfoldTranslations.end },
+                                Modifier.graphicsLayer {
+                                    translationX = viewModel.unfoldTranslations.end
+                                },
                         )
                     }
                     with(settingsMenuSection) { SettingsMenu(onSettingsMenuPlaced) }
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/MediaCarouselSection.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/MediaCarouselSection.kt
index d8b3f74..0876631 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/MediaCarouselSection.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/MediaCarouselSection.kt
@@ -41,16 +41,13 @@
 ) {
 
     @Composable
-    fun ContentScope.KeyguardMediaCarousel(
-        isShadeLayoutWide: Boolean,
-        modifier: Modifier = Modifier,
-    ) {
+    fun ContentScope.KeyguardMediaCarousel(modifier: Modifier = Modifier) {
         val viewModel =
             rememberViewModel(traceName = "KeyguardMediaCarousel") {
                 keyguardMediaViewModelFactory.create()
             }
         val horizontalPadding =
-            if (isShadeLayoutWide) {
+            if (viewModel.isShadeLayoutWide) {
                 dimensionResource(id = R.dimen.notification_side_paddings)
             } else {
                 dimensionResource(id = R.dimen.notification_side_paddings) +
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 f51049a..d903c3d 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
@@ -18,12 +18,13 @@
 
 import android.view.ViewGroup
 import androidx.compose.animation.AnimatedVisibility
+import androidx.compose.animation.EnterTransition
+import androidx.compose.animation.ExitTransition
 import androidx.compose.animation.core.MutableTransitionState
 import androidx.compose.animation.fadeIn
 import androidx.compose.animation.fadeOut
 import androidx.compose.foundation.layout.fillMaxWidth
 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.getValue
@@ -31,11 +32,9 @@
 import androidx.compose.runtime.rememberCoroutineScope
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.res.dimensionResource
-import androidx.compose.ui.unit.dp
 import androidx.compose.ui.viewinterop.AndroidView
 import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import com.android.compose.animation.scene.ContentScope
-import com.android.compose.modifiers.thenIf
 import com.android.systemui.common.ui.ConfigurationState
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.keyguard.ui.composable.blueprint.rememberBurnIn
@@ -118,12 +117,19 @@
 
         val isVisible by
             keyguardRootViewModel.isAodPromotedNotifVisible.collectAsStateWithLifecycle()
+        val transitionState = remember { MutableTransitionState(isVisible.value) }
+        LaunchedEffect(key1 = isVisible, key2 = transitionState.isIdle) {
+            transitionState.targetState = isVisible.value
+            if (isVisible.isAnimating && transitionState.isIdle) {
+                isVisible.stopAnimating()
+            }
+        }
         val burnIn = rememberBurnIn(keyguardClockViewModel)
 
         AnimatedVisibility(
-            visible = isVisible,
-            enter = fadeIn(),
-            exit = fadeOut(),
+            visibleState = transitionState,
+            enter = if (isVisible.isAnimating) fadeIn() else EnterTransition.None,
+            exit = if (isVisible.isAnimating) fadeOut() else ExitTransition.None,
             modifier = modifier.burnInAware(aodBurnInViewModel, burnIn.parameters),
         ) {
             AODPromotedNotification(aodPromotedNotificationViewModelFactory)
@@ -186,7 +192,6 @@
     @Composable
     fun ContentScope.Notifications(
         areNotificationsVisible: Boolean,
-        isShadeLayoutWide: Boolean,
         burnInParams: BurnInParameters?,
         modifier: Modifier = Modifier,
     ) {
@@ -198,16 +203,13 @@
             stackScrollView = stackScrollView.get(),
             viewModel = rememberViewModel("Notifications") { viewModelFactory.create() },
             modifier =
-                modifier
-                    .fillMaxWidth()
-                    .thenIf(isShadeLayoutWide) { Modifier.padding(top = 12.dp) }
-                    .let {
-                        if (burnInParams == null) {
-                            it
-                        } else {
-                            it.burnInAware(viewModel = aodBurnInViewModel, params = burnInParams)
-                        }
-                    },
+                modifier.fillMaxWidth().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 6293fc2..0134240 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
@@ -60,7 +60,6 @@
     @Composable
     fun ContentScope.DefaultClockLayout(
         smartSpacePaddingTop: (Resources) -> Int,
-        isShadeLayoutWide: Boolean,
         modifier: Modifier = Modifier,
     ) {
         val currentClockLayout by clockViewModel.currentClockLayout.collectAsStateWithLifecycle()
@@ -128,7 +127,7 @@
                     )
                 }
             }
-            with(mediaCarouselSection) { KeyguardMediaCarousel(isShadeLayoutWide) }
+            with(mediaCarouselSection) { KeyguardMediaCarousel() }
         }
     }
 
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainer.kt b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainer.kt
index aa0d474..0c502e6 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainer.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainer.kt
@@ -109,6 +109,13 @@
         rememberMutableSceneTransitionLayoutState(
             initialScene = initialSceneKey,
             canChangeScene = { toScene -> viewModel.canChangeScene(toScene) },
+            canShowOverlay = { overlay -> viewModel.canShowOrReplaceOverlay(overlay) },
+            canReplaceOverlay = { beingReplaced, newlyShown ->
+                viewModel.canShowOrReplaceOverlay(
+                    newlyShown = newlyShown,
+                    beingReplaced = beingReplaced,
+                )
+            },
             transitions = sceneTransitions,
             onTransitionStart = { transition ->
                 sceneJankMonitor.onTransitionStart(
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneTransitionLayoutDataSource.kt b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneTransitionLayoutDataSource.kt
index 6d906bd..8aa5bc7 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneTransitionLayoutDataSource.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneTransitionLayoutDataSource.kt
@@ -68,7 +68,7 @@
     }
 
     override fun snapToScene(toScene: SceneKey) {
-        state.snapToScene(scene = toScene)
+        state.snapTo(scene = toScene)
     }
 
     override fun showOverlay(overlay: OverlayKey, transitionKey: TransitionKey?) {
@@ -97,16 +97,10 @@
     }
 
     override fun instantlyShowOverlay(overlay: OverlayKey) {
-        state.snapToScene(
-            scene = state.transitionState.currentScene,
-            currentOverlays = state.currentOverlays + overlay,
-        )
+        state.snapTo(overlays = state.currentOverlays + overlay)
     }
 
     override fun instantlyHideOverlay(overlay: OverlayKey) {
-        state.snapToScene(
-            scene = state.transitionState.currentScene,
-            currentOverlays = state.currentOverlays - overlay,
-        )
+        state.snapTo(overlays = state.currentOverlays - overlay)
     }
 }
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 907b5bc..05958a2 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
@@ -169,7 +169,7 @@
             Modifier.maybeElevateInContent(layoutImpl, content, key, currentTransitionStates)
         }
         .then(ElementModifier(layoutImpl, currentTransitionStates, content, key))
-        .testTag(key.testTag)
+        .thenIf(layoutImpl.implicitTestTags) { Modifier.testTag(key.testTag) }
 }
 
 /**
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayout.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayout.kt
index 72bb82b..d47210c 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayout.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayout.kt
@@ -65,6 +65,8 @@
     swipeSourceDetector: SwipeSourceDetector = DefaultEdgeDetector,
     swipeDetector: SwipeDetector = DefaultSwipeDetector,
     @FloatRange(from = 0.0, to = 0.5) transitionInterceptionThreshold: Float = 0.05f,
+    // TODO(b/240432457) Remove this once test utils can access the internal STLForTesting().
+    implicitTestTags: Boolean = false,
     builder: SceneTransitionLayoutScope<ContentScope>.() -> Unit,
 ) {
     SceneTransitionLayoutForTesting(
@@ -73,6 +75,7 @@
         swipeSourceDetector,
         swipeDetector,
         transitionInterceptionThreshold,
+        implicitTestTags = implicitTestTags,
         onLayoutImpl = null,
         builder = builder,
     )
@@ -725,10 +728,8 @@
 }
 
 /**
- * An internal version of [SceneTransitionLayout] to be used for tests.
- *
- * Important: You should use this only in tests and if you need to access the underlying
- * [SceneTransitionLayoutImpl]. In other cases, you should use [SceneTransitionLayout].
+ * An internal version of [SceneTransitionLayout] to be used for tests, that provides access to the
+ * internal [SceneTransitionLayoutImpl] and implicitly tags all scenes and elements.
  */
 @Composable
 internal fun SceneTransitionLayoutForTesting(
@@ -741,6 +742,7 @@
     sharedElementMap: MutableMap<ElementKey, Element> = remember { mutableMapOf() },
     ancestors: List<Ancestor> = remember { emptyList() },
     lookaheadScope: LookaheadScope? = null,
+    implicitTestTags: Boolean = true,
     builder: SceneTransitionLayoutScope<InternalContentScope>.() -> Unit,
 ) {
     val density = LocalDensity.current
@@ -765,6 +767,7 @@
                 directionChangeSlop = directionChangeSlop,
                 defaultEffectFactory = defaultEffectFactory,
                 decayAnimationSpec = decayAnimationSpec,
+                implicitTestTags = implicitTestTags,
             )
             .also { onLayoutImpl?.invoke(it) }
     }
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt
index 53996d2..e3c4eb0 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt
@@ -122,6 +122,9 @@
      * This is used to enable transformations and shared elements across NestedSTLs.
      */
     internal val ancestors: List<Ancestor> = emptyList(),
+
+    /** Whether elements and scene should be tagged using `Modifier.testTag`. */
+    internal val implicitTestTags: Boolean = false,
     lookaheadScope: LookaheadScope? = null,
     defaultEffectFactory: OverscrollFactory,
 ) {
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutState.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutState.kt
index 5b275a5..56e8c45 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutState.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutState.kt
@@ -138,10 +138,13 @@
         transitionKey: TransitionKey? = null,
     ): Pair<TransitionState.Transition, Job>?
 
-    /** Immediately snap to the given [scene]. */
-    fun snapToScene(
-        scene: SceneKey,
-        currentOverlays: Set<OverlayKey> = transitionState.currentOverlays,
+    /**
+     * Immediately snap to the given [scene] and/or [overlays], instantly interrupting all ongoing
+     * transitions and settling to a [TransitionState.Idle] state.
+     */
+    fun snapTo(
+        scene: SceneKey = transitionState.currentScene,
+        overlays: Set<OverlayKey> = transitionState.currentOverlays,
     )
 
     /**
@@ -554,7 +557,7 @@
         this.transitionStates = listOf(idle)
     }
 
-    override fun snapToScene(scene: SceneKey, currentOverlays: Set<OverlayKey>) {
+    override fun snapTo(scene: SceneKey, overlays: Set<OverlayKey>) {
         checkThread()
 
         // Force finish all transitions.
@@ -562,7 +565,7 @@
 
         check(transitionStates.size == 1)
         check(currentTransitions.isEmpty())
-        transitionStates = listOf(TransitionState.Idle(scene, currentOverlays))
+        transitionStates = listOf(TransitionState.Idle(scene, overlays))
     }
 
     override fun showOverlay(
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/Content.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/Content.kt
index 95d6440..64cfe38 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/Content.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/Content.kt
@@ -171,7 +171,7 @@
                 .thenIf(layoutImpl.state.isElevationPossible(content = key, element = null)) {
                     Modifier.container(containerState)
                 }
-                .testTag(key.testTag)
+                .thenIf(layoutImpl.implicitTestTags) { Modifier.testTag(key.testTag) }
         ) {
             CompositionLocalProvider(LocalOverscrollFactory provides lastFactory) {
                 scope.content()
@@ -290,6 +290,7 @@
             sharedElementMap = layoutImpl.elements,
             ancestors = ancestors,
             lookaheadScope = layoutImpl.lookaheadScope,
+            implicitTestTags = layoutImpl.implicitTestTags,
         )
     }
 }
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 f625add..8fce708 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
@@ -227,7 +227,7 @@
             to = SceneB,
             transitionLayout = { state ->
                 coroutineScope = rememberCoroutineScope()
-                SceneTransitionLayout(state) {
+                SceneTransitionLayoutForTesting(state) {
                     scene(SceneA) {
                         Box(Modifier.size(layoutSize)) {
                             // Transformed element
@@ -247,7 +247,7 @@
                 rule.runOnUiThread {
                     // We snap to scene B so that the transition A => B is removed from the list of
                     // transitions.
-                    state.snapToScene(SceneB)
+                    state.snapTo(SceneB)
                     state.setTargetScene(SceneC, coroutineScope)
                 }
             }
@@ -633,7 +633,7 @@
 
         val scope =
             rule.setContentAndCreateMainScope {
-                SceneTransitionLayout(state) {
+                SceneTransitionLayoutForTesting(state) {
                     scene(SceneA) { Box(Modifier.element(TestElements.Foo).size(20.dp)) }
                     scene(SceneB) {}
                 }
@@ -674,7 +674,7 @@
             CompositionLocalProvider(
                 LocalOverscrollFactory provides rememberOffsetOverscrollEffectFactory()
             ) {
-                SceneTransitionLayout(state, Modifier.size(layoutWidth, layoutHeight)) {
+                SceneTransitionLayoutForTesting(state, Modifier.size(layoutWidth, layoutHeight)) {
                     scene(key = SceneA, userActions = mapOf(Swipe.Down to SceneB)) {
                         Spacer(Modifier.fillMaxSize())
                     }
@@ -734,7 +734,7 @@
             CompositionLocalProvider(
                 LocalOverscrollFactory provides rememberOffsetOverscrollEffectFactory()
             ) {
-                SceneTransitionLayout(state, Modifier.size(layoutWidth, layoutHeight)) {
+                SceneTransitionLayoutForTesting(state, Modifier.size(layoutWidth, layoutHeight)) {
                     scene(key = SceneA, userActions = mapOf(Swipe.Down to SceneB)) {
                         Spacer(
                             Modifier.overscroll(verticalOverscrollEffect)
@@ -834,7 +834,7 @@
             CompositionLocalProvider(
                 LocalOverscrollFactory provides rememberOffsetOverscrollEffectFactory()
             ) {
-                SceneTransitionLayout(state, Modifier.size(layoutWidth, layoutHeight)) {
+                SceneTransitionLayoutForTesting(state, Modifier.size(layoutWidth, layoutHeight)) {
                     scene(key = SceneA, userActions = mapOf(Swipe.Down to SceneB)) {
                         Spacer(Modifier.fillMaxSize())
                     }
@@ -893,7 +893,7 @@
             CompositionLocalProvider(
                 LocalOverscrollFactory provides rememberOffsetOverscrollEffectFactory()
             ) {
-                SceneTransitionLayout(
+                SceneTransitionLayoutForTesting(
                     state = state,
                     modifier = Modifier.size(layoutWidth, layoutHeight),
                 ) {
@@ -970,7 +970,7 @@
 
         rule.setContent {
             touchSlop = LocalViewConfiguration.current.touchSlop
-            SceneTransitionLayout(
+            SceneTransitionLayoutForTesting(
                 state = state,
                 modifier = Modifier.size(layoutWidth, layoutHeight),
             ) {
@@ -1057,7 +1057,7 @@
         rule.setContent {
             coroutineScope = rememberCoroutineScope()
 
-            SceneTransitionLayout(state) {
+            SceneTransitionLayoutForTesting(state) {
                 scene(SceneA) {
                     Box(Modifier.size(layoutSize)) {
                         Box(
@@ -1374,7 +1374,7 @@
 
         val scope =
             rule.setContentAndCreateMainScope {
-                SceneTransitionLayout(state, Modifier.size(layoutSize)) {
+                SceneTransitionLayoutForTesting(state, Modifier.size(layoutSize)) {
                     scene(SceneA) {
                         Box(Modifier.fillMaxSize()) { Foo(Modifier.align(Alignment.TopStart)) }
                     }
@@ -1742,7 +1742,7 @@
 
         val scope =
             rule.setContentAndCreateMainScope {
-                SceneTransitionLayout(state, Modifier.size(200.dp)) {
+                SceneTransitionLayoutForTesting(state, Modifier.size(200.dp)) {
                     scene(SceneA) { Foo(offset = 0.dp) }
                     scene(SceneB) { Foo(offset = 20.dp) }
                     scene(SceneC) { Foo(offset = 40.dp) }
@@ -1828,7 +1828,7 @@
 
         val scope =
             rule.setContentAndCreateMainScope {
-                SceneTransitionLayout(state) {
+                SceneTransitionLayoutForTesting(state) {
                     scene(SceneB) { Foo(Modifier.offset(40.dp, 60.dp)) }
 
                     // Define A after B so that Foo is placed in A during A <=> B.
@@ -1887,7 +1887,7 @@
 
         val scope =
             rule.setContentAndCreateMainScope {
-                SceneTransitionLayout(state) {
+                SceneTransitionLayoutForTesting(state) {
                     scene(SceneA) { Foo() }
                     scene(SceneB) { Foo(Modifier.offset(40.dp, 60.dp)) }
                 }
diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/OverlayTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/OverlayTest.kt
index 04c762f..98ecb64 100644
--- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/OverlayTest.kt
+++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/OverlayTest.kt
@@ -90,7 +90,7 @@
         lateinit var coroutineScope: CoroutineScope
         rule.setContent {
             coroutineScope = rememberCoroutineScope()
-            SceneTransitionLayout(state, Modifier.size(200.dp)) {
+            SceneTransitionLayoutForTesting(state, Modifier.size(200.dp)) {
                 scene(SceneA) { Box(Modifier.fillMaxSize()) { Foo() } }
                 overlay(OverlayA) { Foo() }
             }
@@ -132,7 +132,7 @@
         lateinit var coroutineScope: CoroutineScope
         rule.setContent {
             coroutineScope = rememberCoroutineScope()
-            SceneTransitionLayout(state, Modifier.size(200.dp)) {
+            SceneTransitionLayoutForTesting(state, Modifier.size(200.dp)) {
                 scene(SceneA) { Box(Modifier.fillMaxSize()) { Foo() } }
                 overlay(OverlayA) { Foo() }
                 overlay(OverlayB) { Foo() }
@@ -230,7 +230,7 @@
         lateinit var coroutineScope: CoroutineScope
         rule.setContent {
             coroutineScope = rememberCoroutineScope()
-            SceneTransitionLayout(state, Modifier.size(200.dp)) {
+            SceneTransitionLayoutForTesting(state, Modifier.size(200.dp)) {
                 scene(SceneA) { Box(Modifier.fillMaxSize()) { MovableBar() } }
                 overlay(OverlayA) { MovableBar() }
                 overlay(OverlayB) { MovableBar() }
@@ -302,7 +302,7 @@
             }
         var alignment by mutableStateOf(Alignment.Center)
         rule.setContent {
-            SceneTransitionLayout(state, Modifier.size(200.dp)) {
+            SceneTransitionLayoutForTesting(state, Modifier.size(200.dp)) {
                 scene(SceneA) { Box(Modifier.fillMaxSize()) { Foo() } }
                 overlay(OverlayA, alignment = alignment) { Foo() }
             }
@@ -761,7 +761,7 @@
         val movableElementChildTag = "movableElementChildTag"
         val scope =
             rule.setContentAndCreateMainScope {
-                SceneTransitionLayout(state) {
+                SceneTransitionLayoutForTesting(state) {
                     scene(SceneA) {
                         MovableElement(key, Modifier) {
                             content { Box(Modifier.testTag(movableElementChildTag).size(100.dp)) }
diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/PredictiveBackHandlerTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/PredictiveBackHandlerTest.kt
index 2bf2358..366b11d 100644
--- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/PredictiveBackHandlerTest.kt
+++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/PredictiveBackHandlerTest.kt
@@ -250,7 +250,7 @@
             }
 
         rule.setContent {
-            SceneTransitionLayout(state, Modifier.size(200.dp)) {
+            SceneTransitionLayoutForTesting(state, Modifier.size(200.dp)) {
                 scene(SceneA) { Box(Modifier.fillMaxSize()) }
                 overlay(OverlayA) { Box(Modifier.fillMaxSize()) }
                 overlay(OverlayB) { Box(Modifier.fillMaxSize()) }
diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutStateTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutStateTest.kt
index 26f3c25..eea6595 100644
--- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutStateTest.kt
+++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutStateTest.kt
@@ -255,7 +255,7 @@
         assertThat(transition).hasCurrentScene(SceneB)
 
         // Snap to C.
-        state.snapToScene(SceneC)
+        state.snapTo(SceneC)
         assertThat(state.transitionState).isIdle()
         assertThat(state.transitionState).hasCurrentScene(SceneC)
     }
@@ -272,7 +272,7 @@
         assertThat(transition).hasToScene(SceneB)
 
         // Snap to C.
-        state.snapToScene(SceneC)
+        state.snapTo(SceneC)
         assertThat(state.transitionState).isIdle()
         assertThat(state.transitionState).hasCurrentScene(SceneC)
     }
@@ -375,7 +375,7 @@
         val job = transition.coroutineScope.launch { awaitCancellation() }
 
         // Force snap state to SceneB to force finish all current transitions.
-        state.snapToScene(SceneB)
+        state.snapTo(SceneB)
         assertThat(state.transitionState).isIdle()
         assertThat(job.isCancelled).isTrue()
     }
@@ -411,7 +411,7 @@
         val state = MutableSceneTransitionLayoutStateForTests(SceneA)
         state.startTransitionImmediately(this, transition(SceneA, SceneB))
         state.startTransitionImmediately(this, transition(SceneB, SceneC))
-        state.snapToScene(SceneC)
+        state.snapTo(SceneC)
 
         assertThat(state.transitionState).isIdle()
         assertThat(state.transitionState).hasCurrentScene(SceneC)
diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutTest.kt
index 3c490ae..5cbc98f 100644
--- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutTest.kt
+++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutTest.kt
@@ -97,7 +97,7 @@
             MutableSceneTransitionLayoutStateForTests(SceneA, EmptyTestTransitions)
         }
 
-        SceneTransitionLayout(state = layoutState, modifier = Modifier.size(LayoutSize)) {
+        SceneTransitionLayoutForTesting(state = layoutState, modifier = Modifier.size(LayoutSize)) {
             scene(SceneA, userActions = mapOf(Back to SceneB)) {
                 Box(Modifier.fillMaxSize()) {
                     SharedFoo(size = 50.dp, childOffset = 0.dp, Modifier.align(Alignment.TopEnd))
@@ -457,9 +457,9 @@
         }
 
         // Snap to B then C to compose these scenes at least once.
-        rule.runOnUiThread { state.snapToScene(SceneB) }
+        rule.runOnUiThread { state.snapTo(SceneB) }
         rule.waitForIdle()
-        rule.runOnUiThread { state.snapToScene(SceneC) }
+        rule.runOnUiThread { state.snapTo(SceneC) }
         rule.waitForIdle()
 
         assertThat(keyInA).isEqualTo(SceneA)
diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SwipeToSceneTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SwipeToSceneTest.kt
index 751b314..11abbbe 100644
--- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SwipeToSceneTest.kt
+++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SwipeToSceneTest.kt
@@ -763,7 +763,7 @@
         var touchSlop = 0f
         rule.setContent {
             touchSlop = LocalViewConfiguration.current.touchSlop
-            SceneTransitionLayout(state, Modifier.size(layoutSize)) {
+            SceneTransitionLayoutForTesting(state, Modifier.size(layoutSize)) {
                 scene(SceneA, userActions = mapOf(Swipe.Start to SceneB, Swipe.End to SceneC)) {
                     Box(Modifier.fillMaxSize())
                 }
@@ -837,7 +837,7 @@
         rule.setContent {
             touchSlop = LocalViewConfiguration.current.touchSlop
             CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
-                SceneTransitionLayout(state, Modifier.size(layoutSize)) {
+                SceneTransitionLayoutForTesting(state, Modifier.size(layoutSize)) {
                     scene(SceneA, userActions = mapOf(Swipe.Start to SceneB, Swipe.End to SceneC)) {
                         Box(Modifier.fillMaxSize())
                     }
diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/transformation/NestedElementTransformationTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/transformation/NestedElementTransformationTest.kt
index bb511bc..8b56892 100644
--- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/transformation/NestedElementTransformationTest.kt
+++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/transformation/NestedElementTransformationTest.kt
@@ -40,7 +40,7 @@
 import com.android.compose.animation.scene.MutableSceneTransitionLayoutStateForTests
 import com.android.compose.animation.scene.Scale
 import com.android.compose.animation.scene.SceneKey
-import com.android.compose.animation.scene.SceneTransitionLayout
+import com.android.compose.animation.scene.SceneTransitionLayoutForTesting
 import com.android.compose.animation.scene.SceneTransitions
 import com.android.compose.animation.scene.TestScenes
 import com.android.compose.animation.scene.testNestedTransition
@@ -114,7 +114,7 @@
         @Composable
         (states: List<MutableSceneTransitionLayoutState>) -> Unit =
         { states ->
-            SceneTransitionLayout(states[0]) {
+            SceneTransitionLayoutForTesting(states[0]) {
                 scene(TestScenes.SceneA, content = { TestElement(elementVariant0A) })
                 scene(
                     TestScenes.SceneB,
diff --git a/packages/SystemUI/compose/scene/tests/utils/src/com/android/compose/animation/scene/TestContentScope.kt b/packages/SystemUI/compose/scene/tests/utils/src/com/android/compose/animation/scene/TestContentScope.kt
index 6d47bab..e56d1be 100644
--- a/packages/SystemUI/compose/scene/tests/utils/src/com/android/compose/animation/scene/TestContentScope.kt
+++ b/packages/SystemUI/compose/scene/tests/utils/src/com/android/compose/animation/scene/TestContentScope.kt
@@ -30,5 +30,7 @@
     content: @Composable ContentScope.() -> Unit,
 ) {
     val state = rememberMutableSceneTransitionLayoutState(currentScene)
-    SceneTransitionLayout(state, modifier) { scene(currentScene, content = content) }
+    SceneTransitionLayout(state, modifier, implicitTestTags = true) {
+        scene(currentScene, content = content)
+    }
 }
diff --git a/packages/SystemUI/compose/scene/tests/utils/src/com/android/compose/animation/scene/TestTransition.kt b/packages/SystemUI/compose/scene/tests/utils/src/com/android/compose/animation/scene/TestTransition.kt
index f94a7ed..a362a37 100644
--- a/packages/SystemUI/compose/scene/tests/utils/src/com/android/compose/animation/scene/TestTransition.kt
+++ b/packages/SystemUI/compose/scene/tests/utils/src/com/android/compose/animation/scene/TestTransition.kt
@@ -137,7 +137,7 @@
         },
         changeState = changeState,
         transitionLayout = { state ->
-            SceneTransitionLayout(state, layoutModifier) {
+            SceneTransitionLayout(state, layoutModifier, implicitTestTags = true) {
                 scene(fromScene, content = fromSceneContent)
                 scene(toScene, content = toSceneContent)
             }
@@ -163,7 +163,7 @@
             )
         },
         transitionLayout = { state ->
-            SceneTransitionLayout(state) {
+            SceneTransitionLayout(state, implicitTestTags = true) {
                 scene(fromScene) { fromSceneContent() }
                 overlay(overlay) { overlayContent() }
             }
@@ -191,7 +191,7 @@
             )
         },
         transitionLayout = { state ->
-            SceneTransitionLayout(state) {
+            SceneTransitionLayout(state, implicitTestTags = true) {
                 scene(toScene) { toSceneContent() }
                 overlay(overlay) { overlayContent() }
             }
@@ -223,7 +223,7 @@
             )
         },
         transitionLayout = { state ->
-            SceneTransitionLayout(state) {
+            SceneTransitionLayout(state, implicitTestTags = true) {
                 scene(currentScene) { currentSceneContent() }
                 overlay(from, alignment = fromAlignment) { fromContent() }
                 overlay(to, alignment = toAlignment) { toContent() }
@@ -273,7 +273,7 @@
                 }
             }
 
-            SceneTransitionLayout(state, layoutModifier) {
+            SceneTransitionLayout(state, layoutModifier, implicitTestTags = true) {
                 scene(fromScene, content = fromSceneContent)
                 scene(toScene, content = toSceneContent)
             }
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextView.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextView.kt
index b9a5f1f..92fa6b5 100644
--- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextView.kt
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextView.kt
@@ -197,43 +197,12 @@
             )
         }
 
-        var expectedWidth: Int
-        var expectedHeight: Int
-
-        if (MeasureSpec.getMode(heightMeasureSpec) == EXACTLY) {
-            // For view which has fixed height, e.g. small clock,
-            // we should always return the size required from parent view
-            expectedHeight = heightMeasureSpec
-        } else {
-            expectedHeight =
-                MeasureSpec.makeMeasureSpec(
-                    if (isSingleDigit()) {
-                        maxSingleDigitHeight
-                    } else {
-                        textBounds.height() + 2 * lockScreenPaint.strokeWidth.toInt()
-                    },
-                    MeasureSpec.getMode(measuredHeightAndState),
-                )
-        }
-
-        if (MeasureSpec.getMode(widthMeasureSpec) == EXACTLY) {
-            expectedWidth = widthMeasureSpec
-        } else {
-            expectedWidth =
-                MeasureSpec.makeMeasureSpec(
-                    if (isSingleDigit()) {
-                        maxSingleDigitWidth
-                    } else {
-                        max(
-                            textBounds.width() + 2 * lockScreenPaint.strokeWidth.toInt(),
-                            MeasureSpec.getSize(measuredWidthAndState),
-                        )
-                    },
-                    MeasureSpec.getMode(measuredWidthAndState),
-                )
-        }
-
-        setMeasuredDimension(expectedWidth, expectedHeight)
+        setInterpolatedViewBounds(
+            getInterpolatedTextBounds(),
+            widthMeasureSpec,
+            heightMeasureSpec,
+            force = true,
+        )
     }
 
     override fun onDraw(canvas: Canvas) {
@@ -359,7 +328,7 @@
             id == R.id.MINUTE_SECOND_DIGIT
     }
 
-    private fun updateInterpolatedTextBounds(): Rect {
+    private fun getInterpolatedTextBounds(): Rect {
         val interpolatedTextBounds = Rect()
         if (textAnimator.animator.animatedFraction != 1.0f && textAnimator.animator.isRunning) {
             interpolatedTextBounds.left =
@@ -399,7 +368,44 @@
         return interpolatedTextBounds
     }
 
-    private fun updateXtranslation(inPoint: Point, interpolatedTextBounds: Rect): Point {
+    private fun setInterpolatedViewBounds(
+        interpBounds: Rect,
+        widthMeasureSpec: Int = measuredWidthAndState,
+        heightMeasureSpec: Int = measuredHeightAndState,
+        force: Boolean = false,
+    ) {
+        val heightMode = MeasureSpec.getMode(heightMeasureSpec)
+        val widthMode = MeasureSpec.getMode(widthMeasureSpec)
+
+        val heightSpec =
+            if (heightMode == EXACTLY) {
+                heightMeasureSpec
+            } else {
+                MeasureSpec.makeMeasureSpec(
+                    if (isSingleDigit()) maxSingleDigitHeight
+                    else interpBounds.height() + 2 * lockScreenPaint.strokeWidth.toInt(),
+                    heightMode,
+                )
+            }
+
+        val widthSpec =
+            if (widthMode == EXACTLY) {
+                widthMeasureSpec
+            } else {
+                MeasureSpec.makeMeasureSpec(
+                    if (isSingleDigit()) maxSingleDigitWidth
+                    else interpBounds.width() + 2 * lockScreenPaint.strokeWidth.toInt(),
+                    widthMode,
+                )
+            }
+
+        if (force || widthSpec != measuredWidthAndState || heightSpec != measuredHeightAndState) {
+            setMeasuredDimension(widthSpec, heightSpec)
+            parent?.requestLayout()
+        }
+    }
+
+    private fun updateXTranslation(inPoint: Point, interpolatedTextBounds: Rect): Point {
         when (horizontalAlignment) {
             HorizontalAlignment.LEFT -> {
                 inPoint.x = lockScreenPaint.strokeWidth.toInt() - interpolatedTextBounds.left
@@ -422,7 +428,9 @@
     // translation of reference point of text
     // used for translation when calling textInterpolator
     private fun getLocalTranslation(): Point {
-        val interpolatedTextBounds = updateInterpolatedTextBounds()
+        val interpolatedTextBounds = getInterpolatedTextBounds()
+        setInterpolatedViewBounds(interpolatedTextBounds)
+
         val localTranslation = Point(0, 0)
         val correctedBaseline = if (baseline != -1) baseline else baselineFromMeasure
         // get the change from current baseline to expected baseline
@@ -452,7 +460,7 @@
             }
         }
 
-        return updateXtranslation(localTranslation, interpolatedTextBounds)
+        return updateXTranslation(localTranslation, interpolatedTextBounds)
     }
 
     fun applyStyles(textStyle: FontTextStyle, aodStyle: FontTextStyle?) {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt
index fe665e6..24b9e84 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt
@@ -84,6 +84,7 @@
 import com.android.systemui.util.mockito.whenever
 import com.android.systemui.util.settings.GlobalSettings
 import com.android.systemui.util.time.FakeSystemClock
+import com.android.systemui.window.domain.interactor.windowRootViewBlurInteractor
 import com.google.common.truth.Truth
 import junit.framework.Assert
 import kotlinx.coroutines.flow.MutableStateFlow
@@ -280,9 +281,9 @@
                 kosmos.keyguardDismissTransitionInteractor,
                 { primaryBouncerInteractor },
                 executor,
-            ) {
-                deviceEntryInteractor
-            }
+                { deviceEntryInteractor },
+                { kosmos.windowRootViewBlurInteractor },
+            )
     }
 
     @Test
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/activity/data/repository/ActivityManagerRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/activity/data/repository/ActivityManagerRepositoryTest.kt
index d6ba98d..441f807 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/activity/data/repository/ActivityManagerRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/activity/data/repository/ActivityManagerRepositoryTest.kt
@@ -31,6 +31,7 @@
 import com.android.systemui.log.core.Logger
 import com.android.systemui.log.logcatLogBuffer
 import com.android.systemui.testKosmos
+import com.android.systemui.util.time.fakeSystemClock
 import com.google.common.truth.Truth.assertThat
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -136,6 +137,118 @@
             assertThat(latest).isFalse()
         }
 
+    @Test
+    fun createAppVisibilityFlow_fetchesInitialValue_trueWithLastVisibleTime() =
+        kosmos.runTest {
+            whenever(activityManager.getUidImportance(THIS_UID)).thenReturn(IMPORTANCE_FOREGROUND)
+            fakeSystemClock.setCurrentTimeMillis(5000)
+
+            val latest by
+                collectLastValue(underTest.createAppVisibilityFlow(THIS_UID, logger, LOG_TAG))
+
+            assertThat(latest!!.isAppCurrentlyVisible).isTrue()
+            assertThat(latest!!.lastAppVisibleTime).isEqualTo(5000)
+        }
+
+    @Test
+    fun createAppVisibilityFlow_fetchesInitialValue_falseWithoutLastVisibleTime() =
+        kosmos.runTest {
+            whenever(activityManager.getUidImportance(THIS_UID)).thenReturn(IMPORTANCE_GONE)
+            fakeSystemClock.setCurrentTimeMillis(5000)
+
+            val latest by
+                collectLastValue(underTest.createAppVisibilityFlow(THIS_UID, logger, LOG_TAG))
+
+            assertThat(latest!!.isAppCurrentlyVisible).isFalse()
+            assertThat(latest!!.lastAppVisibleTime).isNull()
+        }
+
+    @Test
+    fun createAppVisibilityFlow_getsImportanceUpdates_updatesLastVisibleTimeOnlyWhenVisible() =
+        kosmos.runTest {
+            whenever(activityManager.getUidImportance(THIS_UID)).thenReturn(IMPORTANCE_GONE)
+            fakeSystemClock.setCurrentTimeMillis(5000)
+            val latest by
+                collectLastValue(underTest.createAppVisibilityFlow(THIS_UID, logger, LOG_TAG))
+
+            assertThat(latest!!.isAppCurrentlyVisible).isFalse()
+            assertThat(latest!!.lastAppVisibleTime).isNull()
+
+            val listenerCaptor = argumentCaptor<ActivityManager.OnUidImportanceListener>()
+            verify(activityManager).addOnUidImportanceListener(listenerCaptor.capture(), any())
+            val listener = listenerCaptor.firstValue
+
+            // WHEN the app becomes visible
+            fakeSystemClock.setCurrentTimeMillis(7000)
+            listener.onUidImportance(THIS_UID, IMPORTANCE_FOREGROUND)
+
+            // THEN the status and lastAppVisibleTime are updated
+            assertThat(latest!!.isAppCurrentlyVisible).isTrue()
+            assertThat(latest!!.lastAppVisibleTime).isEqualTo(7000)
+
+            // WHEN the app is no longer visible
+            listener.onUidImportance(THIS_UID, IMPORTANCE_TOP_SLEEPING)
+
+            // THEN the lastAppVisibleTime is preserved
+            assertThat(latest!!.isAppCurrentlyVisible).isFalse()
+            assertThat(latest!!.lastAppVisibleTime).isEqualTo(7000)
+
+            // WHEN the app is visible again
+            fakeSystemClock.setCurrentTimeMillis(9000)
+            listener.onUidImportance(THIS_UID, IMPORTANCE_FOREGROUND)
+
+            // THEN the lastAppVisibleTime is updated
+            assertThat(latest!!.isAppCurrentlyVisible).isTrue()
+            assertThat(latest!!.lastAppVisibleTime).isEqualTo(9000)
+        }
+
+    @Test
+    fun createAppVisibilityFlow_ignoresUpdatesForOtherUids() =
+        kosmos.runTest {
+            val latest by
+                collectLastValue(underTest.createAppVisibilityFlow(THIS_UID, logger, LOG_TAG))
+
+            val listenerCaptor = argumentCaptor<ActivityManager.OnUidImportanceListener>()
+            verify(activityManager).addOnUidImportanceListener(listenerCaptor.capture(), any())
+            val listener = listenerCaptor.firstValue
+
+            listener.onUidImportance(THIS_UID, IMPORTANCE_GONE)
+            assertThat(latest!!.isAppCurrentlyVisible).isFalse()
+
+            // WHEN another UID becomes foreground
+            listener.onUidImportance(THIS_UID + 2, IMPORTANCE_FOREGROUND)
+
+            // THEN this UID still stays not visible
+            assertThat(latest!!.isAppCurrentlyVisible).isFalse()
+        }
+
+    @Test
+    fun createAppVisibilityFlow_securityExceptionOnUidRegistration_ok() =
+        kosmos.runTest {
+            whenever(activityManager.getUidImportance(THIS_UID)).thenReturn(IMPORTANCE_GONE)
+            whenever(activityManager.addOnUidImportanceListener(any(), any()))
+                .thenThrow(SecurityException())
+
+            val latest by
+                collectLastValue(underTest.createAppVisibilityFlow(THIS_UID, logger, LOG_TAG))
+
+            // Verify no crash, and we get a value emitted
+            assertThat(latest!!.isAppCurrentlyVisible).isFalse()
+        }
+
+    /** Regression test for b/216248574. */
+    @Test
+    fun createAppVisibilityFlow_getUidImportanceThrowsException_ok() =
+        kosmos.runTest {
+            whenever(activityManager.getUidImportance(any())).thenThrow(SecurityException())
+
+            val latest by
+                collectLastValue(underTest.createAppVisibilityFlow(THIS_UID, logger, LOG_TAG))
+
+            // Verify no crash, and we get a value emitted
+            assertThat(latest!!.isAppCurrentlyVisible).isFalse()
+        }
+
     companion object {
         private const val THIS_UID = 558
         private const val LOG_TAG = "LogTag"
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/back/domain/interactor/BackActionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/back/domain/interactor/BackActionInteractorTest.kt
index 4d238ac..8c5fad3 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/back/domain/interactor/BackActionInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/back/domain/interactor/BackActionInteractorTest.kt
@@ -16,7 +16,6 @@
 
 package com.android.systemui.back.domain.interactor
 
-import android.platform.test.annotations.EnableFlags
 import android.platform.test.annotations.RequiresFlagsDisabled
 import android.platform.test.annotations.RequiresFlagsEnabled
 import android.platform.test.flag.junit.DeviceFlagsValueProvider
@@ -32,7 +31,6 @@
 import com.android.internal.statusbar.IStatusBarService
 import com.android.systemui.Flags
 import com.android.systemui.SysuiTestCase
-import com.android.systemui.communal.domain.interactor.CommunalBackActionInteractor
 import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.kosmos.testScope
@@ -93,7 +91,6 @@
     @Mock private lateinit var onBackInvokedDispatcher: WindowOnBackInvokedDispatcher
     @Mock private lateinit var iStatusBarService: IStatusBarService
     @Mock private lateinit var headsUpManager: HeadsUpManager
-    @Mock private lateinit var communalBackActionInteractor: CommunalBackActionInteractor
 
     private val keyguardRepository = FakeKeyguardRepository()
     private val windowRootViewVisibilityInteractor: WindowRootViewVisibilityInteractor by lazy {
@@ -118,7 +115,6 @@
             windowRootViewVisibilityInteractor,
             shadeBackActionInteractor,
             qsController,
-            communalBackActionInteractor,
         )
     }
 
@@ -297,19 +293,6 @@
         verify(shadeBackActionInteractor).onBackProgressed(0.4f)
     }
 
-    @Test
-    @EnableFlags(Flags.FLAG_GLANCEABLE_HUB_BACK_ACTION)
-    fun onBackAction_communalCanBeDismissed_communalBackActionInteractorCalled() {
-        backActionInteractor.start()
-        windowRootViewVisibilityInteractor.setIsLockscreenOrShadeVisible(true)
-        powerInteractor.setAwakeForTest()
-        val callback = getBackInvokedCallback()
-        whenever(communalBackActionInteractor.canBeDismissed()).thenReturn(true)
-        callback.onBackInvoked()
-
-        verify(communalBackActionInteractor).onBackPressed()
-    }
-
     private fun getBackInvokedCallback(): OnBackInvokedCallback {
         testScope.runCurrent()
         val captor = argumentCaptor<OnBackInvokedCallback>()
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/common/ui/view/SeekBarWithIconButtonsViewTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/common/ui/view/SeekBarWithIconButtonsViewTest.java
index 01baadd..c40c1a3 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/common/ui/view/SeekBarWithIconButtonsViewTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/common/ui/view/SeekBarWithIconButtonsViewTest.java
@@ -130,12 +130,17 @@
     @Test
     public void setProgress_onProgressChangedAndOnUserInteractionFinalized() {
         reset(mOnSeekBarChangeListener);
-        mIconDiscreteSliderLinearLayout.setProgress(1);
+
+        // Trigger the progress changed listener with fromUser but without clicking.
+        // This is similar to what would happen if an accessibility service changed the
+        // progress.
+        mIconDiscreteSliderLinearLayout.getSeekBarChangeListener().onProgressChanged(
+                mIconDiscreteSliderLinearLayout.getSeekbar(), 1, /*fromUser=*/ true);
 
         // If users are changing seekbar progress without touching the seekbar or clicking the
         // buttons, trigger onUserInteractionFinalized.
         verify(mOnSeekBarChangeListener).onProgressChanged(
-                eq(mSeekbar), /* progress= */ eq(1), /* fromUser= */ eq(false));
+                eq(mSeekbar), /* progress= */ eq(1), /* fromUser= */ eq(true));
         verify(mOnSeekBarChangeListener, never()).onStartTrackingTouch(/* seekBar= */ any());
         verify(mOnSeekBarChangeListener, never()).onStopTrackingTouch(/* seekBar= */ any());
         verify(mOnSeekBarChangeListener).onUserInteractionFinalized(
@@ -144,6 +149,22 @@
     }
 
     @Test
+    public void setProgress_onProgressChangedWithoutUserInteractionFinalized() {
+        reset(mOnSeekBarChangeListener);
+        mIconDiscreteSliderLinearLayout.setProgress(1);
+
+        // If seekbar progress changes due to a non-user event, without touching the seekbar or
+        // clicking the buttons, do not trigger onUserInteractionFinalized.
+        verify(mOnSeekBarChangeListener).onProgressChanged(
+                eq(mSeekbar), /* progress= */ eq(1), /* fromUser= */ eq(false));
+        verify(mOnSeekBarChangeListener, never()).onStartTrackingTouch(/* seekBar= */ any());
+        verify(mOnSeekBarChangeListener, never()).onStopTrackingTouch(/* seekBar= */ any());
+        verify(mOnSeekBarChangeListener, never()).onUserInteractionFinalized(
+                /* seekBar= */ any(),
+                eq(OnSeekBarWithIconButtonsChangeListener.ControlUnitType.SLIDER));
+    }
+
+    @Test
     public void setProgressToSeekBarByTouch_onUserInteractionFinalizedAfterTouchEnds() {
         reset(mOnSeekBarChangeListener);
         final SeekBarWithIconButtonsView.SeekBarChangeListener seekBarChangeListener =
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 6f2082b..7051f81 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/CommunalSceneStartableTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/CommunalSceneStartableTest.kt
@@ -24,53 +24,47 @@
 import androidx.test.filters.SmallTest
 import com.android.internal.logging.uiEventLoggerFake
 import com.android.systemui.Flags.FLAG_COMMUNAL_HUB
-import com.android.systemui.Flags.FLAG_COMMUNAL_SCENE_KTF_REFACTOR
+import com.android.systemui.Flags.FLAG_GLANCEABLE_HUB_V2
 import com.android.systemui.Flags.FLAG_SCENE_CONTAINER
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.communal.domain.interactor.communalInteractor
 import com.android.systemui.communal.domain.interactor.communalSceneInteractor
 import com.android.systemui.communal.domain.interactor.communalSettingsInteractor
 import com.android.systemui.communal.domain.interactor.setCommunalAvailable
+import com.android.systemui.communal.domain.interactor.setCommunalV2ConfigEnabled
 import com.android.systemui.communal.shared.log.CommunalUiEvent
 import com.android.systemui.communal.shared.model.CommunalScenes
-import com.android.systemui.communal.shared.model.EditModeState
-import com.android.systemui.coroutines.collectLastValue
-import com.android.systemui.dock.dockManager
-import com.android.systemui.dock.fakeDockManager
 import com.android.systemui.flags.Flags.COMMUNAL_SERVICE_ENABLED
 import com.android.systemui.flags.andSceneContainer
 import com.android.systemui.flags.fakeFeatureFlagsClassic
 import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
-import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
 import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
 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.applicationCoroutineScope
+import com.android.systemui.kosmos.collectLastValue
+import com.android.systemui.kosmos.runTest
 import com.android.systemui.kosmos.testDispatcher
 import com.android.systemui.kosmos.testScope
+import com.android.systemui.kosmos.useUnconfinedTestDispatcher
 import com.android.systemui.scene.domain.interactor.sceneInteractor
 import com.android.systemui.scene.shared.model.Scenes
 import com.android.systemui.statusbar.notificationShadeWindowController
-import com.android.systemui.statusbar.phone.centralSurfaces
-import com.android.systemui.statusbar.phone.centralSurfacesOptional
 import com.android.systemui.testKosmos
 import com.android.systemui.util.settings.fakeSettings
 import com.google.common.truth.Truth.assertThat
+import kotlin.time.Duration
 import kotlin.time.Duration.Companion.milliseconds
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.runBlocking
 import kotlinx.coroutines.test.advanceTimeBy
-import kotlinx.coroutines.test.runCurrent
-import kotlinx.coroutines.test.runTest
 import org.junit.Before
-import org.junit.Ignore
 import org.junit.Test
 import org.junit.runner.RunWith
-import org.mockito.kotlin.whenever
 import platform.test.runner.parameterized.ParameterizedAndroidJunit4
 import platform.test.runner.parameterized.Parameters
 
+@OptIn(ExperimentalCoroutinesApi::class)
 @SmallTest
 @RunWith(ParameterizedAndroidJunit4::class)
 @EnableFlags(FLAG_COMMUNAL_HUB)
@@ -82,7 +76,8 @@
         @JvmStatic
         @Parameters(name = "{0}")
         fun getParams(): List<FlagsParameterization> {
-            return FlagsParameterization.allCombinationsOf().andSceneContainer()
+            return FlagsParameterization.allCombinationsOf(FLAG_GLANCEABLE_HUB_V2)
+                .andSceneContainer()
         }
     }
 
@@ -90,9 +85,22 @@
         mSetFlagsRule.setFlagsParameterization(flags)
     }
 
-    private val kosmos = testKosmos()
+    private val kosmos = testKosmos().useUnconfinedTestDispatcher()
 
-    private lateinit var underTest: CommunalSceneStartable
+    private val Kosmos.underTest by
+        Kosmos.Fixture {
+            CommunalSceneStartable(
+                communalInteractor = communalInteractor,
+                communalSettingsInteractor = communalSettingsInteractor,
+                communalSceneInteractor = communalSceneInteractor,
+                keyguardInteractor = keyguardInteractor,
+                systemSettings = fakeSettings,
+                notificationShadeWindowController = notificationShadeWindowController,
+                bgScope = applicationCoroutineScope,
+                mainDispatcher = testDispatcher,
+                uiEventLogger = uiEventLoggerFake,
+            )
+        }
 
     @Before
     fun setUp() {
@@ -102,646 +110,314 @@
                 SCREEN_TIMEOUT,
                 UserHandle.USER_CURRENT,
             )
-            kosmos.fakeFeatureFlagsClassic.set(COMMUNAL_SERVICE_ENABLED, true)
+            fakeFeatureFlagsClassic.set(COMMUNAL_SERVICE_ENABLED, true)
 
-            underTest =
-                CommunalSceneStartable(
-                        dockManager = dockManager,
-                        communalInteractor = communalInteractor,
-                        communalSettingsInteractor = communalSettingsInteractor,
-                        communalSceneInteractor = communalSceneInteractor,
-                        keyguardTransitionInteractor = keyguardTransitionInteractor,
-                        keyguardInteractor = keyguardInteractor,
-                        systemSettings = fakeSettings,
-                        notificationShadeWindowController = notificationShadeWindowController,
-                        applicationScope = applicationCoroutineScope,
-                        bgScope = applicationCoroutineScope,
-                        mainDispatcher = testDispatcher,
-                        centralSurfacesOpt = centralSurfacesOptional,
-                        uiEventLogger = uiEventLoggerFake,
-                    )
-                    .apply { start() }
+            underTest.start()
 
             // Make communal available so that communalInteractor.desiredScene accurately reflects
             // scene changes instead of just returning Blank.
-            with(kosmos.testScope) {
-                launch { setCommunalAvailable(true) }
-                testScheduler.runCurrent()
-            }
+            runBlocking { setCommunalAvailable(true) }
+            setCommunalV2ConfigEnabled(true)
         }
     }
 
     @Test
-    @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR, FLAG_SCENE_CONTAINER)
-    fun keyguardGoesAway_whenLaunchingEditMode_doNotForceBlankScene() =
-        with(kosmos) {
-            testScope.runTest {
-                val scene by collectLastValue(communalSceneInteractor.currentScene)
-
-                communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
-                assertThat(scene).isEqualTo(CommunalScenes.Communal)
-
-                communalSceneInteractor.setEditModeState(EditModeState.STARTING)
-                fakeKeyguardTransitionRepository.sendTransitionSteps(
-                    from = KeyguardState.PRIMARY_BOUNCER,
-                    to = KeyguardState.GONE,
-                    testScope = this,
-                )
-
-                assertThat(scene).isEqualTo(CommunalScenes.Communal)
-            }
-        }
-
-    @Test
-    @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR, FLAG_SCENE_CONTAINER)
-    fun keyguardGoesAway_whenLaunchingWidget_doNotForceBlankScene() =
-        with(kosmos) {
-            testScope.runTest {
-                val scene by collectLastValue(communalSceneInteractor.currentScene)
-
-                communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
-                assertThat(scene).isEqualTo(CommunalScenes.Communal)
-
-                communalSceneInteractor.setIsLaunchingWidget(true)
-                fakeKeyguardTransitionRepository.sendTransitionSteps(
-                    from = KeyguardState.PRIMARY_BOUNCER,
-                    to = KeyguardState.GONE,
-                    testScope = this,
-                )
-
-                assertThat(scene).isEqualTo(CommunalScenes.Communal)
-            }
-        }
-
-    @Test
-    @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR, FLAG_SCENE_CONTAINER)
-    fun keyguardGoesAway_whenNotLaunchingWidget_forceBlankScene() =
-        with(kosmos) {
-            testScope.runTest {
-                val scene by collectLastValue(communalSceneInteractor.currentScene)
-
-                communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
-                assertThat(scene).isEqualTo(CommunalScenes.Communal)
-
-                communalSceneInteractor.setIsLaunchingWidget(false)
-                fakeKeyguardTransitionRepository.sendTransitionSteps(
-                    from = KeyguardState.PRIMARY_BOUNCER,
-                    to = KeyguardState.GONE,
-                    testScope = this,
-                )
-
-                assertThat(scene).isEqualTo(CommunalScenes.Blank)
-            }
-        }
-
-    @Test
-    @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR, FLAG_SCENE_CONTAINER)
-    fun keyguardGoesAway_whenInEditMode_doesNotChangeScene() =
-        with(kosmos) {
-            testScope.runTest {
-                val scene by collectLastValue(communalSceneInteractor.currentScene)
-                communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
-                assertThat(scene).isEqualTo(CommunalScenes.Communal)
-
-                communalInteractor.setEditModeOpen(true)
-                fakeKeyguardTransitionRepository.sendTransitionSteps(
-                    from = KeyguardState.ALTERNATE_BOUNCER,
-                    to = KeyguardState.GONE,
-                    testScope = this,
-                )
-                // Scene change will be handled in EditWidgetsActivity not here
-                assertThat(scene).isEqualTo(CommunalScenes.Communal)
-            }
-        }
-
-    @Ignore("Ignored until custom animations are implemented in b/322787129")
-    @Test
-    @DisableFlags(FLAG_SCENE_CONTAINER)
-    fun deviceDocked_forceCommunalScene() =
-        with(kosmos) {
-            testScope.runTest {
-                val scene by collectLastValue(communalSceneInteractor.currentScene)
-                assertThat(scene).isEqualTo(CommunalScenes.Blank)
-
-                updateDocked(true)
-                fakeKeyguardTransitionRepository.sendTransitionSteps(
-                    from = KeyguardState.GONE,
-                    to = KeyguardState.LOCKSCREEN,
-                    testScope = this,
-                )
-                assertThat(scene).isEqualTo(CommunalScenes.Communal)
-            }
-        }
-
-    @Test
-    @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR, FLAG_SCENE_CONTAINER)
-    fun occluded_forceBlankScene() =
-        with(kosmos) {
-            testScope.runTest {
-                whenever(centralSurfaces.isLaunchingActivityOverLockscreen).thenReturn(false)
-                val scene by collectLastValue(communalSceneInteractor.currentScene)
-                communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
-                assertThat(scene).isEqualTo(CommunalScenes.Communal)
-
-                updateDocked(true)
-                fakeKeyguardTransitionRepository.sendTransitionSteps(
-                    from = KeyguardState.GLANCEABLE_HUB,
-                    to = KeyguardState.OCCLUDED,
-                    testScope = this,
-                )
-                assertThat(scene).isEqualTo(CommunalScenes.Blank)
-            }
-        }
-
-    @Test
-    @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR, FLAG_SCENE_CONTAINER)
-    fun occluded_doesNotForceBlankSceneIfLaunchingActivityOverLockscreen() =
-        with(kosmos) {
-            testScope.runTest {
-                whenever(centralSurfaces.isLaunchingActivityOverLockscreen).thenReturn(true)
-                val scene by collectLastValue(communalSceneInteractor.currentScene)
-                communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
-                assertThat(scene).isEqualTo(CommunalScenes.Communal)
-
-                updateDocked(true)
-                fakeKeyguardTransitionRepository.sendTransitionSteps(
-                    from = KeyguardState.GLANCEABLE_HUB,
-                    to = KeyguardState.OCCLUDED,
-                    testScope = this,
-                )
-                assertThat(scene).isEqualTo(CommunalScenes.Communal)
-            }
-        }
-
-    @Test
-    @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR, FLAG_SCENE_CONTAINER)
-    fun deviceDocked_doesNotForceCommunalIfTransitioningFromCommunal() =
-        with(kosmos) {
-            testScope.runTest {
-                val scene by collectLastValue(communalSceneInteractor.currentScene)
-                assertThat(scene).isEqualTo(CommunalScenes.Blank)
-
-                updateDocked(true)
-                fakeKeyguardTransitionRepository.sendTransitionSteps(
-                    from = KeyguardState.GLANCEABLE_HUB,
-                    to = KeyguardState.LOCKSCREEN,
-                    testScope = this,
-                )
-                assertThat(scene).isEqualTo(CommunalScenes.Blank)
-            }
-        }
-
-    @Test
-    @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR, FLAG_SCENE_CONTAINER)
-    fun deviceAsleep_forceBlankSceneAfterTimeout() =
-        with(kosmos) {
-            testScope.runTest {
-                val scene by collectLastValue(communalSceneInteractor.currentScene)
-                communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
-                assertThat(scene).isEqualTo(CommunalScenes.Communal)
-
-                fakeKeyguardTransitionRepository.sendTransitionSteps(
-                    from = KeyguardState.GLANCEABLE_HUB,
-                    to = KeyguardState.OFF,
-                    testScope = this,
-                )
-                assertThat(scene).isEqualTo(CommunalScenes.Communal)
-
-                advanceTimeBy(CommunalSceneStartable.AWAKE_DEBOUNCE_DELAY)
-
-                assertThat(scene).isEqualTo(CommunalScenes.Blank)
-            }
-        }
-
-    @Test
-    @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR, FLAG_SCENE_CONTAINER)
-    fun deviceAsleep_wakesUpBeforeTimeout_noChangeInScene() =
-        with(kosmos) {
-            testScope.runTest {
-                val scene by collectLastValue(communalSceneInteractor.currentScene)
-                communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
-                assertThat(scene).isEqualTo(CommunalScenes.Communal)
-
-                fakeKeyguardTransitionRepository.sendTransitionSteps(
-                    from = KeyguardState.GLANCEABLE_HUB,
-                    to = KeyguardState.OFF,
-                    testScope = this,
-                )
-                assertThat(scene).isEqualTo(CommunalScenes.Communal)
-                advanceTimeBy(CommunalSceneStartable.AWAKE_DEBOUNCE_DELAY / 2)
-                assertThat(scene).isEqualTo(CommunalScenes.Communal)
-
-                fakeKeyguardTransitionRepository.sendTransitionSteps(
-                    from = KeyguardState.OFF,
-                    to = KeyguardState.GLANCEABLE_HUB,
-                    testScope = this,
-                )
-
-                advanceTimeBy(CommunalSceneStartable.AWAKE_DEBOUNCE_DELAY)
-                assertThat(scene).isEqualTo(CommunalScenes.Communal)
-            }
-        }
-
-    @Ignore("Ignored until custom animations are implemented in b/322787129")
-    @Test
-    @DisableFlags(FLAG_SCENE_CONTAINER)
-    fun dockingOnLockscreen_forcesCommunal() =
-        with(kosmos) {
-            testScope.runTest {
-                communalSceneInteractor.changeScene(CommunalScenes.Blank, "test")
-                val scene by collectLastValue(communalSceneInteractor.currentScene)
-
-                // device is docked while on the lockscreen
-                fakeKeyguardTransitionRepository.sendTransitionSteps(
-                    from = KeyguardState.GLANCEABLE_HUB,
-                    to = KeyguardState.LOCKSCREEN,
-                    testScope = this,
-                )
-                updateDocked(true)
-
-                assertThat(scene).isEqualTo(CommunalScenes.Blank)
-                advanceTimeBy(CommunalSceneStartable.DOCK_DEBOUNCE_DELAY)
-                assertThat(scene).isEqualTo(CommunalScenes.Communal)
-            }
-        }
-
-    @Ignore("Ignored until custom animations are implemented in b/322787129")
-    @Test
-    @DisableFlags(FLAG_SCENE_CONTAINER)
-    fun dockingOnLockscreen_doesNotForceCommunalIfDreamStarts() =
-        with(kosmos) {
-            testScope.runTest {
-                communalSceneInteractor.changeScene(CommunalScenes.Blank, "test")
-                val scene by collectLastValue(communalSceneInteractor.currentScene)
-
-                // device is docked while on the lockscreen
-                fakeKeyguardTransitionRepository.sendTransitionSteps(
-                    from = KeyguardState.GLANCEABLE_HUB,
-                    to = KeyguardState.LOCKSCREEN,
-                    testScope = this,
-                )
-                updateDocked(true)
-
-                assertThat(scene).isEqualTo(CommunalScenes.Blank)
-                advanceTimeBy(CommunalSceneStartable.DOCK_DEBOUNCE_DELAY / 2)
-                assertThat(scene).isEqualTo(CommunalScenes.Blank)
-
-                // dream starts shortly after docking
-                fakeKeyguardTransitionRepository.sendTransitionSteps(
-                    from = KeyguardState.LOCKSCREEN,
-                    to = KeyguardState.DREAMING,
-                    testScope = this,
-                )
-                advanceTimeBy(CommunalSceneStartable.DOCK_DEBOUNCE_DELAY)
-                assertThat(scene).isEqualTo(CommunalScenes.Blank)
-            }
-        }
-
-    @Test
-    @DisableFlags(FLAG_SCENE_CONTAINER)
+    @DisableFlags(FLAG_SCENE_CONTAINER, FLAG_GLANCEABLE_HUB_V2)
     fun hubTimeout_whenDreaming_goesToBlank() =
-        with(kosmos) {
-            testScope.runTest {
-                // Device is dreaming and on communal.
-                updateDreaming(true)
-                communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
+        kosmos.runTest {
+            // Device is dreaming and on communal.
+            fakeKeyguardRepository.setDreaming(true)
+            communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
 
-                val scene by collectLastValue(communalSceneInteractor.currentScene)
-                assertThat(scene).isEqualTo(CommunalScenes.Communal)
+            val scene by collectLastValue(communalSceneInteractor.currentScene)
+            assertThat(scene).isEqualTo(CommunalScenes.Communal)
 
-                // Scene times out back to blank after the screen timeout.
-                advanceTimeBy(SCREEN_TIMEOUT.milliseconds)
-                assertThat(scene).isEqualTo(CommunalScenes.Blank)
-            }
+            // Scene times out back to blank after the screen timeout.
+            advanceTimeBy(SCREEN_TIMEOUT.milliseconds)
+            assertThat(scene).isEqualTo(CommunalScenes.Blank)
         }
 
     @Test
-    @DisableFlags(FLAG_SCENE_CONTAINER)
+    @DisableFlags(FLAG_SCENE_CONTAINER, FLAG_GLANCEABLE_HUB_V2)
     fun hubTimeout_notDreaming_staysOnCommunal() =
-        with(kosmos) {
-            testScope.runTest {
-                // Device is not dreaming and on communal.
-                updateDreaming(false)
-                communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
+        kosmos.runTest {
+            // Device is not dreaming and on communal.
+            fakeKeyguardRepository.setDreaming(false)
+            communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
 
-                // Scene stays as Communal
-                advanceTimeBy(SCREEN_TIMEOUT.milliseconds)
-                val scene by collectLastValue(communalSceneInteractor.currentScene)
-                assertThat(scene).isEqualTo(CommunalScenes.Communal)
-            }
+            // Scene stays as Communal
+            advanceTimeBy(SCREEN_TIMEOUT.milliseconds)
+            val scene by collectLastValue(communalSceneInteractor.currentScene)
+            assertThat(scene).isEqualTo(CommunalScenes.Communal)
         }
 
     @Test
-    @DisableFlags(FLAG_SCENE_CONTAINER)
+    @DisableFlags(FLAG_SCENE_CONTAINER, FLAG_GLANCEABLE_HUB_V2)
     fun hubTimeout_dreamStopped_staysOnCommunal() =
-        with(kosmos) {
-            testScope.runTest {
-                // Device is dreaming and on communal.
-                updateDreaming(true)
-                communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
+        kosmos.runTest {
+            // Device is dreaming and on communal.
+            fakeKeyguardRepository.setDreaming(true)
+            communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
 
-                val scene by collectLastValue(communalSceneInteractor.currentScene)
-                assertThat(scene).isEqualTo(CommunalScenes.Communal)
+            val scene by collectLastValue(communalSceneInteractor.currentScene)
+            assertThat(scene).isEqualTo(CommunalScenes.Communal)
 
-                // Wait a bit, but not long enough to timeout.
-                advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
-                assertThat(scene).isEqualTo(CommunalScenes.Communal)
+            // Wait a bit, but not long enough to timeout.
+            advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
+            assertThat(scene).isEqualTo(CommunalScenes.Communal)
 
-                // Dream stops, timeout is cancelled and device stays on hub, because the regular
-                // screen timeout will take effect at this point.
-                updateDreaming(false)
-                advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
-                assertThat(scene).isEqualTo(CommunalScenes.Communal)
-            }
+            // Dream stops, timeout is cancelled and device stays on hub, because the regular
+            // screen timeout will take effect at this point.
+            fakeKeyguardRepository.setDreaming(false)
+            advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
+            assertThat(scene).isEqualTo(CommunalScenes.Communal)
         }
 
     @Test
-    @DisableFlags(FLAG_SCENE_CONTAINER)
+    @DisableFlags(FLAG_SCENE_CONTAINER, FLAG_GLANCEABLE_HUB_V2)
     fun hubTimeout_dreamStartedHalfway_goesToCommunal() =
-        with(kosmos) {
-            testScope.runTest {
-                // Device is on communal, but not dreaming.
-                updateDreaming(false)
-                communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
+        kosmos.runTest {
+            // Device is on communal, but not dreaming.
+            fakeKeyguardRepository.setDreaming(false)
+            communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
 
-                val scene by collectLastValue(communalSceneInteractor.currentScene)
-                assertThat(scene).isEqualTo(CommunalScenes.Communal)
+            val scene by collectLastValue(communalSceneInteractor.currentScene)
+            assertThat(scene).isEqualTo(CommunalScenes.Communal)
 
-                // Wait a bit, but not long enough to timeout, then start dreaming.
-                advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
-                updateDreaming(true)
-                assertThat(scene).isEqualTo(CommunalScenes.Communal)
+            // Wait a bit, but not long enough to timeout, then start dreaming.
+            advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
+            fakeKeyguardRepository.setDreaming(true)
+            assertThat(scene).isEqualTo(CommunalScenes.Communal)
 
-                // Device times out after one screen timeout interval, dream doesn't reset timeout.
-                advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
-                assertThat(scene).isEqualTo(CommunalScenes.Blank)
-            }
+            // Device times out after one screen timeout interval, dream doesn't reset timeout.
+            advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
+            assertThat(scene).isEqualTo(CommunalScenes.Blank)
         }
 
     @Test
-    @DisableFlags(FLAG_SCENE_CONTAINER)
+    @DisableFlags(FLAG_SCENE_CONTAINER, FLAG_GLANCEABLE_HUB_V2)
     fun hubTimeout_dreamAfterInitialTimeout_goesToBlank() =
-        with(kosmos) {
-            testScope.runTest {
-                // Device is on communal.
-                communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
+        kosmos.runTest {
+            // Device is on communal.
+            communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
 
-                // Device stays on the hub after the timeout since we're not dreaming.
-                advanceTimeBy(SCREEN_TIMEOUT.milliseconds * 2)
-                val scene by collectLastValue(communalSceneInteractor.currentScene)
-                assertThat(scene).isEqualTo(CommunalScenes.Communal)
+            // Device stays on the hub after the timeout since we're not dreaming.
+            testScope.advanceTimeBy(SCREEN_TIMEOUT.milliseconds * 2)
+            val scene by collectLastValue(communalSceneInteractor.currentScene)
+            assertThat(scene).isEqualTo(CommunalScenes.Communal)
 
-                // Start dreaming.
-                updateDreaming(true)
-                advanceTimeBy(KeyguardInteractor.IS_ABLE_TO_DREAM_DELAY_MS)
+            // Start dreaming.
+            fakeKeyguardRepository.setDreaming(true)
+            advanceTimeBy(KeyguardInteractor.IS_ABLE_TO_DREAM_DELAY_MS.milliseconds)
 
-                // Hub times out immediately.
-                assertThat(scene).isEqualTo(CommunalScenes.Blank)
-            }
+            // Hub times out immediately.
+            assertThat(scene).isEqualTo(CommunalScenes.Blank)
         }
 
     @Test
-    @DisableFlags(FLAG_SCENE_CONTAINER)
+    @DisableFlags(FLAG_SCENE_CONTAINER, FLAG_GLANCEABLE_HUB_V2)
     fun hubTimeout_userActivityTriggered_resetsTimeout() =
-        with(kosmos) {
-            testScope.runTest {
-                // Device is dreaming and on communal.
-                updateDreaming(true)
-                communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
+        kosmos.runTest {
+            // Device is dreaming and on communal.
+            fakeKeyguardRepository.setDreaming(true)
+            communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
 
-                val scene by collectLastValue(communalSceneInteractor.currentScene)
-                assertThat(scene).isEqualTo(CommunalScenes.Communal)
+            val scene by collectLastValue(communalSceneInteractor.currentScene)
+            assertThat(scene).isEqualTo(CommunalScenes.Communal)
 
-                // Wait a bit, but not long enough to timeout.
-                advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
+            // Wait a bit, but not long enough to timeout.
+            advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
 
-                // Send user interaction to reset timeout.
-                communalInteractor.signalUserInteraction()
+            // Send user interaction to reset timeout.
+            communalInteractor.signalUserInteraction()
 
-                // If user activity didn't reset timeout, we would have gone back to Blank by now.
-                advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
-                assertThat(scene).isEqualTo(CommunalScenes.Communal)
+            // If user activity didn't reset timeout, we would have gone back to Blank by now.
+            advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
+            assertThat(scene).isEqualTo(CommunalScenes.Communal)
 
-                // Timeout happens one interval after the user interaction.
-                advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
-                assertThat(scene).isEqualTo(CommunalScenes.Blank)
-            }
+            // Timeout happens one interval after the user interaction.
+            advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
+            assertThat(scene).isEqualTo(CommunalScenes.Blank)
         }
 
     @Test
-    @DisableFlags(FLAG_SCENE_CONTAINER)
+    @DisableFlags(FLAG_SCENE_CONTAINER, FLAG_GLANCEABLE_HUB_V2)
     fun hubTimeout_screenTimeoutChanged() =
-        with(kosmos) {
-            testScope.runTest {
-                fakeSettings.putInt(Settings.System.SCREEN_OFF_TIMEOUT, SCREEN_TIMEOUT * 2)
+        kosmos.runTest {
+            fakeSettings.putInt(Settings.System.SCREEN_OFF_TIMEOUT, SCREEN_TIMEOUT * 2)
 
-                // Device is dreaming and on communal.
-                updateDreaming(true)
-                communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
+            // Device is dreaming and on communal.
+            fakeKeyguardRepository.setDreaming(true)
+            communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
 
-                val scene by collectLastValue(communalSceneInteractor.currentScene)
-                assertThat(scene).isEqualTo(CommunalScenes.Communal)
+            val scene by collectLastValue(communalSceneInteractor.currentScene)
+            assertThat(scene).isEqualTo(CommunalScenes.Communal)
 
-                // Scene times out back to blank after the screen timeout.
-                advanceTimeBy(SCREEN_TIMEOUT.milliseconds)
-                assertThat(scene).isEqualTo(CommunalScenes.Communal)
+            // Scene times out back to blank after the screen timeout.
+            advanceTimeBy(SCREEN_TIMEOUT.milliseconds)
+            assertThat(scene).isEqualTo(CommunalScenes.Communal)
 
-                advanceTimeBy(SCREEN_TIMEOUT.milliseconds)
-                assertThat(scene).isEqualTo(CommunalScenes.Blank)
-                assertThat(uiEventLoggerFake.logs.first().eventId)
-                    .isEqualTo(CommunalUiEvent.COMMUNAL_HUB_TIMEOUT.id)
-                assertThat(uiEventLoggerFake.numLogs()).isEqualTo(1)
-            }
+            advanceTimeBy(SCREEN_TIMEOUT.milliseconds)
+            assertThat(scene).isEqualTo(CommunalScenes.Blank)
+            assertThat(uiEventLoggerFake.logs.first().eventId)
+                .isEqualTo(CommunalUiEvent.COMMUNAL_HUB_TIMEOUT.id)
+            assertThat(uiEventLoggerFake.numLogs()).isEqualTo(1)
         }
 
     @Test
     @EnableFlags(FLAG_SCENE_CONTAINER)
+    @DisableFlags(FLAG_GLANCEABLE_HUB_V2)
     fun hubTimeout_withSceneContainer_whenDreaming_goesToBlank() =
-        with(kosmos) {
-            testScope.runTest {
-                // Device is dreaming and on communal.
-                updateDreaming(true)
-                sceneInteractor.changeScene(Scenes.Communal, "test")
+        kosmos.runTest {
+            // Device is dreaming and on communal.
+            fakeKeyguardRepository.setDreaming(true)
+            sceneInteractor.changeScene(Scenes.Communal, "test")
 
-                val scene by collectLastValue(sceneInteractor.currentScene)
-                assertThat(scene).isEqualTo(Scenes.Communal)
+            val scene by collectLastValue(sceneInteractor.currentScene)
+            assertThat(scene).isEqualTo(Scenes.Communal)
 
-                // Scene times out back to blank after the screen timeout.
-                advanceTimeBy(SCREEN_TIMEOUT.milliseconds)
-                assertThat(scene).isEqualTo(Scenes.Dream)
-            }
+            // Scene times out back to blank after the screen timeout.
+            advanceTimeBy(SCREEN_TIMEOUT.milliseconds)
+            assertThat(scene).isEqualTo(Scenes.Dream)
         }
 
     @Test
     @EnableFlags(FLAG_SCENE_CONTAINER)
+    @DisableFlags(FLAG_GLANCEABLE_HUB_V2)
     fun hubTimeout_withSceneContainer_notDreaming_staysOnCommunal() =
-        with(kosmos) {
-            testScope.runTest {
-                // Device is not dreaming and on communal.
-                updateDreaming(false)
-                sceneInteractor.changeScene(Scenes.Communal, "test")
+        kosmos.runTest {
+            // Device is not dreaming and on communal.
+            fakeKeyguardRepository.setDreaming(false)
+            sceneInteractor.changeScene(Scenes.Communal, "test")
 
-                // Scene stays as Communal
-                advanceTimeBy(SCREEN_TIMEOUT.milliseconds)
-                val scene by collectLastValue(sceneInteractor.currentScene)
-                assertThat(scene).isEqualTo(Scenes.Communal)
-            }
+            // Scene stays as Communal
+            advanceTimeBy(SCREEN_TIMEOUT.milliseconds)
+            val scene by collectLastValue(sceneInteractor.currentScene)
+            assertThat(scene).isEqualTo(Scenes.Communal)
         }
 
     @Test
     @EnableFlags(FLAG_SCENE_CONTAINER)
+    @DisableFlags(FLAG_GLANCEABLE_HUB_V2)
     fun hubTimeout_withSceneContainer_dreamStopped_staysOnCommunal() =
-        with(kosmos) {
-            testScope.runTest {
-                // Device is dreaming and on communal.
-                updateDreaming(true)
-                sceneInteractor.changeScene(Scenes.Communal, "test")
+        kosmos.runTest {
+            // Device is dreaming and on communal.
+            fakeKeyguardRepository.setDreaming(true)
+            sceneInteractor.changeScene(Scenes.Communal, "test")
 
-                val scene by collectLastValue(sceneInteractor.currentScene)
-                assertThat(scene).isEqualTo(Scenes.Communal)
+            val scene by collectLastValue(sceneInteractor.currentScene)
+            assertThat(scene).isEqualTo(Scenes.Communal)
 
-                // Wait a bit, but not long enough to timeout.
-                advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
-                assertThat(scene).isEqualTo(Scenes.Communal)
+            // Wait a bit, but not long enough to timeout.
+            advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
+            assertThat(scene).isEqualTo(Scenes.Communal)
 
-                // Dream stops, timeout is cancelled and device stays on hub, because the regular
-                // screen timeout will take effect at this point.
-                updateDreaming(false)
-                advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
-                assertThat(scene).isEqualTo(Scenes.Communal)
-            }
+            // Dream stops, timeout is cancelled and device stays on hub, because the regular
+            // screen timeout will take effect at this point.
+            fakeKeyguardRepository.setDreaming(false)
+            advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
+            assertThat(scene).isEqualTo(Scenes.Communal)
         }
 
     @Test
     @EnableFlags(FLAG_SCENE_CONTAINER)
+    @DisableFlags(FLAG_GLANCEABLE_HUB_V2)
     fun hubTimeout_withSceneContainer_dreamStartedHalfway_goesToCommunal() =
-        with(kosmos) {
-            testScope.runTest {
-                // Device is on communal, but not dreaming.
-                updateDreaming(false)
-                sceneInteractor.changeScene(Scenes.Communal, "test")
+        kosmos.runTest {
+            // Device is on communal, but not dreaming.
+            fakeKeyguardRepository.setDreaming(false)
+            sceneInteractor.changeScene(Scenes.Communal, "test")
 
-                val scene by collectLastValue(sceneInteractor.currentScene)
-                assertThat(scene).isEqualTo(Scenes.Communal)
+            val scene by collectLastValue(sceneInteractor.currentScene)
+            assertThat(scene).isEqualTo(Scenes.Communal)
 
-                // Wait a bit, but not long enough to timeout, then start dreaming.
-                advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
-                updateDreaming(true)
-                assertThat(scene).isEqualTo(Scenes.Communal)
+            // Wait a bit, but not long enough to timeout, then start dreaming.
+            advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
+            fakeKeyguardRepository.setDreaming(true)
+            assertThat(scene).isEqualTo(Scenes.Communal)
 
-                // Device times out after one screen timeout interval, dream doesn't reset timeout.
-                advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
-                assertThat(scene).isEqualTo(Scenes.Dream)
-            }
+            // Device times out after one screen timeout interval, dream doesn't reset timeout.
+            advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
+            assertThat(scene).isEqualTo(Scenes.Dream)
         }
 
     @Test
     @EnableFlags(FLAG_SCENE_CONTAINER)
+    @DisableFlags(FLAG_GLANCEABLE_HUB_V2)
     fun hubTimeout_withSceneContainer_dreamAfterInitialTimeout_goesToBlank() =
-        with(kosmos) {
-            testScope.runTest {
-                // Device is on communal.
-                sceneInteractor.changeScene(Scenes.Communal, "test")
+        kosmos.runTest {
+            // Device is on communal.
+            sceneInteractor.changeScene(Scenes.Communal, "test")
 
-                // Device stays on the hub after the timeout since we're not dreaming.
-                advanceTimeBy(SCREEN_TIMEOUT.milliseconds * 2)
-                val scene by collectLastValue(sceneInteractor.currentScene)
-                assertThat(scene).isEqualTo(Scenes.Communal)
+            // Device stays on the hub after the timeout since we're not dreaming.
+            advanceTimeBy(SCREEN_TIMEOUT.milliseconds * 2)
+            val scene by collectLastValue(sceneInteractor.currentScene)
+            assertThat(scene).isEqualTo(Scenes.Communal)
 
-                // Start dreaming.
-                updateDreaming(true)
-                advanceTimeBy(KeyguardInteractor.IS_ABLE_TO_DREAM_DELAY_MS)
+            // Start dreaming.
+            fakeKeyguardRepository.setDreaming(true)
+            advanceTimeBy(KeyguardInteractor.IS_ABLE_TO_DREAM_DELAY_MS.milliseconds)
 
-                // Hub times out immediately.
-                assertThat(scene).isEqualTo(Scenes.Dream)
-            }
+            // Hub times out immediately.
+            assertThat(scene).isEqualTo(Scenes.Dream)
         }
 
     @Test
     @EnableFlags(FLAG_SCENE_CONTAINER)
+    @DisableFlags(FLAG_GLANCEABLE_HUB_V2)
     fun hubTimeout_withSceneContainer_userActivityTriggered_resetsTimeout() =
-        with(kosmos) {
-            testScope.runTest {
-                // Device is dreaming and on communal.
-                updateDreaming(true)
-                sceneInteractor.changeScene(Scenes.Communal, "test")
+        kosmos.runTest {
+            // Device is dreaming and on communal.
+            fakeKeyguardRepository.setDreaming(true)
+            sceneInteractor.changeScene(Scenes.Communal, "test")
 
-                val scene by collectLastValue(sceneInteractor.currentScene)
-                assertThat(scene).isEqualTo(Scenes.Communal)
+            val scene by collectLastValue(sceneInteractor.currentScene)
+            assertThat(scene).isEqualTo(Scenes.Communal)
 
-                // Wait a bit, but not long enough to timeout.
-                advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
+            // Wait a bit, but not long enough to timeout.
+            advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
 
-                // Send user interaction to reset timeout.
-                communalInteractor.signalUserInteraction()
+            // Send user interaction to reset timeout.
+            communalInteractor.signalUserInteraction()
 
-                // If user activity didn't reset timeout, we would have gone back to Blank by now.
-                advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
-                assertThat(scene).isEqualTo(Scenes.Communal)
+            // If user activity didn't reset timeout, we would have gone back to Blank by now.
+            advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
+            assertThat(scene).isEqualTo(Scenes.Communal)
 
-                // Timeout happens one interval after the user interaction.
-                advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
-                assertThat(scene).isEqualTo(Scenes.Dream)
-            }
+            // Timeout happens one interval after the user interaction.
+            advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
+            assertThat(scene).isEqualTo(Scenes.Dream)
         }
 
     @Test
     @EnableFlags(FLAG_SCENE_CONTAINER)
+    @DisableFlags(FLAG_GLANCEABLE_HUB_V2)
     fun hubTimeout_withSceneContainer_screenTimeoutChanged() =
-        with(kosmos) {
-            testScope.runTest {
-                fakeSettings.putInt(Settings.System.SCREEN_OFF_TIMEOUT, SCREEN_TIMEOUT * 2)
+        kosmos.runTest {
+            fakeSettings.putInt(Settings.System.SCREEN_OFF_TIMEOUT, SCREEN_TIMEOUT * 2)
 
-                // Device is dreaming and on communal.
-                updateDreaming(true)
-                sceneInteractor.changeScene(Scenes.Communal, "test")
+            // Device is dreaming and on communal.
+            fakeKeyguardRepository.setDreaming(true)
+            sceneInteractor.changeScene(Scenes.Communal, "test")
 
-                val scene by collectLastValue(sceneInteractor.currentScene)
-                assertThat(scene).isEqualTo(Scenes.Communal)
+            val scene by collectLastValue(sceneInteractor.currentScene)
+            assertThat(scene).isEqualTo(Scenes.Communal)
 
-                // Scene times out back to blank after the screen timeout.
-                advanceTimeBy(SCREEN_TIMEOUT.milliseconds)
-                assertThat(scene).isEqualTo(Scenes.Communal)
+            // Scene times out back to blank after the screen timeout.
+            advanceTimeBy(SCREEN_TIMEOUT.milliseconds)
+            assertThat(scene).isEqualTo(Scenes.Communal)
 
-                advanceTimeBy(SCREEN_TIMEOUT.milliseconds)
-                assertThat(scene).isEqualTo(Scenes.Dream)
-                assertThat(uiEventLoggerFake.logs.first().eventId)
-                    .isEqualTo(CommunalUiEvent.COMMUNAL_HUB_TIMEOUT.id)
-                assertThat(uiEventLoggerFake.numLogs()).isEqualTo(1)
-            }
+            advanceTimeBy(SCREEN_TIMEOUT.milliseconds)
+            assertThat(scene).isEqualTo(Scenes.Dream)
+            assertThat(uiEventLoggerFake.logs.first().eventId)
+                .isEqualTo(CommunalUiEvent.COMMUNAL_HUB_TIMEOUT.id)
+            assertThat(uiEventLoggerFake.numLogs()).isEqualTo(1)
         }
 
-    @Test
-    @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR, FLAG_SCENE_CONTAINER)
-    fun transitionFromDozingToGlanceableHub_forcesCommunal() =
-        with(kosmos) {
-            testScope.runTest {
-                val scene by collectLastValue(communalSceneInteractor.currentScene)
-                communalSceneInteractor.changeScene(CommunalScenes.Blank, "test")
-                assertThat(scene).isEqualTo(CommunalScenes.Blank)
-
-                fakeKeyguardTransitionRepository.sendTransitionSteps(
-                    from = KeyguardState.DOZING,
-                    to = KeyguardState.GLANCEABLE_HUB,
-                    testScope = this,
-                )
-
-                assertThat(scene).isEqualTo(CommunalScenes.Communal)
-            }
-        }
-
-    private fun TestScope.updateDocked(docked: Boolean) =
-        with(kosmos) {
-            runCurrent()
-            fakeDockManager.setIsDocked(docked)
-            // TODO(b/322787129): uncomment once custom animations are in place
-            // fakeDockManager.setDockEvent(DockManager.STATE_DOCKED)
-            runCurrent()
-        }
-
-    private fun TestScope.updateDreaming(dreaming: Boolean) =
-        with(kosmos) {
-            fakeKeyguardRepository.setDreaming(dreaming)
-            runCurrent()
-        }
+    /**
+     * Advances time by duration + 1 millisecond, to ensure that tasks scheduled to run at
+     * currentTime + duration are scheduled.
+     */
+    private fun Kosmos.advanceTimeBy(duration: Duration) =
+        testScope.advanceTimeBy(duration + 1.milliseconds)
 }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalBackActionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalBackActionInteractorTest.kt
deleted file mode 100644
index 70f38f7..0000000
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalBackActionInteractorTest.kt
+++ /dev/null
@@ -1,61 +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.communal.domain.interactor
-
-import android.platform.test.annotations.EnableFlags
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.systemui.Flags.FLAG_COMMUNAL_HUB
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.communal.data.repository.communalSceneRepository
-import com.android.systemui.communal.shared.model.CommunalScenes
-import com.android.systemui.kosmos.Kosmos
-import com.android.systemui.kosmos.Kosmos.Fixture
-import com.android.systemui.kosmos.runCurrent
-import com.android.systemui.kosmos.runTest
-import com.android.systemui.testKosmos
-import com.google.common.truth.Truth.assertThat
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class CommunalBackActionInteractorTest : SysuiTestCase() {
-    private val kosmos = testKosmos()
-
-    private var Kosmos.underTest by Fixture { communalBackActionInteractor }
-
-    @Test
-    @EnableFlags(FLAG_COMMUNAL_HUB)
-    fun communalShowing_canBeDismissed() =
-        kosmos.runTest {
-            setCommunalAvailable(true)
-            assertThat(underTest.canBeDismissed()).isEqualTo(false)
-            communalInteractor.changeScene(CommunalScenes.Communal, "test")
-            runCurrent()
-            assertThat(underTest.canBeDismissed()).isEqualTo(true)
-        }
-
-    @Test
-    @EnableFlags(FLAG_COMMUNAL_HUB)
-    fun onBackPressed_invokesSceneChange() =
-        kosmos.runTest {
-            underTest.onBackPressed()
-            runCurrent()
-            assertThat(communalSceneRepository.currentScene.value).isEqualTo(CommunalScenes.Blank)
-        }
-}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalSceneTransitionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalSceneTransitionInteractorTest.kt
index ff722bf..aa96073 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalSceneTransitionInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalSceneTransitionInteractorTest.kt
@@ -22,7 +22,6 @@
 import com.android.compose.animation.scene.ObservableTransitionState
 import com.android.compose.animation.scene.ObservableTransitionState.Idle
 import com.android.systemui.Flags.FLAG_COMMUNAL_HUB
-import com.android.systemui.Flags.FLAG_COMMUNAL_SCENE_KTF_REFACTOR
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.communal.data.repository.communalSceneRepository
 import com.android.systemui.communal.shared.model.CommunalScenes
@@ -64,7 +63,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4::class)
-@EnableFlags(FLAG_COMMUNAL_HUB, FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
+@EnableFlags(FLAG_COMMUNAL_HUB)
 @DisableSceneContainer
 class CommunalSceneTransitionInteractorTest : SysuiTestCase() {
 
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 feee9e3..6eace1b 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
@@ -128,6 +128,19 @@
         }
 
     @Test
+    fun tutorialState_startedAndCommunalSceneShowing_stateWillNotUpdate() =
+        testScope.runTest {
+            val tutorialSettingState by
+                collectLastValue(communalTutorialRepository.tutorialSettingState)
+
+            communalTutorialRepository.setTutorialSettingState(HUB_MODE_TUTORIAL_STARTED)
+
+            goToCommunal()
+
+            assertThat(tutorialSettingState).isEqualTo(HUB_MODE_TUTORIAL_STARTED)
+        }
+
+    @Test
     fun tutorialState_completedAndCommunalSceneShowing_stateWillNotUpdate() =
         testScope.runTest {
             val tutorialSettingState by
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 18cc8bf..f5f5dd8 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
@@ -23,24 +23,19 @@
 import android.content.pm.UserInfo
 import android.provider.Settings
 import android.view.accessibility.AccessibilityEvent
-import android.view.accessibility.AccessibilityManager
 import android.view.accessibility.accessibilityManager
 import android.widget.RemoteViews
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
-import com.android.internal.logging.UiEventLogger
+import com.android.internal.logging.uiEventLogger
+import com.android.internal.logging.uiEventLoggerFake
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.communal.data.model.CommunalSmartspaceTimer
-import com.android.systemui.communal.data.repository.FakeCommunalMediaRepository
-import com.android.systemui.communal.data.repository.FakeCommunalSmartspaceRepository
-import com.android.systemui.communal.data.repository.FakeCommunalTutorialRepository
-import com.android.systemui.communal.data.repository.FakeCommunalWidgetRepository
 import com.android.systemui.communal.data.repository.fakeCommunalMediaRepository
 import com.android.systemui.communal.data.repository.fakeCommunalSmartspaceRepository
 import com.android.systemui.communal.data.repository.fakeCommunalTutorialRepository
 import com.android.systemui.communal.data.repository.fakeCommunalWidgetRepository
 import com.android.systemui.communal.domain.interactor.CommunalInteractor
-import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor
 import com.android.systemui.communal.domain.interactor.communalInteractor
 import com.android.systemui.communal.domain.interactor.communalSceneInteractor
 import com.android.systemui.communal.domain.interactor.communalSettingsInteractor
@@ -49,12 +44,15 @@
 import com.android.systemui.communal.shared.log.CommunalUiEvent
 import com.android.systemui.communal.shared.model.EditModeState
 import com.android.systemui.communal.ui.viewmodel.CommunalEditModeViewModel
-import com.android.systemui.coroutines.collectLastValue
 import com.android.systemui.flags.Flags
 import com.android.systemui.flags.fakeFeatureFlagsClassic
 import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.collectLastValue
+import com.android.systemui.kosmos.runTest
 import com.android.systemui.kosmos.testDispatcher
 import com.android.systemui.kosmos.testScope
+import com.android.systemui.kosmos.useUnconfinedTestDispatcher
 import com.android.systemui.log.logcatLogBuffer
 import com.android.systemui.media.controls.ui.controller.mediaCarouselController
 import com.android.systemui.media.controls.ui.view.MediaHost
@@ -62,73 +60,45 @@
 import com.android.systemui.testKosmos
 import com.android.systemui.user.data.repository.fakeUserRepository
 import com.google.common.truth.Truth.assertThat
+import kotlin.time.Duration.Companion.milliseconds
+import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.test.advanceTimeBy
-import kotlinx.coroutines.test.runTest
 import org.junit.Assert.assertFalse
 import org.junit.Assert.assertTrue
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
-import org.mockito.Mock
 import org.mockito.Mockito
 import org.mockito.Mockito.never
 import org.mockito.Mockito.verify
-import org.mockito.MockitoAnnotations
 import org.mockito.kotlin.any
 import org.mockito.kotlin.argumentCaptor
-import org.mockito.kotlin.eq
 import org.mockito.kotlin.mock
-import org.mockito.kotlin.spy
 import org.mockito.kotlin.whenever
 
+@OptIn(ExperimentalCoroutinesApi::class)
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class CommunalEditModeViewModelTest : SysuiTestCase() {
-    @Mock private lateinit var mediaHost: MediaHost
-    @Mock private lateinit var uiEventLogger: UiEventLogger
-    @Mock private lateinit var packageManager: PackageManager
-    @Mock private lateinit var metricsLogger: CommunalMetricsLogger
-
-    private val kosmos = testKosmos()
-    private val testScope = kosmos.testScope
-
-    private lateinit var tutorialRepository: FakeCommunalTutorialRepository
-    private lateinit var widgetRepository: FakeCommunalWidgetRepository
-    private lateinit var smartspaceRepository: FakeCommunalSmartspaceRepository
-    private lateinit var mediaRepository: FakeCommunalMediaRepository
-    private lateinit var communalSceneInteractor: CommunalSceneInteractor
-    private lateinit var communalInteractor: CommunalInteractor
-    private lateinit var accessibilityManager: AccessibilityManager
+    private val kosmos = testKosmos().useUnconfinedTestDispatcher()
 
     private val testableResources = context.orCreateTestableResources
 
-    private lateinit var underTest: CommunalEditModeViewModel
+    private val Kosmos.packageManager by Kosmos.Fixture { mock<PackageManager>() }
 
-    @Before
-    fun setUp() {
-        MockitoAnnotations.initMocks(this)
+    private val Kosmos.metricsLogger by Kosmos.Fixture { mock<CommunalMetricsLogger>() }
 
-        tutorialRepository = kosmos.fakeCommunalTutorialRepository
-        widgetRepository = kosmos.fakeCommunalWidgetRepository
-        smartspaceRepository = kosmos.fakeCommunalSmartspaceRepository
-        mediaRepository = kosmos.fakeCommunalMediaRepository
-        communalSceneInteractor = kosmos.communalSceneInteractor
-        communalInteractor = spy(kosmos.communalInteractor)
-        kosmos.fakeUserRepository.setUserInfos(listOf(MAIN_USER_INFO))
-        kosmos.fakeUserTracker.set(userInfos = listOf(MAIN_USER_INFO), selectedUserIndex = 0)
-        kosmos.fakeFeatureFlagsClassic.set(Flags.COMMUNAL_SERVICE_ENABLED, true)
-        accessibilityManager = kosmos.accessibilityManager
-
-        underTest =
+    private val Kosmos.underTest by
+        Kosmos.Fixture {
             CommunalEditModeViewModel(
                 communalSceneInteractor,
                 communalInteractor,
-                kosmos.communalSettingsInteractor,
-                kosmos.keyguardTransitionInteractor,
-                mediaHost,
+                communalSettingsInteractor,
+                keyguardTransitionInteractor,
+                mock<MediaHost>(),
                 uiEventLogger,
                 logcatLogBuffer("CommunalEditModeViewModelTest"),
-                kosmos.testDispatcher,
+                testDispatcher,
                 metricsLogger,
                 context,
                 accessibilityManager,
@@ -136,19 +106,28 @@
                 WIDGET_PICKER_PACKAGE_NAME,
                 kosmos.mediaCarouselController,
             )
+        }
+
+    @Before
+    fun setUp() {
+        kosmos.fakeUserRepository.setUserInfos(listOf(MAIN_USER_INFO))
+        kosmos.fakeUserTracker.set(userInfos = listOf(MAIN_USER_INFO), selectedUserIndex = 0)
+        kosmos.fakeFeatureFlagsClassic.set(Flags.COMMUNAL_SERVICE_ENABLED, true)
     }
 
     @Test
     fun communalContent_onlyWidgetsAndCtaTileAreShownInEditMode() =
-        testScope.runTest {
-            tutorialRepository.setTutorialSettingState(Settings.Secure.HUB_MODE_TUTORIAL_COMPLETED)
+        kosmos.runTest {
+            fakeCommunalTutorialRepository.setTutorialSettingState(
+                Settings.Secure.HUB_MODE_TUTORIAL_COMPLETED
+            )
 
             // Widgets available.
-            widgetRepository.addWidget(appWidgetId = 0, rank = 30)
-            widgetRepository.addWidget(appWidgetId = 1, rank = 20)
+            fakeCommunalWidgetRepository.addWidget(appWidgetId = 0, rank = 30)
+            fakeCommunalWidgetRepository.addWidget(appWidgetId = 1, rank = 20)
 
             // Smartspace available.
-            smartspaceRepository.setTimers(
+            fakeCommunalSmartspaceRepository.setTimers(
                 listOf(
                     CommunalSmartspaceTimer(
                         smartspaceTargetId = "target",
@@ -159,7 +138,7 @@
             )
 
             // Media playing.
-            mediaRepository.mediaActive()
+            fakeCommunalMediaRepository.mediaActive()
 
             val communalContent by collectLastValue(underTest.communalContent)
 
@@ -173,7 +152,7 @@
 
     @Test
     fun selectedKey_onReorderWidgets_isSet() =
-        testScope.runTest {
+        kosmos.runTest {
             val selectedKey by collectLastValue(underTest.selectedKey)
 
             underTest.setSelectedKey(null)
@@ -186,7 +165,7 @@
 
     @Test
     fun isCommunalContentVisible_isTrue_whenEditModeShowing() =
-        testScope.runTest {
+        kosmos.runTest {
             val isCommunalContentVisible by collectLastValue(underTest.isCommunalContentVisible)
             communalSceneInteractor.setEditModeState(EditModeState.SHOWING)
             assertThat(isCommunalContentVisible).isEqualTo(true)
@@ -194,7 +173,7 @@
 
     @Test
     fun isCommunalContentVisible_isFalse_whenEditModeNotShowing() =
-        testScope.runTest {
+        kosmos.runTest {
             val isCommunalContentVisible by collectLastValue(underTest.isCommunalContentVisible)
             communalSceneInteractor.setEditModeState(null)
             assertThat(isCommunalContentVisible).isEqualTo(false)
@@ -202,12 +181,14 @@
 
     @Test
     fun deleteWidget() =
-        testScope.runTest {
-            tutorialRepository.setTutorialSettingState(Settings.Secure.HUB_MODE_TUTORIAL_COMPLETED)
+        kosmos.runTest {
+            fakeCommunalTutorialRepository.setTutorialSettingState(
+                Settings.Secure.HUB_MODE_TUTORIAL_COMPLETED
+            )
 
             // Widgets available.
-            widgetRepository.addWidget(appWidgetId = 0, rank = 30)
-            widgetRepository.addWidget(appWidgetId = 1, rank = 20)
+            fakeCommunalWidgetRepository.addWidget(appWidgetId = 0, rank = 30)
+            fakeCommunalWidgetRepository.addWidget(appWidgetId = 1, rank = 20)
 
             val communalContent by collectLastValue(underTest.communalContent)
 
@@ -220,6 +201,7 @@
 
             underTest.onDeleteWidget(
                 id = 0,
+                key = "key_0",
                 componentName = ComponentName("test_package", "test_class"),
                 rank = 30,
             )
@@ -233,26 +215,56 @@
         }
 
     @Test
-    fun reorderWidget_uiEventLogging_start() {
-        underTest.onReorderWidgetStart(CommunalContentModel.KEY.widget(123))
-        verify(uiEventLogger).log(CommunalUiEvent.COMMUNAL_HUB_REORDER_WIDGET_START)
-    }
+    fun deleteWidget_clearsSelectedKey() =
+        kosmos.runTest {
+            val selectedKey by collectLastValue(underTest.selectedKey)
+            underTest.setSelectedKey("test_key")
+            assertThat(selectedKey).isEqualTo("test_key")
+
+            // Selected key is deleted.
+            underTest.onDeleteWidget(
+                id = 0,
+                key = "test_key",
+                componentName = ComponentName("test_package", "test_class"),
+                rank = 30,
+            )
+
+            assertThat(selectedKey).isNull()
+        }
 
     @Test
-    fun reorderWidget_uiEventLogging_end() {
-        underTest.onReorderWidgetEnd()
-        verify(uiEventLogger).log(CommunalUiEvent.COMMUNAL_HUB_REORDER_WIDGET_FINISH)
-    }
+    fun reorderWidget_uiEventLogging_start() =
+        kosmos.runTest {
+            underTest.onReorderWidgetStart(CommunalContentModel.KEY.widget(123))
+
+            assertThat(uiEventLoggerFake.numLogs()).isEqualTo(1)
+            assertThat(uiEventLoggerFake.logs[0].eventId)
+                .isEqualTo(CommunalUiEvent.COMMUNAL_HUB_REORDER_WIDGET_START.id)
+        }
 
     @Test
-    fun reorderWidget_uiEventLogging_cancel() {
-        underTest.onReorderWidgetCancel()
-        verify(uiEventLogger).log(CommunalUiEvent.COMMUNAL_HUB_REORDER_WIDGET_CANCEL)
-    }
+    fun reorderWidget_uiEventLogging_end() =
+        kosmos.runTest {
+            underTest.onReorderWidgetEnd()
+
+            assertThat(uiEventLoggerFake.numLogs()).isEqualTo(1)
+            assertThat(uiEventLoggerFake.logs[0].eventId)
+                .isEqualTo(CommunalUiEvent.COMMUNAL_HUB_REORDER_WIDGET_FINISH.id)
+        }
+
+    @Test
+    fun reorderWidget_uiEventLogging_cancel() =
+        kosmos.runTest {
+            underTest.onReorderWidgetCancel()
+
+            assertThat(uiEventLoggerFake.numLogs()).isEqualTo(1)
+            assertThat(uiEventLoggerFake.logs[0].eventId)
+                .isEqualTo(CommunalUiEvent.COMMUNAL_HUB_REORDER_WIDGET_CANCEL.id)
+        }
 
     @Test
     fun onOpenWidgetPicker_launchesWidgetPickerActivity() {
-        testScope.runTest {
+        kosmos.runTest {
             var activityStarted = false
             val success =
                 underTest.onOpenWidgetPicker(testableResources.resources) { _ ->
@@ -266,7 +278,7 @@
 
     @Test
     fun onOpenWidgetPicker_activityLaunchThrowsException_failure() {
-        testScope.runTest {
+        kosmos.runTest {
             val success =
                 underTest.onOpenWidgetPicker(testableResources.resources) { _ ->
                     run { throw ActivityNotFoundException() }
@@ -278,7 +290,7 @@
 
     @Test
     fun showDisclaimer_trueAfterEditModeShowing() =
-        testScope.runTest {
+        kosmos.runTest {
             val showDisclaimer by collectLastValue(underTest.showDisclaimer)
 
             assertThat(showDisclaimer).isFalse()
@@ -288,9 +300,9 @@
 
     @Test
     fun showDisclaimer_falseWhenDismissed() =
-        testScope.runTest {
+        kosmos.runTest {
             underTest.setEditModeState(EditModeState.SHOWING)
-            kosmos.fakeUserRepository.setSelectedUserInfo(MAIN_USER_INFO)
+            fakeUserRepository.setSelectedUserInfo(MAIN_USER_INFO)
 
             val showDisclaimer by collectLastValue(underTest.showDisclaimer)
 
@@ -301,63 +313,67 @@
 
     @Test
     fun showDisclaimer_trueWhenTimeout() =
-        testScope.runTest {
+        kosmos.runTest {
             underTest.setEditModeState(EditModeState.SHOWING)
-            kosmos.fakeUserRepository.setSelectedUserInfo(MAIN_USER_INFO)
+            fakeUserRepository.setSelectedUserInfo(MAIN_USER_INFO)
 
             val showDisclaimer by collectLastValue(underTest.showDisclaimer)
 
             assertThat(showDisclaimer).isTrue()
             underTest.onDisclaimerDismissed()
             assertThat(showDisclaimer).isFalse()
-            advanceTimeBy(CommunalInteractor.DISCLAIMER_RESET_MILLIS)
+            testScope.advanceTimeBy(CommunalInteractor.DISCLAIMER_RESET_MILLIS + 1.milliseconds)
             assertThat(showDisclaimer).isTrue()
         }
 
     @Test
-    fun scrollPosition_persistedOnEditCleanup() {
-        val index = 2
-        val offset = 30
-        underTest.onScrollPositionUpdated(index, offset)
-        underTest.cleanupEditModeState()
+    fun scrollPosition_persistedOnEditCleanup() =
+        kosmos.runTest {
+            val index = 2
+            val offset = 30
+            underTest.onScrollPositionUpdated(index, offset)
+            underTest.cleanupEditModeState()
 
-        verify(communalInteractor).setScrollPosition(eq(index), eq(offset))
-    }
+            assertThat(communalInteractor.firstVisibleItemIndex).isEqualTo(index)
+            assertThat(communalInteractor.firstVisibleItemOffset).isEqualTo(offset)
+        }
 
     @Test
-    fun onNewWidgetAdded_accessibilityDisabled_doNothing() {
-        whenever(accessibilityManager.isEnabled).thenReturn(false)
+    fun onNewWidgetAdded_accessibilityDisabled_doNothing() =
+        kosmos.runTest {
+            whenever(accessibilityManager.isEnabled).thenReturn(false)
 
-        val provider =
-            mock<AppWidgetProviderInfo> {
-                on { loadLabel(packageManager) }.thenReturn("Test Clock")
-            }
-        underTest.onNewWidgetAdded(provider)
+            val provider =
+                mock<AppWidgetProviderInfo> {
+                    on { loadLabel(packageManager) }.thenReturn("Test Clock")
+                }
+            underTest.onNewWidgetAdded(provider)
 
-        verify(accessibilityManager, never()).sendAccessibilityEvent(any())
-    }
+            verify(accessibilityManager, never()).sendAccessibilityEvent(any())
+        }
 
     @Test
-    fun onNewWidgetAdded_accessibilityEnabled_sendAccessibilityAnnouncement() {
-        whenever(accessibilityManager.isEnabled).thenReturn(true)
+    fun onNewWidgetAdded_accessibilityEnabled_sendAccessibilityAnnouncement() =
+        kosmos.runTest {
+            whenever(accessibilityManager.isEnabled).thenReturn(true)
 
-        val provider =
-            mock<AppWidgetProviderInfo> {
-                on { loadLabel(packageManager) }.thenReturn("Test Clock")
-            }
-        underTest.onNewWidgetAdded(provider)
+            val provider =
+                mock<AppWidgetProviderInfo> {
+                    on { loadLabel(packageManager) }.thenReturn("Test Clock")
+                }
+            underTest.onNewWidgetAdded(provider)
 
-        val captor = argumentCaptor<AccessibilityEvent>()
-        verify(accessibilityManager).sendAccessibilityEvent(captor.capture())
+            val captor = argumentCaptor<AccessibilityEvent>()
+            verify(accessibilityManager).sendAccessibilityEvent(captor.capture())
 
-        val event = captor.firstValue
-        assertThat(event.eventType).isEqualTo(AccessibilityEvent.TYPE_ANNOUNCEMENT)
-        assertThat(event.contentDescription).isEqualTo("Test Clock widget added to lock screen")
-    }
+            val event = captor.firstValue
+            assertThat(event.eventType).isEqualTo(AccessibilityEvent.TYPE_ANNOUNCEMENT)
+            assertThat(event.contentDescription).isEqualTo("Test Clock widget added to lock screen")
+        }
 
     @Test
     fun onResizeWidget_logsMetrics() =
-        testScope.runTest {
+        kosmos.runTest {
             val appWidgetId = 123
             val spanY = 2
             val widgetIdToRankMap = mapOf(appWidgetId to 1)
@@ -372,7 +388,6 @@
                 rank = rank,
             )
 
-            verify(communalInteractor).resizeWidget(appWidgetId, spanY, widgetIdToRankMap)
             verify(metricsLogger)
                 .logResizeWidget(
                     componentName = componentName.flattenToString(),
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 8515515..799054a 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
@@ -78,6 +78,7 @@
 import com.android.systemui.log.logcatLogBuffer
 import com.android.systemui.media.controls.ui.controller.MediaHierarchyManager
 import com.android.systemui.media.controls.ui.controller.mediaCarouselController
+import com.android.systemui.media.controls.ui.view.MediaCarouselScrollHandler
 import com.android.systemui.media.controls.ui.view.MediaHost
 import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAwakeForTest
 import com.android.systemui.power.domain.interactor.powerInteractor
@@ -120,6 +121,7 @@
 @RunWith(ParameterizedAndroidJunit4::class)
 class CommunalViewModelTest(flags: FlagsParameterization) : SysuiTestCase() {
     @Mock private lateinit var mediaHost: MediaHost
+    @Mock private lateinit var mediaCarouselScrollHandler: MediaCarouselScrollHandler
     @Mock private lateinit var metricsLogger: CommunalMetricsLogger
 
     private val kosmos = testKosmos()
@@ -161,6 +163,8 @@
 
         kosmos.fakeUserTracker.set(userInfos = listOf(MAIN_USER_INFO), selectedUserIndex = 0)
         whenever(mediaHost.visible).thenReturn(true)
+        whenever(kosmos.mediaCarouselController.mediaCarouselScrollHandler)
+            .thenReturn(mediaCarouselScrollHandler)
 
         kosmos.powerInteractor.setAwakeForTest()
 
@@ -187,6 +191,7 @@
             metricsLogger,
             kosmos.mediaCarouselController,
             kosmos.blurConfig,
+            false,
         )
     }
 
@@ -903,6 +908,20 @@
         }
 
     @Test
+    fun onShowPreviousMedia_scrollHandler_isCalled() =
+        testScope.runTest {
+            underTest.onShowPreviousMedia()
+            verify(mediaCarouselScrollHandler).scrollByStep(-1)
+        }
+
+    @Test
+    fun onShowNextMedia_scrollHandler_isCalled() =
+        testScope.runTest {
+            underTest.onShowNextMedia()
+            verify(mediaCarouselScrollHandler).scrollByStep(1)
+        }
+
+    @Test
     @EnableFlags(FLAG_BOUNCER_UI_REVAMP)
     fun uiIsBlurred_whenPrimaryBouncerIsShowing() =
         testScope.runTest {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/inputdevice/tutorial/domain/interactor/TutorialNotificationCoordinatorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/inputdevice/tutorial/domain/interactor/TutorialNotificationCoordinatorTest.kt
index e0082da..ff5fa39 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/inputdevice/tutorial/domain/interactor/TutorialNotificationCoordinatorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/inputdevice/tutorial/domain/interactor/TutorialNotificationCoordinatorTest.kt
@@ -18,6 +18,7 @@
 
 import android.app.Notification
 import android.app.NotificationManager
+import android.service.notification.StatusBarNotification
 import androidx.annotation.StringRes
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
@@ -28,6 +29,7 @@
 import com.android.systemui.keyboard.data.repository.FakeKeyboardRepository
 import com.android.systemui.kosmos.backgroundScope
 import com.android.systemui.kosmos.testScope
+import com.android.systemui.kosmos.useUnconfinedTestDispatcher
 import com.android.systemui.res.R
 import com.android.systemui.settings.userTracker
 import com.android.systemui.statusbar.commandline.commandRegistry
@@ -35,6 +37,7 @@
 import com.android.systemui.touchpad.data.repository.FakeTouchpadRepository
 import com.google.common.truth.Truth.assertThat
 import kotlin.time.Duration.Companion.hours
+import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.test.advanceTimeBy
 import kotlinx.coroutines.test.runTest
 import org.junit.Before
@@ -44,23 +47,29 @@
 import org.mockito.ArgumentCaptor
 import org.mockito.Captor
 import org.mockito.Mock
+import org.mockito.Mockito.times
 import org.mockito.junit.MockitoJUnit
 import org.mockito.kotlin.any
 import org.mockito.kotlin.eq
+import org.mockito.kotlin.firstValue
 import org.mockito.kotlin.never
+import org.mockito.kotlin.secondValue
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
+@OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class)
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class TutorialNotificationCoordinatorTest : SysuiTestCase() {
 
     private lateinit var underTest: TutorialNotificationCoordinator
-    private val kosmos = testKosmos()
+    private val kosmos = testKosmos().useUnconfinedTestDispatcher()
     private val testScope = kosmos.testScope
     private val keyboardRepository = FakeKeyboardRepository()
     private val touchpadRepository = FakeTouchpadRepository()
     private lateinit var repository: TutorialSchedulerRepository
     @Mock private lateinit var notificationManager: NotificationManager
+    @Mock private lateinit var notification: StatusBarNotification
     @Captor private lateinit var notificationCaptor: ArgumentCaptor<Notification>
     @get:Rule val rule = MockitoJUnit.rule()
 
@@ -107,6 +116,7 @@
     fun showTouchpadNotification() = runTestAndClear {
         touchpadRepository.setIsAnyTouchpadConnected(true)
         testScope.advanceTimeBy(LAUNCH_DELAY)
+        mockExistingNotification()
         verifyNotification(
             R.string.launch_touchpad_tutorial_notification_title,
             R.string.launch_touchpad_tutorial_notification_content,
@@ -131,6 +141,45 @@
             .notifyAsUser(eq(TAG), eq(NOTIFICATION_ID), any(), any())
     }
 
+    @Test
+    fun showKeyboardNotificationThenDisconnectKeyboard() = runTestAndClear {
+        keyboardRepository.setIsAnyKeyboardConnected(true)
+        testScope.advanceTimeBy(LAUNCH_DELAY)
+        verifyNotification(
+            R.string.launch_keyboard_tutorial_notification_title,
+            R.string.launch_keyboard_tutorial_notification_content,
+        )
+        mockExistingNotification()
+
+        // After the keyboard is disconnected, i.e. there is nothing connected, the notification
+        // should be cancelled
+        keyboardRepository.setIsAnyKeyboardConnected(false)
+        verify(notificationManager).cancelAsUser(eq(TAG), eq(NOTIFICATION_ID), any())
+    }
+
+    @Test
+    fun showKeyboardTouchpadNotificationThenDisconnectKeyboard() = runTestAndClear {
+        keyboardRepository.setIsAnyKeyboardConnected(true)
+        touchpadRepository.setIsAnyTouchpadConnected(true)
+        testScope.advanceTimeBy(LAUNCH_DELAY)
+        mockExistingNotification()
+        keyboardRepository.setIsAnyKeyboardConnected(false)
+
+        verify(notificationManager, times(2))
+            .notifyAsUser(eq(TAG), eq(NOTIFICATION_ID), notificationCaptor.capture(), any())
+        // Connect both device and the first notification is for both
+        notificationCaptor.firstValue.verify(
+            R.string.launch_keyboard_touchpad_tutorial_notification_title,
+            R.string.launch_keyboard_touchpad_tutorial_notification_content,
+        )
+        // After the keyboard is disconnected, i.e. with only the touchpad left, the notification
+        // should be update to the one for only touchpad
+        notificationCaptor.secondValue.verify(
+            R.string.launch_touchpad_tutorial_notification_title,
+            R.string.launch_touchpad_tutorial_notification_content,
+        )
+    }
+
     private fun runTestAndClear(block: suspend () -> Unit) =
         testScope.runTest {
             try {
@@ -140,12 +189,21 @@
             }
         }
 
+    // Assume that there's an existing notification when the updater checks activeNotifications
+    private fun mockExistingNotification() {
+        whenever(notification.id).thenReturn(NOTIFICATION_ID)
+        whenever(notificationManager.activeNotifications).thenReturn(arrayOf(notification))
+    }
+
     private fun verifyNotification(@StringRes titleResId: Int, @StringRes contentResId: Int) {
         verify(notificationManager)
             .notifyAsUser(eq(TAG), eq(NOTIFICATION_ID), notificationCaptor.capture(), any())
-        val notification = notificationCaptor.value
-        val actualTitle = notification.getString(Notification.EXTRA_TITLE)
-        val actualContent = notification.getString(Notification.EXTRA_TEXT)
+        notificationCaptor.value.verify(titleResId, contentResId)
+    }
+
+    private fun Notification.verify(@StringRes titleResId: Int, @StringRes contentResId: Int) {
+        val actualTitle = getString(Notification.EXTRA_TITLE)
+        val actualContent = getString(Notification.EXTRA_TEXT)
         assertThat(actualTitle).isEqualTo(context.getString(titleResId))
         assertThat(actualContent).isEqualTo(context.getString(contentResId))
     }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractorTest.kt
index 2feabf8..63229db 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractorTest.kt
@@ -34,23 +34,32 @@
 
 import android.platform.test.annotations.DisableFlags
 import android.platform.test.annotations.EnableFlags
-import androidx.test.ext.junit.runners.AndroidJUnit4
+import android.platform.test.flag.junit.FlagsParameterization
 import androidx.test.filters.SmallTest
 import com.android.systemui.Flags
+import com.android.systemui.Flags.FLAG_GLANCEABLE_HUB_V2
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.bouncer.data.repository.fakeKeyguardBouncerRepository
+import com.android.systemui.communal.data.repository.fakeCommunalSceneRepository
 import com.android.systemui.communal.domain.interactor.communalInteractor
+import com.android.systemui.communal.domain.interactor.communalSceneInteractor
+import com.android.systemui.communal.domain.interactor.setCommunalV2ConfigEnabled
+import com.android.systemui.communal.shared.model.CommunalScenes
 import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
 import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
 import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepositorySpy
 import com.android.systemui.keyguard.data.repository.keyguardTransitionRepository
 import com.android.systemui.keyguard.shared.model.KeyguardState
 import com.android.systemui.keyguard.util.KeyguardTransitionRepositorySpySubject.Companion.assertThat
+import com.android.systemui.kosmos.collectLastValue
+import com.android.systemui.kosmos.runCurrent
+import com.android.systemui.kosmos.runTest
 import com.android.systemui.kosmos.testScope
 import com.android.systemui.power.data.repository.fakePowerRepository
 import com.android.systemui.power.shared.model.WakeSleepReason
 import com.android.systemui.power.shared.model.WakefulnessState
 import com.android.systemui.testKosmos
+import com.google.common.truth.Truth
 import kotlinx.coroutines.test.advanceTimeBy
 import kotlinx.coroutines.test.runCurrent
 import kotlinx.coroutines.test.runTest
@@ -58,10 +67,25 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.Mockito.reset
+import platform.test.runner.parameterized.ParameterizedAndroidJunit4
+import platform.test.runner.parameterized.Parameters
 
 @SmallTest
-@RunWith(AndroidJUnit4::class)
-class FromAlternateBouncerTransitionInteractorTest : SysuiTestCase() {
+@RunWith(ParameterizedAndroidJunit4::class)
+class FromAlternateBouncerTransitionInteractorTest(flags: FlagsParameterization) : SysuiTestCase() {
+
+    companion object {
+        @JvmStatic
+        @Parameters(name = "{0}")
+        fun getParams(): List<FlagsParameterization> {
+            return FlagsParameterization.allCombinationsOf(FLAG_GLANCEABLE_HUB_V2)
+        }
+    }
+
+    init {
+        mSetFlagsRule.setFlagsParameterization(flags)
+    }
+
     private val kosmos =
         testKosmos().apply {
             this.keyguardTransitionRepository = fakeKeyguardTransitionRepositorySpy
@@ -74,6 +98,7 @@
     fun setup() {
         transitionRepository = kosmos.fakeKeyguardTransitionRepositorySpy
         underTest = kosmos.fromAlternateBouncerTransitionInteractor
+        kosmos.setCommunalV2ConfigEnabled(true)
         underTest.start()
     }
 
@@ -171,6 +196,72 @@
         }
 
     @Test
+    @EnableFlags(FLAG_GLANCEABLE_HUB_V2)
+    fun transitionToOccluded_glanceableHubShowing() =
+        kosmos.runTest {
+            val currentScene by collectLastValue(communalSceneInteractor.currentScene)
+
+            fakePowerRepository.updateWakefulness(
+                WakefulnessState.AWAKE,
+                WakeSleepReason.POWER_BUTTON,
+                WakeSleepReason.POWER_BUTTON,
+                false,
+            )
+            fakeKeyguardRepository.setKeyguardOccluded(false)
+            fakeKeyguardBouncerRepository.setAlternateVisible(true)
+            fakeCommunalSceneRepository.changeScene(CommunalScenes.Communal)
+            runCurrent()
+
+            Truth.assertThat(currentScene).isEqualTo(CommunalScenes.Communal)
+
+            transitionRepository.sendTransitionSteps(
+                from = KeyguardState.GLANCEABLE_HUB,
+                to = KeyguardState.ALTERNATE_BOUNCER,
+                testScope,
+            )
+            reset(transitionRepository)
+
+            fakeKeyguardRepository.setKeyguardOccluded(true)
+            fakeKeyguardBouncerRepository.setAlternateVisible(false)
+            testScope.advanceTimeBy(200) // advance past delay
+
+            Truth.assertThat(currentScene).isEqualTo(CommunalScenes.Blank)
+        }
+
+    @Test
+    @EnableFlags(FLAG_GLANCEABLE_HUB_V2)
+    fun transitionToDreaming() =
+        kosmos.runTest {
+            fakePowerRepository.updateWakefulness(
+                WakefulnessState.AWAKE,
+                WakeSleepReason.POWER_BUTTON,
+                WakeSleepReason.POWER_BUTTON,
+                false,
+            )
+            fakeKeyguardRepository.setKeyguardOccluded(false)
+            fakeKeyguardBouncerRepository.setAlternateVisible(true)
+            runCurrent()
+
+            transitionRepository.sendTransitionSteps(
+                from = KeyguardState.LOCKSCREEN,
+                to = KeyguardState.ALTERNATE_BOUNCER,
+                testScope,
+            )
+            reset(transitionRepository)
+
+            fakeKeyguardRepository.setKeyguardOccluded(true)
+            fakeKeyguardRepository.setDreaming(true)
+            fakeKeyguardBouncerRepository.setAlternateVisible(false)
+            testScope.advanceTimeBy(200) // advance past delay
+
+            assertThat(transitionRepository)
+                .startedTransition(
+                    from = KeyguardState.ALTERNATE_BOUNCER,
+                    to = KeyguardState.DREAMING,
+                )
+        }
+
+    @Test
     @DisableFlags(Flags.FLAG_KEYGUARD_WM_STATE_REFACTOR)
     fun transitionToGone_whenOpeningGlanceableHubEditMode() =
         testScope.runTest {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractorTest.kt
index 7e93f5a..9be786f 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractorTest.kt
@@ -25,7 +25,6 @@
 import androidx.test.filters.SmallTest
 import com.android.compose.animation.scene.ObservableTransitionState
 import com.android.systemui.Flags.FLAG_COMMUNAL_HUB
-import com.android.systemui.Flags.FLAG_COMMUNAL_SCENE_KTF_REFACTOR
 import com.android.systemui.Flags.FLAG_GLANCEABLE_HUB_V2
 import com.android.systemui.Flags.FLAG_KEYGUARD_WM_STATE_REFACTOR
 import com.android.systemui.Flags.FLAG_SCENE_CONTAINER
@@ -39,7 +38,6 @@
 import com.android.systemui.communal.domain.interactor.setCommunalAvailable
 import com.android.systemui.communal.domain.interactor.setCommunalV2ConfigEnabled
 import com.android.systemui.communal.shared.model.CommunalScenes
-import com.android.systemui.coroutines.collectLastValue
 import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
 import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepositorySpy
 import com.android.systemui.keyguard.data.repository.keyguardOcclusionRepository
@@ -70,7 +68,6 @@
 import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.runBlocking
 import kotlinx.coroutines.test.advanceTimeBy
-import kotlinx.coroutines.test.runTest
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -103,10 +100,7 @@
         @JvmStatic
         @Parameters(name = "{0}")
         fun getParams(): List<FlagsParameterization> {
-            return FlagsParameterization.allCombinationsOf(
-                FLAG_COMMUNAL_SCENE_KTF_REFACTOR,
-                FLAG_GLANCEABLE_HUB_V2,
-            )
+            return FlagsParameterization.allCombinationsOf(FLAG_GLANCEABLE_HUB_V2)
         }
     }
 
@@ -174,22 +168,6 @@
 
     @Test
     @EnableFlags(FLAG_KEYGUARD_WM_STATE_REFACTOR)
-    @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR, FLAG_GLANCEABLE_HUB_V2)
-    fun testTransitionToLockscreen_onWake_canDream_glanceableHubAvailable() =
-        kosmos.runTest {
-            whenever(dreamManager.canStartDreaming(anyBoolean())).thenReturn(true)
-            setCommunalAvailable(true)
-
-            powerInteractor.setAwakeForTest()
-
-            // If dreaming is possible and communal is available, then we should transition to
-            // GLANCEABLE_HUB when waking up due to power button press.
-            assertThat(transitionRepository)
-                .startedTransition(from = KeyguardState.DOZING, to = KeyguardState.GLANCEABLE_HUB)
-        }
-
-    @Test
-    @EnableFlags(FLAG_KEYGUARD_WM_STATE_REFACTOR, FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
     fun testTransitionToLockscreen_onWake_canDream_ktfRefactor() =
         kosmos.runTest {
             setCommunalAvailable(true)
@@ -243,24 +221,7 @@
         }
 
     @Test
-    @EnableFlags(FLAG_KEYGUARD_WM_STATE_REFACTOR)
-    @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
-    fun testTransitionToGlanceableHub_onWakeup_ifIdleOnCommunal_noOccludingActivity() =
-        kosmos.runTest {
-            fakeCommunalSceneRepository.setTransitionState(
-                flowOf(ObservableTransitionState.Idle(CommunalScenes.Communal))
-            )
-
-            powerInteractor.setAwakeForTest()
-
-            // Under default conditions, we should transition to LOCKSCREEN when waking up.
-            assertThat(transitionRepository)
-                .startedTransition(from = KeyguardState.DOZING, to = KeyguardState.GLANCEABLE_HUB)
-        }
-
-    @Test
     @DisableFlags(FLAG_KEYGUARD_WM_STATE_REFACTOR, FLAG_SCENE_CONTAINER)
-    @EnableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
     fun testTransitionToGlanceableHub_onWakeup_ifAvailable() =
         kosmos.runTest {
             setCommunalAvailable(true)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractorTest.kt
index 5882cff..898a5c1 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractorTest.kt
@@ -23,7 +23,6 @@
 import android.service.dream.dreamManager
 import androidx.test.filters.SmallTest
 import com.android.systemui.Flags
-import com.android.systemui.Flags.FLAG_COMMUNAL_SCENE_KTF_REFACTOR
 import com.android.systemui.Flags.FLAG_GLANCEABLE_HUB_V2
 import com.android.systemui.Flags.glanceableHubV2
 import com.android.systemui.SysuiTestCase
@@ -74,10 +73,7 @@
         @JvmStatic
         @Parameters(name = "{0}")
         fun getParams(): List<FlagsParameterization> {
-            return FlagsParameterization.allCombinationsOf(
-                    FLAG_COMMUNAL_SCENE_KTF_REFACTOR,
-                    FLAG_GLANCEABLE_HUB_V2,
-                )
+            return FlagsParameterization.allCombinationsOf(FLAG_GLANCEABLE_HUB_V2)
                 .andSceneContainer()
         }
     }
@@ -202,7 +198,6 @@
         }
 
     @Test
-    @EnableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
     @DisableFlags(Flags.FLAG_SCENE_CONTAINER)
     fun testTransitionToGlanceableHubOnWake() =
         kosmos.runTest {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractorTest.kt
index 63ed040..9a8e095 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractorTest.kt
@@ -32,16 +32,11 @@
 
 package com.android.systemui.keyguard.domain.interactor
 
-import android.platform.test.annotations.DisableFlags
 import android.platform.test.annotations.EnableFlags
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
-import com.android.compose.animation.scene.ObservableTransitionState
 import com.android.systemui.Flags
-import com.android.systemui.Flags.FLAG_COMMUNAL_SCENE_KTF_REFACTOR
 import com.android.systemui.SysuiTestCase
-import com.android.systemui.communal.data.repository.fakeCommunalSceneRepository
-import com.android.systemui.communal.shared.model.CommunalScenes
 import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepositorySpy
 import com.android.systemui.keyguard.data.repository.keyguardOcclusionRepository
 import com.android.systemui.keyguard.data.repository.keyguardTransitionRepository
@@ -51,7 +46,6 @@
 import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAwakeForTest
 import com.android.systemui.power.domain.interactor.powerInteractor
 import com.android.systemui.testKosmos
-import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.runBlocking
 import kotlinx.coroutines.test.runCurrent
 import kotlinx.coroutines.test.runTest
@@ -101,21 +95,4 @@
             assertThat(transitionRepository)
                 .startedTransition(from = KeyguardState.OCCLUDED, to = KeyguardState.LOCKSCREEN)
         }
-
-    @Test
-    @EnableFlags(Flags.FLAG_KEYGUARD_WM_STATE_REFACTOR)
-    @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
-    fun testShowWhenLockedActivity_noLongerOnTop_transitionsToGlanceableHub_ifIdleOnCommunal() =
-        testScope.runTest {
-            kosmos.fakeCommunalSceneRepository.setTransitionState(
-                flowOf(ObservableTransitionState.Idle(CommunalScenes.Communal))
-            )
-            runCurrent()
-
-            kosmos.keyguardOcclusionRepository.setShowWhenLockedActivityInfo(onTop = false)
-            runCurrent()
-
-            assertThat(transitionRepository)
-                .startedTransition(from = KeyguardState.OCCLUDED, to = KeyguardState.GLANCEABLE_HUB)
-        }
 }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractorTest.kt
index 63bb100..d9e7622 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractorTest.kt
@@ -17,13 +17,17 @@
 package com.android.systemui.keyguard.domain.interactor
 
 import android.platform.test.annotations.EnableFlags
-import androidx.test.ext.junit.runners.AndroidJUnit4
+import android.platform.test.flag.junit.FlagsParameterization
 import androidx.test.filters.SmallTest
 import com.android.compose.animation.scene.ObservableTransitionState
+import com.android.systemui.Flags.FLAG_GLANCEABLE_HUB_V2
 import com.android.systemui.Flags.FLAG_KEYGUARD_WM_STATE_REFACTOR
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.bouncer.data.repository.fakeKeyguardBouncerRepository
 import com.android.systemui.communal.data.repository.fakeCommunalSceneRepository
+import com.android.systemui.communal.domain.interactor.communalSceneInteractor
+import com.android.systemui.communal.domain.interactor.setCommunalV2Available
+import com.android.systemui.communal.domain.interactor.setCommunalV2ConfigEnabled
 import com.android.systemui.communal.shared.model.CommunalScenes
 import com.android.systemui.coroutines.collectValues
 import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepositorySpy
@@ -33,30 +37,55 @@
 import com.android.systemui.keyguard.shared.model.TransitionState
 import com.android.systemui.keyguard.shared.model.TransitionStep
 import com.android.systemui.keyguard.util.KeyguardTransitionRepositorySpySubject.Companion.assertThat
+import com.android.systemui.kosmos.collectLastValue
+import com.android.systemui.kosmos.runCurrent
+import com.android.systemui.kosmos.runTest
 import com.android.systemui.kosmos.testScope
+import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAsleepForTest
+import com.android.systemui.power.domain.interactor.powerInteractor
 import com.android.systemui.testKosmos
-import com.android.systemui.user.domain.interactor.selectedUserInteractor
+import com.google.common.truth.Truth
 import junit.framework.Assert.assertEquals
 import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.test.runCurrent
 import kotlinx.coroutines.test.runTest
+import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.Mockito.reset
+import platform.test.runner.parameterized.ParameterizedAndroidJunit4
+import platform.test.runner.parameterized.Parameters
 
 @SmallTest
-@RunWith(AndroidJUnit4::class)
-class FromPrimaryBouncerTransitionInteractorTest : SysuiTestCase() {
+@RunWith(ParameterizedAndroidJunit4::class)
+class FromPrimaryBouncerTransitionInteractorTest(flags: FlagsParameterization) : SysuiTestCase() {
+
+    companion object {
+        @JvmStatic
+        @Parameters(name = "{0}")
+        fun getParams(): List<FlagsParameterization> {
+            return FlagsParameterization.allCombinationsOf(FLAG_GLANCEABLE_HUB_V2)
+        }
+    }
+
+    init {
+        mSetFlagsRule.setFlagsParameterization(flags)
+    }
+
     private val kosmos =
         testKosmos().apply {
             this.keyguardTransitionRepository = fakeKeyguardTransitionRepositorySpy
         }
     val underTest = kosmos.fromPrimaryBouncerTransitionInteractor
     val testScope = kosmos.testScope
-    val selectedUserInteractor = kosmos.selectedUserInteractor
     val transitionRepository = kosmos.fakeKeyguardTransitionRepositorySpy
     val bouncerRepository = kosmos.fakeKeyguardBouncerRepository
 
+    @Before
+    fun setUp() {
+        kosmos.setCommunalV2ConfigEnabled(true)
+    }
+
     @Test
     fun testSurfaceBehindVisibility() =
         testScope.runTest {
@@ -213,4 +242,33 @@
                     to = KeyguardState.OCCLUDED,
                 )
         }
+
+    @Test
+    @EnableFlags(FLAG_GLANCEABLE_HUB_V2)
+    fun testTransitionToDozing_bouncerShowingOnTopOfGlanceableHub() =
+        kosmos.runTest {
+            underTest.start()
+            setCommunalV2Available(true)
+
+            val currentScene by collectLastValue(communalSceneInteractor.currentScene)
+            // Communal is showing.
+            fakeCommunalSceneRepository.changeScene(CommunalScenes.Communal)
+
+            Truth.assertThat(currentScene).isEqualTo(CommunalScenes.Communal)
+
+            // Bouncer is shown on top of the Glanceable Hub.
+            bouncerRepository.setPrimaryShow(true)
+            transitionRepository.sendTransitionSteps(
+                from = KeyguardState.GLANCEABLE_HUB,
+                to = KeyguardState.PRIMARY_BOUNCER,
+                testScope,
+            )
+
+            reset(transitionRepository)
+
+            powerInteractor.setAsleepForTest()
+            runCurrent()
+
+            Truth.assertThat(currentScene).isEqualTo(CommunalScenes.Blank)
+        }
 }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractorTest.kt
index 282bebc..a08c0de 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractorTest.kt
@@ -30,6 +30,7 @@
 import com.android.systemui.keyguard.data.repository.keyguardClockRepository
 import com.android.systemui.keyguard.data.repository.keyguardRepository
 import com.android.systemui.keyguard.shared.model.ClockSize
+import com.android.systemui.keyguard.shared.model.ClockSizeSetting
 import com.android.systemui.keyguard.shared.model.DozeStateModel
 import com.android.systemui.keyguard.shared.model.DozeTransitionModel
 import com.android.systemui.keyguard.shared.model.KeyguardState
@@ -68,6 +69,7 @@
     fun clockSize_sceneContainerFlagOff_basedOnRepository() =
         testScope.runTest {
             val value by collectLastValue(underTest.clockSize)
+            kosmos.fakeKeyguardClockRepository.setSelectedClockSize(ClockSizeSetting.DYNAMIC)
             kosmos.keyguardClockRepository.setClockSize(ClockSize.LARGE)
             assertThat(value).isEqualTo(ClockSize.LARGE)
 
@@ -76,6 +78,17 @@
         }
 
     @Test
+    @DisableSceneContainer
+    fun clockSize_sceneContainerFlagOff_smallClockSettingSelected_SMALL() =
+        testScope.runTest {
+            val value by collectLastValue(underTest.clockSize)
+            kosmos.fakeKeyguardClockRepository.setSelectedClockSize(ClockSizeSetting.SMALL)
+            kosmos.keyguardClockRepository.setClockSize(ClockSize.LARGE)
+
+            assertThat(value).isEqualTo(ClockSize.SMALL)
+        }
+
+    @Test
     @EnableSceneContainer
     fun clockSize_forceSmallClock_SMALL() =
         testScope.runTest {
@@ -91,61 +104,80 @@
 
     @Test
     @EnableSceneContainer
-    fun clockSize_SceneContainerFlagOn_shadeModeSingle_hasNotifs_SMALL() =
+    fun clockSize_sceneContainerFlagOn_shadeModeSingle_hasNotifs_SMALL() =
         testScope.runTest {
             val value by collectLastValue(underTest.clockSize)
             kosmos.shadeRepository.setShadeLayoutWide(false)
             kosmos.activeNotificationListRepository.setActiveNotifs(1)
+
             assertThat(value).isEqualTo(ClockSize.SMALL)
         }
 
     @Test
     @EnableSceneContainer
-    fun clockSize_SceneContainerFlagOn_shadeModeSingle_hasMedia_SMALL() =
+    fun clockSize_sceneContainerFlagOn_shadeModeSingle_hasMedia_SMALL() =
         testScope.runTest {
             val value by collectLastValue(underTest.clockSize)
             kosmos.shadeRepository.setShadeLayoutWide(false)
             val userMedia = MediaData().copy(active = true)
             kosmos.mediaFilterRepository.addSelectedUserMediaEntry(userMedia)
+
             assertThat(value).isEqualTo(ClockSize.SMALL)
         }
 
     @Test
     @EnableSceneContainer
-    fun clockSize_SceneContainerFlagOn_shadeModeSplit_isMediaVisible_SMALL() =
+    fun clockSize_sceneContainerFlagOn_shadeModeSplit_isMediaVisible_SMALL() =
         testScope.runTest {
             val value by collectLastValue(underTest.clockSize)
             val userMedia = MediaData().copy(active = true)
             kosmos.shadeRepository.setShadeLayoutWide(true)
             kosmos.mediaFilterRepository.addSelectedUserMediaEntry(userMedia)
             kosmos.keyguardRepository.setIsDozing(false)
+
             assertThat(value).isEqualTo(ClockSize.SMALL)
         }
 
     @Test
     @EnableSceneContainer
-    fun clockSize_SceneContainerFlagOn_shadeModeSplit_noMedia_LARGE() =
+    fun clockSize_sceneContainerFlagOn_shadeModeSplit_noMedia_LARGE() =
         testScope.runTest {
             val value by collectLastValue(underTest.clockSize)
             kosmos.shadeRepository.setShadeLayoutWide(true)
             kosmos.keyguardRepository.setIsDozing(false)
+
             assertThat(value).isEqualTo(ClockSize.LARGE)
         }
 
     @Test
     @EnableSceneContainer
-    fun clockSize_SceneContainerFlagOn_shadeModeSplit_isDozing_LARGE() =
+    fun clockSize_sceneContainerFlagOn_shadeModeSplit_isDozing_LARGE() =
         testScope.runTest {
             val value by collectLastValue(underTest.clockSize)
             val userMedia = MediaData().copy(active = true)
             kosmos.shadeRepository.setShadeLayoutWide(true)
             kosmos.mediaFilterRepository.addSelectedUserMediaEntry(userMedia)
             kosmos.keyguardRepository.setIsDozing(true)
+
             assertThat(value).isEqualTo(ClockSize.LARGE)
         }
 
     @Test
     @EnableSceneContainer
+    fun clockSize_sceneContainerFlagOn_shadeModeSplit_smallClockSettingSelectd_SMALL() =
+        testScope.runTest {
+            val value by collectLastValue(underTest.clockSize)
+            val userMedia = MediaData().copy(active = true)
+            kosmos.fakeKeyguardClockRepository.setSelectedClockSize(ClockSizeSetting.SMALL)
+            kosmos.shadeRepository.setShadeLayoutWide(true)
+            kosmos.mediaFilterRepository.addSelectedUserMediaEntry(userMedia)
+            kosmos.keyguardRepository.setIsDozing(true)
+
+            assertThat(value).isEqualTo(ClockSize.SMALL)
+        }
+
+    @Test
+    @EnableSceneContainer
     fun clockShouldBeCentered_sceneContainerFlagOn_notSplitMode_true() =
         testScope.runTest {
             val value by collectLastValue(underTest.clockShouldBeCentered)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt
index d057f7a0..8df70ef 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt
@@ -26,13 +26,11 @@
 import com.android.keyguard.KeyguardSecurityModel.SecurityMode.PIN
 import com.android.systemui.Flags
 import com.android.systemui.Flags.FLAG_COMMUNAL_HUB
-import com.android.systemui.Flags.FLAG_COMMUNAL_SCENE_KTF_REFACTOR
 import com.android.systemui.Flags.FLAG_GLANCEABLE_HUB_V2
 import com.android.systemui.Flags.glanceableHubV2
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.bouncer.data.repository.fakeKeyguardBouncerRepository
 import com.android.systemui.communal.domain.interactor.CommunalSceneTransitionInteractor
-import com.android.systemui.communal.domain.interactor.communalInteractor
 import com.android.systemui.communal.domain.interactor.communalSceneInteractor
 import com.android.systemui.communal.domain.interactor.communalSceneTransitionInteractor
 import com.android.systemui.communal.domain.interactor.setCommunalAvailable
@@ -128,14 +126,13 @@
     }
 
     private val powerInteractor by lazy { kosmos.powerInteractor }
-    private val communalInteractor by lazy { kosmos.communalInteractor }
     private val communalSceneInteractor by lazy { kosmos.communalSceneInteractor }
 
     companion object {
         @JvmStatic
         @Parameters(name = "{0}")
         fun getParams(): List<FlagsParameterization> {
-            return FlagsParameterization.allCombinationsOf(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
+            return FlagsParameterization.allCombinationsOf(FLAG_GLANCEABLE_HUB_V2)
                 .andSceneContainer()
         }
     }
@@ -468,38 +465,6 @@
 
     @Test
     @DisableSceneContainer
-    @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
-    fun dozingToGlanceableHub() =
-        testScope.runTest {
-            // GIVEN a prior transition has run to DOZING
-            runTransitionAndSetWakefulness(KeyguardState.GLANCEABLE_HUB, KeyguardState.DOZING)
-            runCurrent()
-
-            // GIVEN the device is idle on the glanceable hub
-            val idleTransitionState =
-                MutableStateFlow<ObservableTransitionState>(
-                    ObservableTransitionState.Idle(CommunalScenes.Communal)
-                )
-            communalInteractor.setTransitionState(idleTransitionState)
-            runCurrent()
-
-            // WHEN the device begins to wake
-            keyguardRepository.setKeyguardShowing(true)
-            powerInteractor.setAwakeForTest()
-            advanceTimeBy(60L)
-
-            assertThat(transitionRepository)
-                .startedTransition(
-                    from = KeyguardState.DOZING,
-                    to = KeyguardState.GLANCEABLE_HUB,
-                    animatorAssertion = { it.isNotNull() },
-                )
-
-            coroutineContext.cancelChildren()
-        }
-
-    @Test
-    @DisableSceneContainer
     fun goneToDozing() =
         testScope.runTest {
             // GIVEN a device with AOD not available
@@ -625,40 +590,6 @@
 
     @Test
     @BrokenWithSceneContainer(339465026)
-    @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
-    fun goneToGlanceableHub() =
-        testScope.runTest {
-            // GIVEN a prior transition has run to GONE
-            runTransitionAndSetWakefulness(KeyguardState.LOCKSCREEN, KeyguardState.GONE)
-
-            // GIVEN the device is idle on the glanceable hub
-            val idleTransitionState =
-                MutableStateFlow<ObservableTransitionState>(
-                    ObservableTransitionState.Idle(CommunalScenes.Communal)
-                )
-            communalInteractor.setTransitionState(idleTransitionState)
-            runCurrent()
-
-            // WHEN the keyguard starts to show
-            keyguardRepository.setKeyguardShowing(true)
-            runCurrent()
-
-            assertThat(transitionRepository)
-                .startedTransition(
-                    to = KeyguardState.GLANCEABLE_HUB,
-                    from = KeyguardState.GONE,
-                    ownerName =
-                        FromGoneTransitionInteractor::class.simpleName +
-                            "(keyguard interactor says keyguard is showing)",
-                    animatorAssertion = { it.isNotNull() },
-                )
-
-            coroutineContext.cancelChildren()
-        }
-
-    @Test
-    @BrokenWithSceneContainer(339465026)
-    @EnableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
     fun goneToGlanceableHub_communalKtfRefactor() =
         testScope.runTest {
             // GIVEN a prior transition has run to GONE
@@ -971,6 +902,7 @@
 
     @Test
     @DisableSceneContainer
+    @DisableFlags(FLAG_GLANCEABLE_HUB_V2)
     fun primaryBouncerToGlanceableHubWhileDreaming() =
         testScope.runTest {
             // Setup - Move past initial delay with [KeyguardInteractor#isAbleToDream]
@@ -1070,84 +1002,6 @@
 
     @Test
     @BrokenWithSceneContainer(339465026)
-    @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
-    fun occludedToGlanceableHub() =
-        testScope.runTest {
-            // GIVEN a device on lockscreen
-            keyguardRepository.setKeyguardShowing(true)
-            runCurrent()
-
-            // GIVEN the device is idle on the glanceable hub
-            val idleTransitionState =
-                MutableStateFlow<ObservableTransitionState>(
-                    ObservableTransitionState.Idle(CommunalScenes.Communal)
-                )
-            communalInteractor.setTransitionState(idleTransitionState)
-            runCurrent()
-
-            // GIVEN a prior transition has run to OCCLUDED
-            runTransitionAndSetWakefulness(KeyguardState.GLANCEABLE_HUB, KeyguardState.OCCLUDED)
-            keyguardRepository.setKeyguardOccluded(true)
-            runCurrent()
-
-            // WHEN occlusion ends
-            keyguardRepository.setKeyguardOccluded(false)
-            runCurrent()
-
-            // THEN a transition to GLANCEABLE_HUB should occur
-            assertThat(transitionRepository)
-                .startedTransition(
-                    ownerName = FromOccludedTransitionInteractor::class.simpleName,
-                    from = KeyguardState.OCCLUDED,
-                    to = KeyguardState.GLANCEABLE_HUB,
-                    animatorAssertion = { it.isNotNull() },
-                )
-
-            coroutineContext.cancelChildren()
-        }
-
-    @Test
-    @BrokenWithSceneContainer(339465026)
-    @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
-    fun occludedToGlanceableHubWhenInitiallyOnHub() =
-        testScope.runTest {
-            // GIVEN a device on lockscreen and communal is available
-            keyguardRepository.setKeyguardShowing(true)
-            kosmos.setCommunalAvailable(true)
-            runCurrent()
-
-            // GIVEN a prior transition has run to OCCLUDED from GLANCEABLE_HUB
-            runTransitionAndSetWakefulness(KeyguardState.GLANCEABLE_HUB, KeyguardState.OCCLUDED)
-            keyguardRepository.setKeyguardOccluded(true)
-            runCurrent()
-
-            // GIVEN on blank scene
-            val idleTransitionState =
-                MutableStateFlow<ObservableTransitionState>(
-                    ObservableTransitionState.Idle(CommunalScenes.Blank)
-                )
-            communalInteractor.setTransitionState(idleTransitionState)
-            runCurrent()
-
-            // WHEN occlusion ends
-            keyguardRepository.setKeyguardOccluded(false)
-            runCurrent()
-
-            // THEN a transition to GLANCEABLE_HUB should occur
-            assertThat(transitionRepository)
-                .startedTransition(
-                    ownerName = FromOccludedTransitionInteractor::class.simpleName,
-                    from = KeyguardState.OCCLUDED,
-                    to = KeyguardState.GLANCEABLE_HUB,
-                    animatorAssertion = { it.isNotNull() },
-                )
-
-            coroutineContext.cancelChildren()
-        }
-
-    @Test
-    @BrokenWithSceneContainer(339465026)
-    @EnableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
     fun occludedToGlanceableHub_communalKtfRefactor() =
         testScope.runTest {
             // GIVEN a device on lockscreen and communal is available
@@ -1390,48 +1244,6 @@
 
     @Test
     @DisableSceneContainer
-    @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
-    fun dreamingToGlanceableHub() =
-        testScope.runTest {
-            // GIVEN a prior transition has run to DREAMING
-            keyguardRepository.setDreaming(true)
-            runTransitionAndSetWakefulness(KeyguardState.LOCKSCREEN, KeyguardState.DREAMING)
-            runCurrent()
-
-            // WHEN a transition to the glanceable hub starts
-            val currentScene = CommunalScenes.Blank
-            val targetScene = CommunalScenes.Communal
-
-            val progress = MutableStateFlow(0f)
-            val transitionState =
-                MutableStateFlow<ObservableTransitionState>(
-                    ObservableTransitionState.Transition(
-                        fromScene = currentScene,
-                        toScene = targetScene,
-                        currentScene = flowOf(targetScene),
-                        progress = progress,
-                        isInitiatedByUserInput = false,
-                        isUserInputOngoing = flowOf(false),
-                    )
-                )
-            communalInteractor.setTransitionState(transitionState)
-            progress.value = .1f
-            runCurrent()
-
-            assertThat(transitionRepository)
-                .startedTransition(
-                    ownerName = FromDreamingTransitionInteractor::class.simpleName,
-                    from = KeyguardState.DREAMING,
-                    to = KeyguardState.GLANCEABLE_HUB,
-                    animatorAssertion = { it.isNull() }, // transition should be manually animated
-                )
-
-            coroutineContext.cancelChildren()
-        }
-
-    @Test
-    @DisableSceneContainer
-    @EnableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
     fun dreamingToGlanceableHub_communalKtfRefactor() =
         testScope.runTest {
             // GIVEN a prior transition has run to DREAMING
@@ -1596,66 +1408,6 @@
 
     @Test
     @DisableSceneContainer
-    @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
-    fun lockscreenToGlanceableHub() =
-        testScope.runTest {
-            // GIVEN a prior transition has run to LOCKSCREEN
-            runTransitionAndSetWakefulness(KeyguardState.AOD, KeyguardState.LOCKSCREEN)
-            runCurrent()
-
-            // WHEN a glanceable hub transition starts
-            val currentScene = CommunalScenes.Blank
-            val targetScene = CommunalScenes.Communal
-
-            val progress = MutableStateFlow(0f)
-            val transitionState =
-                MutableStateFlow<ObservableTransitionState>(
-                    ObservableTransitionState.Transition(
-                        fromScene = currentScene,
-                        toScene = targetScene,
-                        currentScene = flowOf(targetScene),
-                        progress = progress,
-                        isInitiatedByUserInput = false,
-                        isUserInputOngoing = flowOf(false),
-                    )
-                )
-            communalInteractor.setTransitionState(transitionState)
-            progress.value = .1f
-            runCurrent()
-
-            // THEN a transition from LOCKSCREEN => GLANCEABLE_HUB should occur
-            assertThat(transitionRepository)
-                .startedTransition(
-                    ownerName = FromLockscreenTransitionInteractor::class.simpleName,
-                    from = KeyguardState.LOCKSCREEN,
-                    to = KeyguardState.GLANCEABLE_HUB,
-                    animatorAssertion = { it.isNull() }, // transition should be manually animated
-                )
-
-            // WHEN the user stops dragging and the glanceable hub opening is cancelled
-            clearInvocations(transitionRepository)
-            runTransitionAndSetWakefulness(KeyguardState.LOCKSCREEN, KeyguardState.GLANCEABLE_HUB)
-            val idleTransitionState =
-                MutableStateFlow<ObservableTransitionState>(
-                    ObservableTransitionState.Idle(currentScene)
-                )
-            communalInteractor.setTransitionState(idleTransitionState)
-            runCurrent()
-
-            // THEN a transition from LOCKSCREEN => GLANCEABLE_HUB should occur
-            assertThat(transitionRepository)
-                .startedTransition(
-                    ownerName = FromLockscreenTransitionInteractor::class.simpleName,
-                    from = KeyguardState.GLANCEABLE_HUB,
-                    to = KeyguardState.LOCKSCREEN,
-                )
-
-            coroutineContext.cancelChildren()
-        }
-
-    @Test
-    @DisableSceneContainer
-    @EnableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
     fun lockscreenToGlanceableHub_communalKtfRefactor() =
         testScope.runTest {
             // GIVEN a prior transition has run to LOCKSCREEN
@@ -1696,86 +1448,6 @@
 
     @Test
     @DisableSceneContainer
-    @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
-    fun glanceableHubToLockscreen() =
-        testScope.runTest {
-            // GIVEN a prior transition has run to GLANCEABLE_HUB
-            runTransitionAndSetWakefulness(KeyguardState.LOCKSCREEN, KeyguardState.GLANCEABLE_HUB)
-            runCurrent()
-
-            // WHEN a transition away from glanceable hub starts
-            val currentScene = CommunalScenes.Communal
-            val targetScene = CommunalScenes.Blank
-
-            val progress = MutableStateFlow(0f)
-            val transitionState =
-                MutableStateFlow<ObservableTransitionState>(
-                    ObservableTransitionState.Transition(
-                        fromScene = currentScene,
-                        toScene = targetScene,
-                        currentScene = flowOf(targetScene),
-                        progress = progress,
-                        isInitiatedByUserInput = false,
-                        isUserInputOngoing = flowOf(false),
-                    )
-                )
-            communalInteractor.setTransitionState(transitionState)
-            progress.value = .1f
-            runCurrent()
-
-            assertThat(transitionRepository)
-                .startedTransition(
-                    ownerName = FromGlanceableHubTransitionInteractor::class.simpleName,
-                    from = KeyguardState.GLANCEABLE_HUB,
-                    to = KeyguardState.LOCKSCREEN,
-                    animatorAssertion = { it.isNull() }, // transition should be manually animated
-                )
-
-            // WHEN the user stops dragging and the glanceable hub closing is cancelled
-            clearInvocations(transitionRepository)
-            runTransitionAndSetWakefulness(KeyguardState.GLANCEABLE_HUB, KeyguardState.LOCKSCREEN)
-            val idleTransitionState =
-                MutableStateFlow<ObservableTransitionState>(
-                    ObservableTransitionState.Idle(currentScene)
-                )
-            communalInteractor.setTransitionState(idleTransitionState)
-            runCurrent()
-
-            assertThat(transitionRepository)
-                .startedTransition(
-                    from = KeyguardState.LOCKSCREEN,
-                    to = KeyguardState.GLANCEABLE_HUB,
-                )
-
-            coroutineContext.cancelChildren()
-        }
-
-    @Test
-    @DisableSceneContainer
-    @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
-    fun glanceableHubToDozing() =
-        testScope.runTest {
-            // GIVEN a prior transition has run to GLANCEABLE_HUB
-            runTransitionAndSetWakefulness(KeyguardState.LOCKSCREEN, KeyguardState.GLANCEABLE_HUB)
-
-            // WHEN the device begins to sleep
-            powerInteractor.setAsleepForTest()
-            runCurrent()
-
-            assertThat(transitionRepository)
-                .startedTransition(
-                    ownerName = FromGlanceableHubTransitionInteractor::class.simpleName,
-                    from = KeyguardState.GLANCEABLE_HUB,
-                    to = KeyguardState.DOZING,
-                    animatorAssertion = { it.isNotNull() },
-                )
-
-            coroutineContext.cancelChildren()
-        }
-
-    @Test
-    @DisableSceneContainer
-    @EnableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
     fun glanceableHubToDozing_communalKtfRefactor() =
         testScope.runTest {
             // GIVEN a prior transition has run to GLANCEABLE_HUB
@@ -1844,39 +1516,6 @@
 
     @Test
     @BrokenWithSceneContainer(339465026)
-    @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
-    fun glanceableHubToOccluded() =
-        testScope.runTest {
-            // GIVEN a prior transition has run to GLANCEABLE_HUB
-            runTransitionAndSetWakefulness(KeyguardState.GONE, KeyguardState.GLANCEABLE_HUB)
-            runCurrent()
-
-            // GIVEN the device is idle on the glanceable hub
-            val idleTransitionState =
-                MutableStateFlow<ObservableTransitionState>(
-                    ObservableTransitionState.Idle(CommunalScenes.Communal)
-                )
-            communalInteractor.setTransitionState(idleTransitionState)
-            runCurrent()
-
-            // WHEN the keyguard is occluded
-            keyguardRepository.setKeyguardOccluded(true)
-            runCurrent()
-
-            assertThat(transitionRepository)
-                .startedTransition(
-                    ownerName = FromGlanceableHubTransitionInteractor::class.simpleName,
-                    from = KeyguardState.GLANCEABLE_HUB,
-                    to = KeyguardState.OCCLUDED,
-                    animatorAssertion = { it.isNotNull() },
-                )
-
-            coroutineContext.cancelChildren()
-        }
-
-    @Test
-    @BrokenWithSceneContainer(339465026)
-    @EnableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
     fun glanceableHubToOccluded_communalKtfRefactor() =
         testScope.runTest {
             // GIVEN device is not dreaming
@@ -1905,30 +1544,6 @@
 
     @Test
     @DisableSceneContainer
-    @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
-    fun glanceableHubToGone() =
-        testScope.runTest {
-            // GIVEN a prior transition has run to GLANCEABLE_HUB
-            runTransitionAndSetWakefulness(KeyguardState.LOCKSCREEN, KeyguardState.GLANCEABLE_HUB)
-
-            // WHEN keyguard goes away
-            keyguardRepository.setKeyguardGoingAway(true)
-            runCurrent()
-
-            assertThat(transitionRepository)
-                .startedTransition(
-                    ownerName = FromGlanceableHubTransitionInteractor::class.simpleName,
-                    from = KeyguardState.GLANCEABLE_HUB,
-                    to = KeyguardState.GONE,
-                    animatorAssertion = { it.isNotNull() },
-                )
-
-            coroutineContext.cancelChildren()
-        }
-
-    @Test
-    @DisableSceneContainer
-    @EnableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
     fun glanceableHubToGone_communalKtfRefactor() =
         testScope.runTest {
             // GIVEN a prior transition has run to GLANCEABLE_HUB
@@ -1953,7 +1568,7 @@
 
     @Test
     @DisableSceneContainer
-    @EnableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR, FLAG_GLANCEABLE_HUB_V2)
+    @EnableFlags(FLAG_GLANCEABLE_HUB_V2)
     fun glanceableHubToDreaming_v2() =
         testScope.runTest {
             kosmos.setCommunalV2Enabled(true)
@@ -1985,55 +1600,7 @@
         }
 
     @Test
-    @DisableSceneContainer
-    @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
-    fun glanceableHubToDreaming() =
-        testScope.runTest {
-            runCurrent()
-
-            // GIVEN that we are dreaming and not dozing
-            keyguardRepository.setDreaming(true)
-            keyguardRepository.setDozeTransitionModel(
-                DozeTransitionModel(from = DozeStateModel.DOZE, to = DozeStateModel.FINISH)
-            )
-            advanceTimeBy(600L)
-
-            // GIVEN a prior transition has run to GLANCEABLE_HUB
-            runTransitionAndSetWakefulness(KeyguardState.DREAMING, KeyguardState.GLANCEABLE_HUB)
-            runCurrent()
-
-            // WHEN a transition away from glanceable hub starts
-            val currentScene = CommunalScenes.Communal
-            val targetScene = CommunalScenes.Blank
-
-            val transitionState =
-                MutableStateFlow<ObservableTransitionState>(
-                    ObservableTransitionState.Transition(
-                        fromScene = currentScene,
-                        toScene = targetScene,
-                        currentScene = flowOf(targetScene),
-                        progress = flowOf(0f, 0.1f),
-                        isInitiatedByUserInput = false,
-                        isUserInputOngoing = flowOf(false),
-                    )
-                )
-            communalSceneInteractor.setTransitionState(transitionState)
-            runCurrent()
-
-            assertThat(transitionRepository)
-                .startedTransition(
-                    ownerName = FromGlanceableHubTransitionInteractor::class.simpleName,
-                    from = KeyguardState.GLANCEABLE_HUB,
-                    to = KeyguardState.DREAMING,
-                    animatorAssertion = { it.isNull() }, // transition should be manually animated
-                )
-
-            coroutineContext.cancelChildren()
-        }
-
-    @Test
     @BrokenWithSceneContainer(339465026)
-    @EnableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
     fun glanceableHubToOccludedDoesNotTriggerWhenDreamStateChanges_communalKtfRefactor() =
         testScope.runTest {
             // GIVEN that we are dreaming and not dozing
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlowTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlowTest.kt
index a0fed6b..0ec3173 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlowTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlowTest.kt
@@ -57,9 +57,7 @@
                     duration = 1000.milliseconds,
                     edge = Edge.create(from = Scenes.Gone, to = DREAMING),
                 )
-                .setupWithoutSceneContainer(
-                    edge = Edge.create(from = GONE, to = DREAMING),
-                )
+                .setupWithoutSceneContainer(edge = Edge.create(from = GONE, to = DREAMING))
     }
 
     @Test(expected = IllegalArgumentException::class)
@@ -75,7 +73,7 @@
                 underTest.sharedFlow(
                     startTime = 300.milliseconds,
                     duration = 800.milliseconds,
-                    onStep = { it }
+                    onStep = { it },
                 )
         }
 
@@ -112,6 +110,17 @@
         }
 
     @Test
+    fun onStepReturnsNullEmitsNothing() =
+        testScope.runTest {
+            val flow = underTest.sharedFlow(duration = 100.milliseconds, onStep = { null })
+            var animationValues = collectLastValue(flow)
+            runCurrent()
+
+            repository.sendTransitionStep(step(0.5f, TransitionState.RUNNING))
+            assertThat(animationValues()).isNull()
+        }
+
+    @Test
     fun usesStartTime() =
         testScope.runTest {
             val flow =
@@ -166,11 +175,7 @@
     @Test
     fun usesOnStepToDoubleValue() =
         testScope.runTest {
-            val flow =
-                underTest.sharedFlow(
-                    duration = 1000.milliseconds,
-                    onStep = { it * 2 },
-                )
+            val flow = underTest.sharedFlow(duration = 1000.milliseconds, onStep = { it * 2 })
             val animationValues by collectLastValue(flow)
             runCurrent()
 
@@ -190,10 +195,7 @@
     fun usesOnStepToDoubleValueWithState() =
         testScope.runTest {
             val flow =
-                underTest.sharedFlowWithState(
-                    duration = 1000.milliseconds,
-                    onStep = { it * 2 },
-                )
+                underTest.sharedFlowWithState(duration = 1000.milliseconds, onStep = { it * 2 })
             val animationValues by collectLastValue(flow)
             runCurrent()
 
@@ -204,7 +206,7 @@
                         from = GONE,
                         to = DREAMING,
                         transitionState = TransitionState.STARTED,
-                        value = 0f
+                        value = 0f,
                     )
                 )
             repository.sendTransitionStep(step(0.3f, TransitionState.RUNNING))
@@ -214,7 +216,7 @@
                         from = GONE,
                         to = DREAMING,
                         transitionState = TransitionState.RUNNING,
-                        value = 0.6f
+                        value = 0.6f,
                     )
                 )
             repository.sendTransitionStep(step(0.6f, TransitionState.RUNNING))
@@ -224,7 +226,7 @@
                         from = GONE,
                         to = DREAMING,
                         transitionState = TransitionState.RUNNING,
-                        value = 1.2f
+                        value = 1.2f,
                     )
                 )
             repository.sendTransitionStep(step(0.8f, TransitionState.RUNNING))
@@ -234,7 +236,7 @@
                         from = GONE,
                         to = DREAMING,
                         transitionState = TransitionState.RUNNING,
-                        value = 1.6f
+                        value = 1.6f,
                     )
                 )
             repository.sendTransitionStep(step(1f, TransitionState.RUNNING))
@@ -244,7 +246,7 @@
                         from = GONE,
                         to = DREAMING,
                         transitionState = TransitionState.RUNNING,
-                        value = 2f
+                        value = 2f,
                     )
                 )
             repository.sendTransitionStep(step(1f, TransitionState.FINISHED))
@@ -254,7 +256,7 @@
                         from = GONE,
                         to = DREAMING,
                         transitionState = TransitionState.FINISHED,
-                        value = null
+                        value = null,
                     )
                 )
         }
@@ -262,11 +264,7 @@
     @Test
     fun sameFloatValueWithTheSameTransitionStateDoesNotEmitTwice() =
         testScope.runTest {
-            val flow =
-                underTest.sharedFlow(
-                    duration = 1000.milliseconds,
-                    onStep = { it },
-                )
+            val flow = underTest.sharedFlow(duration = 1000.milliseconds, onStep = { it })
             val values by collectValues(flow)
             runCurrent()
 
@@ -280,11 +278,7 @@
     @Test
     fun sameFloatValueWithADifferentTransitionStateDoesEmitTwice() =
         testScope.runTest {
-            val flow =
-                underTest.sharedFlow(
-                    duration = 1000.milliseconds,
-                    onStep = { it },
-                )
+            val flow = underTest.sharedFlow(duration = 1000.milliseconds, onStep = { it })
             val values by collectValues(flow)
             runCurrent()
 
@@ -302,14 +296,14 @@
 
     private fun step(
         value: Float,
-        state: TransitionState = TransitionState.RUNNING
+        state: TransitionState = TransitionState.RUNNING,
     ): TransitionStep {
         return TransitionStep(
             from = GONE,
             to = DREAMING,
             value = value,
             transitionState = state,
-            ownerName = "GoneToDreamingTransitionViewModelTest"
+            ownerName = "GoneToDreamingTransitionViewModelTest",
         )
     }
 }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprintTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprintTest.kt
index 3a016ff..6377080 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprintTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprintTest.kt
@@ -40,7 +40,6 @@
 import com.android.systemui.keyguard.ui.view.layout.sections.DefaultUdfpsAccessibilityOverlaySection
 import com.android.systemui.keyguard.ui.view.layout.sections.KeyguardSliceViewSection
 import com.android.systemui.keyguard.ui.view.layout.sections.SmartspaceSection
-import com.android.systemui.keyguard.ui.view.layout.sections.SplitShadeGuidelines
 import com.android.systemui.util.mockito.whenever
 import java.util.Optional
 import org.junit.Before
@@ -66,7 +65,6 @@
     @Mock private lateinit var defaultSettingsPopupMenuSection: DefaultSettingsPopupMenuSection
     @Mock private lateinit var defaultStatusBarViewSection: DefaultStatusBarSection
     @Mock private lateinit var defaultNSSLSection: DefaultNotificationStackScrollLayoutSection
-    @Mock private lateinit var splitShadeGuidelines: SplitShadeGuidelines
     @Mock private lateinit var aodPromotedNotificationSection: AodPromotedNotificationSection
     @Mock private lateinit var aodNotificationIconsSection: AodNotificationIconsSection
     @Mock private lateinit var aodBurnInSection: AodBurnInSection
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryBackgroundViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryBackgroundViewModelTest.kt
index c8fade3..6648ae2 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryBackgroundViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryBackgroundViewModelTest.kt
@@ -24,6 +24,7 @@
 import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
 import com.android.systemui.keyguard.shared.model.KeyguardState
 import com.android.systemui.keyguard.shared.model.TransitionState
+import com.android.systemui.keyguard.shared.model.TransitionState.FINISHED
 import com.android.systemui.keyguard.shared.model.TransitionState.RUNNING
 import com.android.systemui.keyguard.shared.model.TransitionState.STARTED
 import com.android.systemui.keyguard.shared.model.TransitionStep
@@ -63,7 +64,15 @@
             )
             runCurrent()
 
-            assertThat(alpha).isEqualTo(0.0f)
+            assertThat(alpha).isEqualTo(1.0f)
+
+            kosmos.fakeKeyguardTransitionRepository.sendTransitionSteps(
+                listOf(lockscreenToDozing(1f, FINISHED)),
+                testScope,
+            )
+            runCurrent()
+
+            assertThat(alpha).isEqualTo(0f)
         }
 
     private fun lockscreenToDozing(value: Float, state: TransitionState = RUNNING): TransitionStep {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/DozingToDreamingTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/DozingToDreamingTransitionViewModelTest.kt
new file mode 100644
index 0000000..052dfd5
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/DozingToDreamingTransitionViewModelTest.kt
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.keyguard.ui.viewmodel
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
+import com.android.systemui.keyguard.shared.model.KeyguardState
+import com.android.systemui.kosmos.collectValues
+import com.android.systemui.kosmos.runTest
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.testKosmos
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class DozingToDreamingTransitionViewModelTest : SysuiTestCase() {
+    val kosmos = testKosmos()
+
+    val underTest by lazy { kosmos.dozingToDreamingTransitionViewModel }
+
+    @Test
+    fun notificationShadeAlpha() =
+        kosmos.runTest {
+            val values by collectValues(underTest.notificationAlpha)
+            assertThat(values).isEmpty()
+
+            fakeKeyguardTransitionRepository.sendTransitionSteps(
+                from = KeyguardState.DOZING,
+                to = KeyguardState.DREAMING,
+                testScope,
+            )
+
+            assertThat(values).isNotEmpty()
+            values.forEach { assertThat(it).isEqualTo(0) }
+        }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelTest.kt
index 8a599a1..20d015f 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelTest.kt
@@ -27,7 +27,6 @@
 import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
 import com.android.systemui.keyguard.data.repository.keyguardClockRepository
 import com.android.systemui.keyguard.shared.model.ClockSize
-import com.android.systemui.keyguard.shared.model.ClockSizeSetting
 import com.android.systemui.keyguard.shared.model.KeyguardState
 import com.android.systemui.keyguard.ui.viewmodel.KeyguardClockViewModel.ClockLayout
 import com.android.systemui.kosmos.testScope
@@ -55,17 +54,18 @@
 @SmallTest
 @RunWith(ParameterizedAndroidJunit4::class)
 class KeyguardClockViewModelTest(flags: FlagsParameterization) : SysuiTestCase() {
-    val kosmos = testKosmos()
-    val testScope = kosmos.testScope
-    val underTest by lazy { kosmos.keyguardClockViewModel }
-    val res = context.resources
 
-    @Mock lateinit var clockController: ClockController
-    @Mock lateinit var largeClock: ClockFaceController
-    @Mock lateinit var smallClock: ClockFaceController
+    private val kosmos = testKosmos()
+    private val testScope = kosmos.testScope
+    private val underTest by lazy { kosmos.keyguardClockViewModel }
+    private val res = context.resources
 
-    var config = ClockConfig("TEST", "Test", "")
-    var faceConfig = ClockFaceConfig()
+    @Mock private lateinit var clockController: ClockController
+    @Mock private lateinit var largeClock: ClockFaceController
+    @Mock private lateinit var smallClock: ClockFaceController
+
+    private var config = ClockConfig("TEST", "Test", "")
+    private var faceConfig = ClockFaceConfig()
 
     init {
         mSetFlagsRule.setFlagsParameterization(flags)
@@ -196,35 +196,6 @@
         }
 
     @Test
-    fun testClockSize_alwaysSmallClockSize() =
-        testScope.runTest {
-            val value by collectLastValue(underTest.clockSize)
-
-            with(kosmos) {
-                fakeKeyguardClockRepository.setSelectedClockSize(ClockSizeSetting.SMALL)
-                keyguardClockRepository.setClockSize(ClockSize.LARGE)
-            }
-
-            assertThat(value).isEqualTo(ClockSize.SMALL)
-        }
-
-    @Test
-    @DisableSceneContainer
-    fun testClockSize_dynamicClockSize() =
-        testScope.runTest {
-            with(kosmos) {
-                val value by collectLastValue(underTest.clockSize)
-                fakeKeyguardClockRepository.setSelectedClockSize(ClockSizeSetting.DYNAMIC)
-
-                keyguardClockRepository.setClockSize(ClockSize.SMALL)
-                assertThat(value).isEqualTo(ClockSize.SMALL)
-
-                keyguardClockRepository.setClockSize(ClockSize.LARGE)
-                assertThat(value).isEqualTo(ClockSize.LARGE)
-            }
-        }
-
-    @Test
     fun isLargeClockVisible_whenLargeClockSize_isTrue() =
         testScope.runTest {
             val value by collectLastValue(underTest.isLargeClockVisible)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardMediaViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardMediaViewModelTest.kt
index 38829da..583fd1e 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardMediaViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardMediaViewModelTest.kt
@@ -26,6 +26,7 @@
 import com.android.systemui.lifecycle.activateIn
 import com.android.systemui.media.controls.data.repository.mediaFilterRepository
 import com.android.systemui.media.controls.shared.model.MediaData
+import com.android.systemui.shade.data.repository.shadeRepository
 import com.android.systemui.testKosmos
 import com.google.common.truth.Truth.assertThat
 import org.junit.Before
@@ -81,4 +82,20 @@
 
             assertThat(underTest.isMediaVisible).isFalse()
         }
+
+    @Test
+    fun isShadeLayoutWide_withConfigTrue_true() =
+        kosmos.runTest {
+            shadeRepository.setShadeLayoutWide(true)
+
+            assertThat(underTest.isShadeLayoutWide).isTrue()
+        }
+
+    @Test
+    fun isShadeLayoutWide_withConfigFalse_false() =
+        kosmos.runTest {
+            shadeRepository.setShadeLayoutWide(false)
+
+            assertThat(underTest.isShadeLayoutWide).isFalse()
+        }
 }
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 af02527..25c1572 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
@@ -17,6 +17,7 @@
 package com.android.systemui.keyguard.ui.viewmodel
 
 import android.platform.test.flag.junit.FlagsParameterization
+import androidx.compose.ui.Alignment
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.biometrics.authController
@@ -26,10 +27,13 @@
 import com.android.systemui.keyguard.data.repository.fakeKeyguardClockRepository
 import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
 import com.android.systemui.keyguard.data.repository.keyguardOcclusionRepository
+import com.android.systemui.keyguard.domain.interactor.keyguardClockInteractor
 import com.android.systemui.keyguard.shared.model.ClockSize
 import com.android.systemui.keyguard.shared.model.KeyguardState
 import com.android.systemui.keyguard.shared.transition.fakeKeyguardTransitionAnimationCallback
 import com.android.systemui.keyguard.shared.transition.keyguardTransitionAnimationCallbackDelegator
+import com.android.systemui.keyguard.ui.viewmodel.LockscreenContentViewModel.NotificationsPlacement.BelowClock
+import com.android.systemui.keyguard.ui.viewmodel.LockscreenContentViewModel.NotificationsPlacement.BesideClock
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.kosmos.collectLastValue
 import com.android.systemui.kosmos.runCurrent
@@ -41,6 +45,9 @@
 import com.android.systemui.scene.shared.model.Scenes
 import com.android.systemui.shade.data.repository.shadeRepository
 import com.android.systemui.shade.domain.interactor.enableDualShade
+import com.android.systemui.shade.domain.interactor.enableSingleShade
+import com.android.systemui.shade.domain.interactor.enableSplitShade
+import com.android.systemui.shade.shared.model.ShadeMode
 import com.android.systemui.testKosmos
 import com.android.systemui.unfold.fakeUnfoldTransitionProgressProvider
 import com.android.systemui.util.mockito.whenever
@@ -99,136 +106,140 @@
         }
 
     @Test
-    @DisableSceneContainer
-    fun clockSize_withLargeClock_true() =
+    fun notificationsPlacement_splitShade_topEnd() =
         kosmos.runTest {
-            val clockSize by collectLastValue(underTest.clockSize)
-            fakeKeyguardClockRepository.setClockSize(ClockSize.LARGE)
-            assertThat(clockSize).isEqualTo(ClockSize.LARGE)
+            setupState(shadeMode = ShadeMode.Split, clockSize = ClockSize.SMALL)
+
+            assertThat(underTest.notificationsPlacement)
+                .isEqualTo(BesideClock(alignment = Alignment.TopEnd))
         }
 
     @Test
-    @DisableSceneContainer
-    fun clockSize_withSmallClock_false() =
+    fun notificationsPlacement_singleShade_below() =
         kosmos.runTest {
-            val clockSize by collectLastValue(underTest.clockSize)
-            fakeKeyguardClockRepository.setClockSize(ClockSize.SMALL)
-            assertThat(clockSize).isEqualTo(ClockSize.SMALL)
+            setupState(shadeMode = ShadeMode.Single, clockSize = ClockSize.SMALL)
+
+            assertThat(underTest.notificationsPlacement).isEqualTo(BelowClock)
+        }
+
+    @Test
+    fun notificationsPlacement_dualShadeSmallClock_below() =
+        kosmos.runTest {
+            setupState(
+                shadeMode = ShadeMode.Dual,
+                clockSize = ClockSize.SMALL,
+                shadeLayoutWide = true,
+            )
+
+            assertThat(underTest.notificationsPlacement).isEqualTo(BelowClock)
+        }
+
+    @Test
+    fun notificationsPlacement_dualShadeLargeClock_topStart() =
+        kosmos.runTest {
+            setupState(
+                shadeMode = ShadeMode.Dual,
+                clockSize = ClockSize.LARGE,
+                shadeLayoutWide = true,
+            )
+
+            assertThat(underTest.notificationsPlacement)
+                .isEqualTo(BesideClock(alignment = Alignment.TopStart))
         }
 
     @Test
     fun areNotificationsVisible_splitShadeTrue_true() =
         kosmos.runTest {
-            val areNotificationsVisible by collectLastValue(underTest.areNotificationsVisible())
-            shadeRepository.setShadeLayoutWide(true)
-            fakeKeyguardClockRepository.setClockSize(ClockSize.LARGE)
+            setupState(shadeMode = ShadeMode.Split, clockSize = ClockSize.LARGE)
 
-            assertThat(areNotificationsVisible).isTrue()
+            assertThat(underTest.areNotificationsVisible).isTrue()
         }
 
     @Test
     fun areNotificationsVisible_dualShadeWideOnLockscreen_true() =
         kosmos.runTest {
-            val areNotificationsVisible by collectLastValue(underTest.areNotificationsVisible())
-            kosmos.enableDualShade()
-            shadeRepository.setShadeLayoutWide(true)
-            fakeKeyguardClockRepository.setClockSize(ClockSize.LARGE)
+            setupState(
+                shadeMode = ShadeMode.Dual,
+                clockSize = ClockSize.LARGE,
+                shadeLayoutWide = true,
+            )
 
-            assertThat(areNotificationsVisible).isTrue()
+            assertThat(underTest.areNotificationsVisible).isTrue()
         }
 
     @Test
     @DisableSceneContainer
     fun areNotificationsVisible_withSmallClock_true() =
         kosmos.runTest {
-            val areNotificationsVisible by collectLastValue(underTest.areNotificationsVisible())
-            fakeKeyguardClockRepository.setClockSize(ClockSize.SMALL)
-            assertThat(areNotificationsVisible).isTrue()
+            setupState(shadeMode = ShadeMode.Single, clockSize = ClockSize.SMALL)
+
+            assertThat(underTest.areNotificationsVisible).isTrue()
         }
 
     @Test
     @DisableSceneContainer
     fun areNotificationsVisible_withLargeClock_false() =
         kosmos.runTest {
-            val areNotificationsVisible by collectLastValue(underTest.areNotificationsVisible())
-            fakeKeyguardClockRepository.setClockSize(ClockSize.LARGE)
-            assertThat(areNotificationsVisible).isFalse()
-        }
+            setupState(shadeMode = ShadeMode.Single, clockSize = ClockSize.LARGE)
 
-    @Test
-    fun isShadeLayoutWide_withConfigTrue_true() =
-        kosmos.runTest {
-            val isShadeLayoutWide by collectLastValue(underTest.isShadeLayoutWide)
-            shadeRepository.setShadeLayoutWide(true)
-
-            assertThat(isShadeLayoutWide).isTrue()
-        }
-
-    @Test
-    fun isShadeLayoutWide_withConfigFalse_false() =
-        kosmos.runTest {
-            val isShadeLayoutWide by collectLastValue(underTest.isShadeLayoutWide)
-            shadeRepository.setShadeLayoutWide(false)
-
-            assertThat(isShadeLayoutWide).isFalse()
+            assertThat(underTest.areNotificationsVisible).isFalse()
         }
 
     @Test
     fun unfoldTranslations() =
         kosmos.runTest {
             val maxTranslation = prepareConfiguration()
-            val translations by collectLastValue(underTest.unfoldTranslations)
 
             val unfoldProvider = fakeUnfoldTransitionProgressProvider
             unfoldProvider.onTransitionStarted()
-            assertThat(translations?.start).isEqualTo(0f)
-            assertThat(translations?.end).isEqualTo(-0f)
+            runCurrent()
+            assertThat(underTest.unfoldTranslations.start).isZero()
+            assertThat(underTest.unfoldTranslations.end).isZero()
 
             repeat(10) { repetition ->
                 val transitionProgress = 0.1f * (repetition + 1)
                 unfoldProvider.onTransitionProgress(transitionProgress)
-                assertThat(translations?.start).isEqualTo((1 - transitionProgress) * maxTranslation)
-                assertThat(translations?.end).isEqualTo(-(1 - transitionProgress) * maxTranslation)
+                runCurrent()
+                assertThat(underTest.unfoldTranslations.start)
+                    .isEqualTo((1 - transitionProgress) * maxTranslation)
+                assertThat(underTest.unfoldTranslations.end)
+                    .isEqualTo(-(1 - transitionProgress) * maxTranslation)
             }
 
             unfoldProvider.onTransitionFinishing()
-            assertThat(translations?.start).isEqualTo(0f)
-            assertThat(translations?.end).isEqualTo(-0f)
+            runCurrent()
+            assertThat(underTest.unfoldTranslations.start).isZero()
+            assertThat(underTest.unfoldTranslations.end).isZero()
 
             unfoldProvider.onTransitionFinished()
-            assertThat(translations?.start).isEqualTo(0f)
-            assertThat(translations?.end).isEqualTo(-0f)
+            runCurrent()
+            assertThat(underTest.unfoldTranslations.start).isZero()
+            assertThat(underTest.unfoldTranslations.end).isZero()
         }
 
     @Test
     fun isContentVisible_whenNotOccluded_visible() =
         kosmos.runTest {
-            val isContentVisible by collectLastValue(underTest.isContentVisible)
-
             keyguardOcclusionRepository.setShowWhenLockedActivityInfo(false, null)
             runCurrent()
-            assertThat(isContentVisible).isTrue()
+            assertThat(underTest.isContentVisible).isTrue()
         }
 
     @Test
     fun isContentVisible_whenOccluded_notVisible() =
         kosmos.runTest {
-            val isContentVisible by collectLastValue(underTest.isContentVisible)
-
             keyguardOcclusionRepository.setShowWhenLockedActivityInfo(true, null)
             fakeKeyguardTransitionRepository.transitionTo(
                 KeyguardState.LOCKSCREEN,
                 KeyguardState.OCCLUDED,
             )
             runCurrent()
-            assertThat(isContentVisible).isFalse()
+            assertThat(underTest.isContentVisible).isFalse()
         }
 
     @Test
     fun isContentVisible_whenOccluded_notVisible_evenIfShadeShown() =
         kosmos.runTest {
-            val isContentVisible by collectLastValue(underTest.isContentVisible)
-
             keyguardOcclusionRepository.setShowWhenLockedActivityInfo(true, null)
             fakeKeyguardTransitionRepository.transitionTo(
                 KeyguardState.LOCKSCREEN,
@@ -238,7 +249,7 @@
 
             sceneInteractor.snapToScene(Scenes.Shade, "")
             runCurrent()
-            assertThat(isContentVisible).isFalse()
+            assertThat(underTest.isContentVisible).isFalse()
         }
 
     @Test
@@ -260,17 +271,16 @@
     @Test
     fun isContentVisible_whenOccluded_notVisibleInOccluded_visibleInAod() =
         kosmos.runTest {
-            val isContentVisible by collectLastValue(underTest.isContentVisible)
             keyguardOcclusionRepository.setShowWhenLockedActivityInfo(true, null)
             fakeKeyguardTransitionRepository.transitionTo(
-                KeyguardState.LOCKSCREEN,
-                KeyguardState.OCCLUDED,
+                from = KeyguardState.LOCKSCREEN,
+                to = KeyguardState.OCCLUDED,
             )
             runCurrent()
 
             sceneInteractor.snapToScene(Scenes.Shade, "")
             runCurrent()
-            assertThat(isContentVisible).isFalse()
+            assertThat(underTest.isContentVisible).isFalse()
 
             fakeKeyguardTransitionRepository.transitionTo(KeyguardState.OCCLUDED, KeyguardState.AOD)
             runCurrent()
@@ -278,9 +288,30 @@
             sceneInteractor.snapToScene(Scenes.Lockscreen, "")
             runCurrent()
 
-            assertThat(isContentVisible).isTrue()
+            assertThat(underTest.isContentVisible).isTrue()
         }
 
+    private fun Kosmos.setupState(
+        shadeMode: ShadeMode,
+        clockSize: ClockSize,
+        shadeLayoutWide: Boolean? = null,
+    ) {
+        val isShadeLayoutWide by collectLastValue(kosmos.shadeRepository.isShadeLayoutWide)
+        val collectedClockSize by collectLastValue(kosmos.keyguardClockInteractor.clockSize)
+        when (shadeMode) {
+            ShadeMode.Dual -> kosmos.enableDualShade(wideLayout = shadeLayoutWide)
+            ShadeMode.Single -> kosmos.enableSingleShade()
+            ShadeMode.Split -> kosmos.enableSplitShade()
+        }
+        fakeKeyguardClockRepository.setShouldForceSmallClock(clockSize == ClockSize.SMALL)
+        fakeKeyguardClockRepository.setClockSize(clockSize)
+        runCurrent()
+        if (shadeLayoutWide != null) {
+            assertThat(isShadeLayoutWide).isEqualTo(shadeLayoutWide)
+        }
+        assertThat(collectedClockSize).isEqualTo(clockSize)
+    }
+
     private fun prepareConfiguration(): Int {
         val configuration = context.resources.configuration
         configuration.setLayoutDirection(Locale.US)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenUserActionsViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenUserActionsViewModelTest.kt
index 47ca4b1..f357d0c 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenUserActionsViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenUserActionsViewModelTest.kt
@@ -69,7 +69,7 @@
         @Parameters(
             name =
                 "canSwipeToEnter={0}, downWithTwoPointers={1}, downFromEdge={2}," +
-                    " isSingleShade={3}, isShadeTouchable={4}, isOccluded={6}"
+                    " isSingleShade={3}, isShadeTouchable={4}, isOccluded={5}"
         )
         @JvmStatic
         fun combinations() = buildList {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/ui/view/MediaCarouselScrollHandlerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/ui/view/MediaCarouselScrollHandlerTest.kt
index d073cf1..c2f0ab9 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/ui/view/MediaCarouselScrollHandlerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/ui/view/MediaCarouselScrollHandlerTest.kt
@@ -16,8 +16,11 @@
 
 package com.android.systemui.media.controls.ui.view
 
+import android.content.res.Resources
 import android.testing.TestableLooper
 import android.view.MotionEvent
+import android.view.View
+import android.view.ViewGroup
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
@@ -25,16 +28,21 @@
 import com.android.systemui.plugins.FalsingManager
 import com.android.systemui.qs.PageIndicator
 import com.android.systemui.util.concurrency.FakeExecutor
-import com.android.systemui.util.mockito.eq
-import com.android.systemui.util.mockito.whenever
 import com.android.systemui.util.time.FakeSystemClock
+import com.android.wm.shell.shared.animation.PhysicsAnimatorTestUtils
+import org.junit.After
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
+import org.mockito.ArgumentMatchers.anyFloat
 import org.mockito.Mock
 import org.mockito.Mockito.anyInt
+import org.mockito.Mockito.eq
+import org.mockito.Mockito.never
 import org.mockito.Mockito.verify
 import org.mockito.MockitoAnnotations
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.whenever
 
 @SmallTest
 @TestableLooper.RunWithLooper(setAsMainLooper = true)
@@ -42,7 +50,9 @@
 class MediaCarouselScrollHandlerTest : SysuiTestCase() {
 
     private val carouselWidth = 1038
+    private val settingsButtonWidth = 200
     private val motionEventUp = MotionEvent.obtain(0, 0, MotionEvent.ACTION_UP, 0f, 0f, 0)
+    private lateinit var testableLooper: TestableLooper
 
     @Mock lateinit var mediaCarousel: MediaScrollView
     @Mock lateinit var pageIndicator: PageIndicator
@@ -53,6 +63,9 @@
     @Mock lateinit var falsingManager: FalsingManager
     @Mock lateinit var logSmartspaceImpression: (Boolean) -> Unit
     @Mock lateinit var logger: MediaUiEventLogger
+    @Mock lateinit var contentContainer: ViewGroup
+    @Mock lateinit var settingsButton: View
+    @Mock lateinit var resources: Resources
 
     lateinit var executor: FakeExecutor
     private val clock = FakeSystemClock()
@@ -63,6 +76,11 @@
     fun setup() {
         MockitoAnnotations.initMocks(this)
         executor = FakeExecutor(clock)
+        testableLooper = TestableLooper.get(this)
+        PhysicsAnimatorTestUtils.prepareForTest()
+        PhysicsAnimatorTestUtils.setAllAnimationsBlock(true)
+
+        whenever(mediaCarousel.contentContainer).thenReturn(contentContainer)
         mediaCarouselScrollHandler =
             MediaCarouselScrollHandler(
                 mediaCarousel,
@@ -74,13 +92,17 @@
                 closeGuts,
                 falsingManager,
                 logSmartspaceImpression,
-                logger
+                logger,
             )
         mediaCarouselScrollHandler.playerWidthPlusPadding = carouselWidth
-
         whenever(mediaCarousel.touchListener).thenReturn(mediaCarouselScrollHandler.touchListener)
     }
 
+    @After
+    fun tearDown() {
+        PhysicsAnimatorTestUtils.tearDown()
+    }
+
     @Test
     fun testCarouselScroll_shortScroll() {
         whenever(mediaCarousel.isLayoutRtl).thenReturn(false)
@@ -128,4 +150,109 @@
 
         verify(mediaCarousel).smoothScrollTo(eq(0), anyInt())
     }
+
+    @Test
+    fun testCarouselScrollByStep_scrollRight() {
+        setupMediaContainer(visibleIndex = 0)
+
+        mediaCarouselScrollHandler.scrollByStep(1)
+        clock.advanceTime(DISMISS_DELAY)
+        executor.runAllReady()
+
+        verify(mediaCarousel).smoothScrollTo(eq(carouselWidth), anyInt())
+    }
+
+    @Test
+    fun testCarouselScrollByStep_scrollLeft() {
+        setupMediaContainer(visibleIndex = 1)
+
+        mediaCarouselScrollHandler.scrollByStep(-1)
+        clock.advanceTime(DISMISS_DELAY)
+        executor.runAllReady()
+
+        verify(mediaCarousel).smoothScrollTo(eq(0), anyInt())
+    }
+
+    @Test
+    fun testCarouselScrollByStep_scrollRight_alreadyAtEnd() {
+        setupMediaContainer(visibleIndex = 1)
+
+        mediaCarouselScrollHandler.scrollByStep(1)
+        clock.advanceTime(DISMISS_DELAY)
+        executor.runAllReady()
+
+        verify(mediaCarousel, never()).smoothScrollTo(anyInt(), anyInt())
+        verify(mediaCarousel).animationTargetX = eq(-settingsButtonWidth.toFloat())
+    }
+
+    @Test
+    fun testCarouselScrollByStep_scrollLeft_alreadyAtStart() {
+        setupMediaContainer(visibleIndex = 0)
+
+        mediaCarouselScrollHandler.scrollByStep(-1)
+        clock.advanceTime(DISMISS_DELAY)
+        executor.runAllReady()
+
+        verify(mediaCarousel, never()).smoothScrollTo(anyInt(), anyInt())
+        verify(mediaCarousel).animationTargetX = eq(settingsButtonWidth.toFloat())
+    }
+
+    @Test
+    fun testCarouselScrollByStep_scrollLeft_alreadyAtStart_isRTL() {
+        setupMediaContainer(visibleIndex = 0)
+        PhysicsAnimatorTestUtils.setAllAnimationsBlock(true)
+        whenever(mediaCarousel.isLayoutRtl).thenReturn(true)
+
+        mediaCarouselScrollHandler.scrollByStep(-1)
+        clock.advanceTime(DISMISS_DELAY)
+        executor.runAllReady()
+
+        verify(mediaCarousel, never()).smoothScrollTo(anyInt(), anyInt())
+        verify(mediaCarousel).animationTargetX = eq(-settingsButtonWidth.toFloat())
+    }
+
+    @Test
+    fun testCarouselScrollByStep_scrollRight_alreadyAtEnd_isRTL() {
+        setupMediaContainer(visibleIndex = 1)
+        PhysicsAnimatorTestUtils.setAllAnimationsBlock(true)
+        whenever(mediaCarousel.isLayoutRtl).thenReturn(true)
+
+        mediaCarouselScrollHandler.scrollByStep(1)
+        clock.advanceTime(DISMISS_DELAY)
+        executor.runAllReady()
+
+        verify(mediaCarousel, never()).smoothScrollTo(anyInt(), anyInt())
+        verify(mediaCarousel).animationTargetX = eq(settingsButtonWidth.toFloat())
+    }
+
+    @Test
+    fun testScrollByStep_noScroll_notDismissible() {
+        setupMediaContainer(visibleIndex = 1, showsSettingsButton = false)
+
+        mediaCarouselScrollHandler.scrollByStep(1)
+        clock.advanceTime(DISMISS_DELAY)
+        executor.runAllReady()
+
+        verify(mediaCarousel, never()).smoothScrollTo(anyInt(), anyInt())
+        verify(mediaCarousel, never()).animationTargetX = anyFloat()
+    }
+
+    private fun setupMediaContainer(visibleIndex: Int, showsSettingsButton: Boolean = true) {
+        whenever(contentContainer.childCount).thenReturn(2)
+        val child1: View = mock()
+        val child2: View = mock()
+        whenever(child1.left).thenReturn(0)
+        whenever(child2.left).thenReturn(carouselWidth)
+        whenever(contentContainer.getChildAt(0)).thenReturn(child1)
+        whenever(contentContainer.getChildAt(1)).thenReturn(child2)
+
+        whenever(settingsButton.width).thenReturn(settingsButtonWidth)
+        whenever(settingsButton.context).thenReturn(context)
+        whenever(settingsButton.resources).thenReturn(resources)
+        whenever(settingsButton.resources.getDimensionPixelSize(anyInt())).thenReturn(20)
+        mediaCarouselScrollHandler.onSettingsButtonUpdated(settingsButton)
+
+        mediaCarouselScrollHandler.visibleMediaIndex = visibleIndex
+        mediaCarouselScrollHandler.showsSettingsButton = showsSettingsButton
+    }
 }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/dialog/MediaOutputAdapterTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/dialog/MediaOutputAdapterTest.java
index 847044a..f5a7111 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/dialog/MediaOutputAdapterTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/dialog/MediaOutputAdapterTest.java
@@ -240,6 +240,8 @@
     @DisableFlags(Flags.FLAG_ENABLE_OUTPUT_SWITCHER_DEVICE_GROUPING)
     @Test
     public void onBindViewHolder_bindConnectedRemoteDevice_verifyView() {
+        when(mMediaSwitchingController.getSelectedMediaDevice())
+                .thenReturn(ImmutableList.of(mMediaDevice1));
         when(mMediaSwitchingController.getSelectableMediaDevice())
                 .thenReturn(ImmutableList.of(mMediaDevice2));
         when(mMediaSwitchingController.isCurrentConnectedDeviceRemote()).thenReturn(true);
@@ -386,6 +388,7 @@
         verify(mMediaSwitchingController).logInteractionAdjustVolume(mMediaDevice1);
     }
 
+    @DisableFlags(Flags.FLAG_ENABLE_OUTPUT_SWITCHER_DEVICE_GROUPING)
     @Test
     public void onBindViewHolder_bindSelectableDevice_verifyView() {
         List<MediaDevice> selectableDevices = new ArrayList<>();
@@ -396,10 +399,55 @@
         assertThat(mViewHolder.mProgressBar.getVisibility()).isEqualTo(View.GONE);
         assertThat(mViewHolder.mEndTouchArea.getVisibility()).isEqualTo(View.VISIBLE);
         assertThat(mViewHolder.mCheckBox.getVisibility()).isEqualTo(View.VISIBLE);
+        assertThat(mViewHolder.mCheckBox.isChecked()).isFalse();
         assertThat(mViewHolder.mEndClickIcon.getVisibility()).isEqualTo(View.GONE);
         assertThat(mViewHolder.mTitleText.getVisibility()).isEqualTo(View.VISIBLE);
         assertThat(mViewHolder.mTitleText.getText().toString()).isEqualTo(TEST_DEVICE_NAME_2);
         assertThat(mViewHolder.mContainerLayout.isFocusable()).isTrue();
+
+        mViewHolder.mCheckBox.performClick();
+        verify(mMediaSwitchingController).addDeviceToPlayMedia(mMediaDevice2);
+    }
+
+    @DisableFlags(Flags.FLAG_ENABLE_OUTPUT_SWITCHER_DEVICE_GROUPING)
+    @Test
+    public void onBindViewHolder_bindDeselectableDevice_verifyView() {
+        when(mMediaSwitchingController.getSelectedMediaDevice()).thenReturn(
+                List.of(mMediaDevice1, mMediaDevice2));
+        when(mMediaSwitchingController.getDeselectableMediaDevice()).thenReturn(
+                List.of(mMediaDevice1, mMediaDevice2));
+        mMediaOutputAdapter.onBindViewHolder(mViewHolder, 1);
+
+        assertThat(mViewHolder.mEndTouchArea.getVisibility()).isEqualTo(View.VISIBLE);
+        assertThat(mViewHolder.mCheckBox.getVisibility()).isEqualTo(View.VISIBLE);
+        assertThat(mViewHolder.mCheckBox.isChecked()).isTrue();
+        assertThat(mViewHolder.mEndClickIcon.getVisibility()).isEqualTo(View.GONE);
+
+        mViewHolder.mCheckBox.performClick();
+        verify(mMediaSwitchingController).removeDeviceFromPlayMedia(mMediaDevice2);
+    }
+
+    @DisableFlags(Flags.FLAG_ENABLE_OUTPUT_SWITCHER_DEVICE_GROUPING)
+    @Test
+    public void onBindViewHolder_changingSelectedValue_doesntTriggerChangeListener() {
+        List<MediaDevice> selectableDevices = List.of(mMediaDevice2);
+        List<MediaDevice> selectedDevices = new ArrayList<>();
+        selectedDevices.add(mMediaDevice1);
+        when(mMediaSwitchingController.getSelectableMediaDevice()).thenReturn(selectableDevices);
+        when(mMediaSwitchingController.getSelectedMediaDevice()).thenReturn(selectedDevices);
+
+        // mMediaDevice2 is selected
+        mMediaOutputAdapter.onBindViewHolder(mViewHolder, 1);
+        assertThat(mViewHolder.mCheckBox.isChecked()).isFalse();
+
+        // changing the selected state programmatically (not a user click)
+        selectedDevices.add(mMediaDevice2);
+        mMediaOutputAdapter.onBindViewHolder(mViewHolder, 1);
+        assertThat(mViewHolder.mCheckBox.isChecked()).isTrue();
+
+        // The onCheckedChangeListener is not invoked
+        verify(mMediaSwitchingController, never()).addDeviceToPlayMedia(mMediaDevice2);
+        verify(mMediaSwitchingController, never()).removeDeviceFromPlayMedia(mMediaDevice2);
     }
 
     @Test
@@ -808,6 +856,8 @@
                 .thenReturn(ImmutableList.of(mMediaDevice2));
         when(mMediaSwitchingController.getDeselectableMediaDevice())
                 .thenReturn(ImmutableList.of(mMediaDevice1));
+        when(mMediaSwitchingController.getSelectedMediaDevice())
+                .thenReturn(ImmutableList.of(mMediaDevice1));
         when(mMediaSwitchingController.isCurrentConnectedDeviceRemote()).thenReturn(true);
         mViewHolder = (MediaOutputAdapter.MediaDeviceViewHolder) mMediaOutputAdapter
                 .onCreateViewHolder(new LinearLayout(mContext), 0);
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QuickQSPanelControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QuickQSPanelControllerTest.kt
index 896ca26..3c8857f 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QuickQSPanelControllerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QuickQSPanelControllerTest.kt
@@ -17,11 +17,14 @@
 package com.android.systemui.qs
 
 import android.content.res.Configuration
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
 import android.view.ContextThemeWrapper
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import com.android.internal.logging.MetricsLogger
 import com.android.internal.logging.testing.UiEventLoggerFake
+import com.android.systemui.Flags
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.dump.DumpManager
 import com.android.systemui.haptics.qs.QSLongPressEffect
@@ -33,6 +36,7 @@
 import com.android.systemui.qs.logging.QSLogger
 import com.android.systemui.res.R
 import com.android.systemui.statusbar.policy.ConfigurationController
+import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener
 import com.android.systemui.statusbar.policy.ResourcesSplitShadeStateController
 import com.android.systemui.util.leak.RotationUtils
 import javax.inject.Provider
@@ -63,6 +67,7 @@
     @Mock private lateinit var tile: QSTile
     @Mock private lateinit var tileLayout: TileLayout
     @Captor private lateinit var captor: ArgumentCaptor<QSPanel.OnConfigurationChangedListener>
+    @Captor private lateinit var configCaptor: ArgumentCaptor<ConfigurationListener>
     @Mock private lateinit var longPressEffectProvider: Provider<QSLongPressEffect>
     @Mock private lateinit var mediaCarouselInteractor: MediaCarouselInteractor
     @Mock private lateinit var configurationController: ConfigurationController
@@ -135,7 +140,8 @@
     }
 
     @Test
-    fun mediaExpansion_afterConfigChange_inLandscape_collapsedInLandscapeTrue_updatesToCollapsed() {
+    @DisableFlags(Flags.FLAG_SHADE_WINDOW_GOES_AROUND)
+    fun mediaExpansion_afterConfigChange_inLandscape_collapsedInLandscapeTrue_updatesToCollapsed_old() {
         verify(quickQSPanel).addOnConfigurationChangedListener(captor.capture())
 
         // verify that media starts in the expanded state by default
@@ -150,7 +156,24 @@
     }
 
     @Test
-    fun mediaExpansion_afterConfigChange_landscape_collapsedInLandscapeFalse_remainsExpanded() {
+    @EnableFlags(Flags.FLAG_SHADE_WINDOW_GOES_AROUND)
+    fun mediaExpansion_afterConfigChange_inLandscape_collapsedInLandscapeTrue_updatesToCollapsed() {
+        verify(configurationController).addCallback(configCaptor.capture())
+
+        // verify that media starts in the expanded state by default
+        verify(mediaHost).expansion = MediaHostState.EXPANDED
+
+        // Rotate device, verify media size updated to collapsed
+        usingCollapsedLandscapeMedia = true
+        controller.setRotation(RotationUtils.ROTATION_LANDSCAPE)
+        configCaptor.allValues.forEach { it.onConfigChanged(Configuration.EMPTY) }
+
+        verify(mediaHost).expansion = MediaHostState.COLLAPSED
+    }
+
+    @Test
+    @DisableFlags(Flags.FLAG_SHADE_WINDOW_GOES_AROUND)
+    fun mediaExpansion_afterConfigChange_landscape_collapsedInLandscapeFalse_remainsExpanded_old() {
         verify(quickQSPanel).addOnConfigurationChangedListener(captor.capture())
         reset(mediaHost)
 
@@ -161,6 +184,19 @@
         verify(mediaHost).expansion = MediaHostState.EXPANDED
     }
 
+    @Test
+    @EnableFlags(Flags.FLAG_SHADE_WINDOW_GOES_AROUND)
+    fun mediaExpansion_afterConfigChange_landscape_collapsedInLandscapeFalse_remainsExpanded() {
+        verify(configurationController).addCallback(configCaptor.capture())
+        reset(mediaHost)
+
+        usingCollapsedLandscapeMedia = false
+        controller.setRotation(RotationUtils.ROTATION_LANDSCAPE)
+        configCaptor.allValues.forEach { it.onConfigChanged(Configuration.EMPTY) }
+
+        verify(mediaHost).expansion = MediaHostState.EXPANDED
+    }
+
     class TestQuickQSPanelController(
         view: QuickQSPanel,
         qsHost: QSHost,
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/InternetTileNewImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/InternetTileNewImplTest.kt
index 64e6f4b..7ed3cb3 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/InternetTileNewImplTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/InternetTileNewImplTest.kt
@@ -34,7 +34,6 @@
 import com.android.systemui.qs.logging.QSLogger
 import com.android.systemui.qs.tiles.dialog.InternetDetailsViewModel
 import com.android.systemui.qs.tiles.dialog.InternetDialogManager
-import com.android.systemui.qs.tiles.dialog.WifiStateWorker
 import com.android.systemui.res.R
 import com.android.systemui.statusbar.connectivity.AccessPointController
 import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirplaneModeRepository
@@ -61,9 +60,6 @@
 import org.junit.runner.RunWith
 import org.mockito.Mock
 import org.mockito.MockitoAnnotations
-import org.mockito.kotlin.eq
-import org.mockito.kotlin.times
-import org.mockito.kotlin.verify
 import org.mockito.kotlin.whenever
 import platform.test.runner.parameterized.ParameterizedAndroidJunit4
 import platform.test.runner.parameterized.Parameters
@@ -99,7 +95,6 @@
     @Mock private lateinit var activityStarter: ActivityStarter
     @Mock private lateinit var logger: QSLogger
     @Mock private lateinit var dialogManager: InternetDialogManager
-    @Mock private lateinit var wifiStateWorker: WifiStateWorker
     @Mock private lateinit var accessPointController: AccessPointController
     @Mock private lateinit var internetDetailsViewModelFactory: InternetDetailsViewModel.Factory
 
@@ -136,7 +131,6 @@
                 logger,
                 viewModel,
                 dialogManager,
-                wifiStateWorker,
                 accessPointController,
                 internetDetailsViewModelFactory,
             )
@@ -245,26 +239,6 @@
             assertThat(underTest.state.secondaryLabel).isEqualTo(WIFI_SSID)
         }
 
-    @Test
-    fun secondaryClick_turnsWifiOff() {
-        whenever(wifiStateWorker.isWifiEnabled).thenReturn(true)
-
-        underTest.secondaryClick(null)
-        looper.processAllMessages()
-
-        verify(wifiStateWorker, times(1)).isWifiEnabled = eq(false)
-    }
-
-    @Test
-    fun secondaryClick_turnsWifiOn() {
-        whenever(wifiStateWorker.isWifiEnabled).thenReturn(false)
-
-        underTest.secondaryClick(null)
-        looper.processAllMessages()
-
-        verify(wifiStateWorker, times(1)).isWifiEnabled = eq(true)
-    }
-
     companion object {
         const val WIFI_SSID = "test ssid"
         val ACTIVE_WIFI =
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/ScreenRecordTileTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/ScreenRecordTileTest.java
index 3a3f537..61d0c8d 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/ScreenRecordTileTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/ScreenRecordTileTest.java
@@ -345,11 +345,21 @@
     public void testNotStartingAndRecording_returnDetailsViewModel() {
         when(mController.isStarting()).thenReturn(false);
         when(mController.isRecording()).thenReturn(false);
+        when(mController.isScreenCaptureDisabled()).thenReturn(false);
         mTile.getDetailsViewModel(Assert::assertNotNull);
     }
 
     @Test
     @EnableFlags(QsDetailedView.FLAG_NAME)
+    public void testRecordingDisabled_notReturnDetailsViewModel() {
+        when(mController.isStarting()).thenReturn(false);
+        when(mController.isRecording()).thenReturn(false);
+        when(mController.isScreenCaptureDisabled()).thenReturn(true);
+        mTile.getDetailsViewModel(Assert::assertNull);
+    }
+
+    @Test
+    @EnableFlags(QsDetailedView.FLAG_NAME)
     public void testStarting_notReturnDetailsViewModel() {
         when(mController.isStarting()).thenReturn(true);
         when(mController.isRecording()).thenReturn(false);
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/internet/domain/InternetTileMapperTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/internet/domain/InternetTileMapperTest.kt
index b087bbc..54a653d 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/internet/domain/InternetTileMapperTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/internet/domain/InternetTileMapperTest.kt
@@ -191,11 +191,7 @@
             label,
             activationState,
             secondaryLabel,
-            setOf(
-                QSTileState.UserAction.CLICK,
-                QSTileState.UserAction.TOGGLE_CLICK,
-                QSTileState.UserAction.LONG_CLICK,
-            ),
+            setOf(QSTileState.UserAction.CLICK, QSTileState.UserAction.LONG_CLICK),
             contentDescription,
             null,
             QSTileState.SideViewIcon.Chevron,
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/internet/domain/interactor/InternetTileUserActionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/internet/domain/interactor/InternetTileUserActionInteractorTest.kt
index ce4a343..3db5efc 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/internet/domain/interactor/InternetTileUserActionInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/internet/domain/interactor/InternetTileUserActionInteractorTest.kt
@@ -29,7 +29,6 @@
 import com.android.systemui.qs.tiles.dialog.InternetDetailsContentManager
 import com.android.systemui.qs.tiles.dialog.InternetDetailsViewModel
 import com.android.systemui.qs.tiles.dialog.InternetDialogManager
-import com.android.systemui.qs.tiles.dialog.WifiStateWorker
 import com.android.systemui.qs.tiles.impl.internet.domain.model.InternetTileModel
 import com.android.systemui.statusbar.connectivity.AccessPointController
 import com.android.systemui.util.mockito.nullable
@@ -56,7 +55,6 @@
     private lateinit var underTest: InternetTileUserActionInteractor
 
     private lateinit var internetDialogManager: InternetDialogManager
-    private lateinit var wifiStateWorker: WifiStateWorker
     private lateinit var controller: AccessPointController
     private lateinit var internetDetailsViewModelFactory: InternetDetailsViewModel.Factory
     private lateinit var internetDetailsContentManagerFactory: InternetDetailsContentManager.Factory
@@ -65,7 +63,6 @@
     @Before
     fun setup() {
         internetDialogManager = mock<InternetDialogManager>()
-        wifiStateWorker = mock<WifiStateWorker>()
         controller = mock<AccessPointController>()
         internetDetailsViewModelFactory = mock<InternetDetailsViewModel.Factory>()
         internetDetailsContentManagerFactory = mock<InternetDetailsContentManager.Factory>()
@@ -81,7 +78,6 @@
             InternetTileUserActionInteractor(
                 kosmos.testScope.coroutineContext,
                 internetDialogManager,
-                wifiStateWorker,
                 controller,
                 inputHandler,
                 internetDetailsViewModelFactory,
@@ -133,26 +129,6 @@
         }
 
     @Test
-    fun handleSecondaryClickWhenWifiOn() =
-        kosmos.testScope.runTest {
-            whenever(wifiStateWorker.isWifiEnabled).thenReturn(true)
-
-            underTest.handleInput(QSTileInputTestKtx.toggleClick(InternetTileModel.Active()))
-
-            verify(wifiStateWorker, times(1)).isWifiEnabled = eq(false)
-        }
-
-    @Test
-    fun handleSecondaryClickWhenWifiOff() =
-        kosmos.testScope.runTest {
-            whenever(wifiStateWorker.isWifiEnabled).thenReturn(false)
-
-            underTest.handleInput(QSTileInputTestKtx.toggleClick(InternetTileModel.Inactive()))
-
-            verify(wifiStateWorker, times(1)).isWifiEnabled = eq(true)
-        }
-
-    @Test
     fun detailsViewModel() =
         kosmos.testScope.runTest {
             assertThat(underTest.detailsViewModel.getTitle()).isEqualTo("Internet")
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModelTest.kt
index adaebbd..5527393 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModelTest.kt
@@ -25,8 +25,10 @@
 import com.android.compose.animation.scene.DefaultEdgeDetector
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.classifier.fakeFalsingManager
-import com.android.systemui.coroutines.collectLastValue
 import com.android.systemui.flags.EnableSceneContainer
+import com.android.systemui.kosmos.collectLastValue
+import com.android.systemui.kosmos.runCurrent
+import com.android.systemui.kosmos.runTest
 import com.android.systemui.kosmos.testScope
 import com.android.systemui.lifecycle.activateIn
 import com.android.systemui.power.data.repository.fakePowerRepository
@@ -44,17 +46,15 @@
 import com.android.systemui.shade.shared.model.ShadeMode
 import com.android.systemui.statusbar.data.repository.fakeRemoteInputRepository
 import com.android.systemui.testKosmos
-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 kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.Job
-import kotlinx.coroutines.test.runCurrent
-import kotlinx.coroutines.test.runTest
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
+import org.mockito.kotlin.doReturn
+import org.mockito.kotlin.mock
 
 @OptIn(ExperimentalCoroutinesApi::class)
 @SmallTest
@@ -64,10 +64,6 @@
 
     private val kosmos = testKosmos()
     private val testScope by lazy { kosmos.testScope }
-    private val sceneInteractor by lazy { kosmos.sceneInteractor }
-    private val fakeSceneDataSource by lazy { kosmos.fakeSceneDataSource }
-    private val sceneContainerConfig by lazy { kosmos.sceneContainerConfig }
-    private val fakeRemoteInputRepository by lazy { kosmos.fakeRemoteInputRepository }
     private val falsingManager by lazy { kosmos.fakeFalsingManager }
     private val view = mock<View>()
 
@@ -91,14 +87,14 @@
 
     @Test
     fun activate_setsMotionEventHandler() =
-        testScope.runTest {
+        kosmos.runTest {
             runCurrent()
             assertThat(motionEventHandler).isNotNull()
         }
 
     @Test
     fun deactivate_clearsMotionEventHandler() =
-        testScope.runTest {
+        kosmos.runTest {
             activationJob.cancel()
             runCurrent()
 
@@ -107,7 +103,7 @@
 
     @Test
     fun isVisible() =
-        testScope.runTest {
+        kosmos.runTest {
             assertThat(underTest.isVisible).isTrue()
 
             sceneInteractor.setVisible(false, "reason")
@@ -121,7 +117,7 @@
 
     @Test
     fun sceneTransition() =
-        testScope.runTest {
+        kosmos.runTest {
             val currentScene by collectLastValue(underTest.currentScene)
             assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
 
@@ -132,7 +128,7 @@
 
     @Test
     fun canChangeScene_whenAllowed_switchingFromGone_returnsTrue() =
-        testScope.runTest {
+        kosmos.runTest {
             val currentScene by collectLastValue(underTest.currentScene)
             fakeSceneDataSource.changeScene(toScene = Scenes.Gone)
             runCurrent()
@@ -149,7 +145,7 @@
 
     @Test
     fun canChangeScene_whenAllowed_switchingFromLockscreen_returnsTrue() =
-        testScope.runTest {
+        kosmos.runTest {
             val currentScene by collectLastValue(underTest.currentScene)
             fakeSceneDataSource.changeScene(toScene = Scenes.Lockscreen)
             runCurrent()
@@ -166,7 +162,7 @@
 
     @Test
     fun canChangeScene_whenNotAllowed_fromLockscreen_toFalsingProtectedScenes_returnsFalse() =
-        testScope.runTest {
+        kosmos.runTest {
             falsingManager.setIsFalseTouch(true)
             val currentScene by collectLastValue(underTest.currentScene)
             fakeSceneDataSource.changeScene(toScene = Scenes.Lockscreen)
@@ -188,7 +184,7 @@
 
     @Test
     fun canChangeScene_whenNotAllowed_fromLockscreen_toFalsingUnprotectedScenes_returnsTrue() =
-        testScope.runTest {
+        kosmos.runTest {
             falsingManager.setIsFalseTouch(true)
             val currentScene by collectLastValue(underTest.currentScene)
             fakeSceneDataSource.changeScene(toScene = Scenes.Lockscreen)
@@ -209,7 +205,7 @@
 
     @Test
     fun canChangeScene_whenNotAllowed_fromGone_toAnyOtherScene_returnsTrue() =
-        testScope.runTest {
+        kosmos.runTest {
             falsingManager.setIsFalseTouch(true)
             val currentScene by collectLastValue(underTest.currentScene)
             fakeSceneDataSource.changeScene(toScene = Scenes.Gone)
@@ -226,8 +222,70 @@
         }
 
     @Test
+    fun canShowOrReplaceOverlay_whenAllowed_showingWhileOnGone_returnsTrue() =
+        kosmos.runTest {
+            val currentScene by collectLastValue(underTest.currentScene)
+            fakeSceneDataSource.changeScene(toScene = Scenes.Gone)
+            runCurrent()
+            assertThat(currentScene).isEqualTo(Scenes.Gone)
+
+            sceneContainerConfig.overlayKeys.forEach { overlay ->
+                assertWithMessage("Overlay $overlay incorrectly protected when allowed")
+                    .that(underTest.canShowOrReplaceOverlay(newlyShown = overlay))
+                    .isTrue()
+            }
+        }
+
+    @Test
+    fun canShowOrReplaceOverlay_whenAllowed_showingWhileOnLockscreen_returnsTrue() =
+        kosmos.runTest {
+            val currentScene by collectLastValue(underTest.currentScene)
+            fakeSceneDataSource.changeScene(toScene = Scenes.Lockscreen)
+            runCurrent()
+            assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
+
+            sceneContainerConfig.overlayKeys.forEach { overlay ->
+                assertWithMessage("Overlay $overlay incorrectly protected when allowed")
+                    .that(underTest.canShowOrReplaceOverlay(newlyShown = overlay))
+                    .isTrue()
+            }
+        }
+
+    @Test
+    fun canShowOrReplaceOverlay_whenNotAllowed_whileOnLockscreen_returnsFalse() =
+        kosmos.runTest {
+            falsingManager.setIsFalseTouch(true)
+            val currentScene by collectLastValue(underTest.currentScene)
+            fakeSceneDataSource.changeScene(toScene = Scenes.Lockscreen)
+            runCurrent()
+            assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
+
+            sceneContainerConfig.overlayKeys.forEach { overlay ->
+                assertWithMessage("Protected overlay $overlay not properly protected")
+                    .that(underTest.canShowOrReplaceOverlay(newlyShown = overlay))
+                    .isFalse()
+            }
+        }
+
+    @Test
+    fun canShowOrReplaceOverlay_whenNotAllowed_whileOnGone_returnsTrue() =
+        kosmos.runTest {
+            falsingManager.setIsFalseTouch(true)
+            val currentScene by collectLastValue(underTest.currentScene)
+            fakeSceneDataSource.changeScene(toScene = Scenes.Gone)
+            runCurrent()
+            assertThat(currentScene).isEqualTo(Scenes.Gone)
+
+            sceneContainerConfig.overlayKeys.forEach { overlay ->
+                assertWithMessage("Protected overlay $overlay not properly protected")
+                    .that(underTest.canShowOrReplaceOverlay(newlyShown = overlay))
+                    .isTrue()
+            }
+        }
+
+    @Test
     fun userInput() =
-        testScope.runTest {
+        kosmos.runTest {
             assertThat(kosmos.fakePowerRepository.userTouchRegistered).isFalse()
             underTest.onMotionEvent(mock())
             assertThat(kosmos.fakePowerRepository.userTouchRegistered).isTrue()
@@ -235,7 +293,7 @@
 
     @Test
     fun userInputOnEmptySpace_insideEvent() =
-        testScope.runTest {
+        kosmos.runTest {
             assertThat(fakeRemoteInputRepository.areRemoteInputsClosed).isFalse()
             val insideMotionEvent = MotionEvent.obtain(0, 0, ACTION_DOWN, 0f, 0f, 0)
             underTest.onEmptySpaceMotionEvent(insideMotionEvent)
@@ -244,7 +302,7 @@
 
     @Test
     fun userInputOnEmptySpace_outsideEvent_remoteInputActive() =
-        testScope.runTest {
+        kosmos.runTest {
             fakeRemoteInputRepository.isRemoteInputActive.value = true
             assertThat(fakeRemoteInputRepository.areRemoteInputsClosed).isFalse()
             val outsideMotionEvent = MotionEvent.obtain(0, 0, ACTION_OUTSIDE, 0f, 0f, 0)
@@ -254,7 +312,7 @@
 
     @Test
     fun userInputOnEmptySpace_outsideEvent_remoteInputInactive() =
-        testScope.runTest {
+        kosmos.runTest {
             fakeRemoteInputRepository.isRemoteInputActive.value = false
             assertThat(fakeRemoteInputRepository.areRemoteInputsClosed).isFalse()
             val outsideMotionEvent = MotionEvent.obtain(0, 0, ACTION_OUTSIDE, 0f, 0f, 0)
@@ -264,7 +322,7 @@
 
     @Test
     fun remoteUserInteraction_keepsContainerVisible() =
-        testScope.runTest {
+        kosmos.runTest {
             sceneInteractor.setVisible(false, "reason")
             runCurrent()
             assertThat(underTest.isVisible).isFalse()
@@ -272,9 +330,7 @@
             runCurrent()
             assertThat(underTest.isVisible).isTrue()
 
-            underTest.onMotionEvent(
-                mock { whenever(actionMasked).thenReturn(MotionEvent.ACTION_UP) }
-            )
+            underTest.onMotionEvent(mock { on { actionMasked } doReturn MotionEvent.ACTION_UP })
             runCurrent()
 
             assertThat(underTest.isVisible).isFalse()
@@ -282,7 +338,7 @@
 
     @Test
     fun getActionableContentKey_noOverlays_returnsCurrentScene() =
-        testScope.runTest {
+        kosmos.runTest {
             val currentScene by collectLastValue(underTest.currentScene)
             val currentOverlays by collectLastValue(sceneInteractor.currentOverlays)
             assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
@@ -300,7 +356,7 @@
 
     @Test
     fun getActionableContentKey_multipleOverlays_returnsTopOverlay() =
-        testScope.runTest {
+        kosmos.runTest {
             val currentScene by collectLastValue(underTest.currentScene)
             val currentOverlays by collectLastValue(sceneInteractor.currentOverlays)
             fakeSceneDataSource.showOverlay(Overlays.QuickSettingsShade)
@@ -321,7 +377,7 @@
 
     @Test
     fun edgeDetector_singleShade_usesDefaultEdgeDetector() =
-        testScope.runTest {
+        kosmos.runTest {
             val shadeMode by collectLastValue(kosmos.shadeMode)
             kosmos.enableSingleShade()
 
@@ -331,7 +387,7 @@
 
     @Test
     fun edgeDetector_splitShade_usesDefaultEdgeDetector() =
-        testScope.runTest {
+        kosmos.runTest {
             val shadeMode by collectLastValue(kosmos.shadeMode)
             kosmos.enableSplitShade()
 
@@ -341,7 +397,7 @@
 
     @Test
     fun edgeDetector_dualShade_narrowScreen_usesSceneContainerSwipeDetector() =
-        testScope.runTest {
+        kosmos.runTest {
             val shadeMode by collectLastValue(kosmos.shadeMode)
             kosmos.enableDualShade(wideLayout = false)
 
@@ -352,7 +408,7 @@
 
     @Test
     fun edgeDetector_dualShade_wideScreen_usesSceneContainerSwipeDetector() =
-        testScope.runTest {
+        kosmos.runTest {
             val shadeMode by collectLastValue(kosmos.shadeMode)
             kosmos.enableDualShade(wideLayout = true)
 
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/screenshot/policy/WorkProfilePolicyTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/screenshot/policy/WorkProfilePolicyTest.kt
index c1477fe..a9f3a65 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/screenshot/policy/WorkProfilePolicyTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/screenshot/policy/WorkProfilePolicyTest.kt
@@ -80,6 +80,8 @@
         // Set desktop mode supported
         whenever(mContext.resources).thenReturn(mResources)
         whenever(mResources.getBoolean(R.bool.config_isDesktopModeSupported)).thenReturn(true)
+        whenever(mResources.getBoolean(R.bool.config_canInternalDisplayHostDesktops))
+            .thenReturn(true)
 
         policy = WorkProfilePolicy(kosmos.profileTypeRepository, mContext)
     }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shared/plugins/PluginInstanceTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/shared/plugins/PluginInstanceTest.java
index 93ba8e1..064fd48 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shared/plugins/PluginInstanceTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shared/plugins/PluginInstanceTest.java
@@ -28,6 +28,7 @@
 import android.content.pm.ApplicationInfo;
 import android.util.Log;
 
+import androidx.test.filters.FlakyTest;
 import androidx.test.filters.SmallTest;
 import androidx.test.runner.AndroidJUnit4;
 
@@ -52,6 +53,7 @@
 import java.util.function.Supplier;
 
 @SmallTest
+@FlakyTest(bugId = 395832204)
 @RunWith(AndroidJUnit4.class)
 public class PluginInstanceTest extends SysuiTestCase {
 
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shared/system/QuickStepContractTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shared/system/QuickStepContractTest.kt
index d92781a..ef03fab 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shared/system/QuickStepContractTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shared/system/QuickStepContractTest.kt
@@ -16,10 +16,8 @@
 
 package com.android.systemui.shared.system
 
-import android.platform.test.annotations.DisableFlags
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
-import com.android.systemui.Flags.FLAG_GLANCEABLE_HUB_BACK_ACTION
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BOUNCER_SHOWING
 import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_COMMUNAL_HUB_SHOWING
@@ -32,7 +30,6 @@
 @RunWith(AndroidJUnit4::class)
 class QuickStepContractTest : SysuiTestCase() {
     @Test
-    @DisableFlags(FLAG_GLANCEABLE_HUB_BACK_ACTION)
     fun isBackGestureDisabled_hubShowing() {
         val sysuiStateFlags = SYSUI_STATE_COMMUNAL_HUB_SHOWING
 
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/NotificationShadeDepthControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/NotificationShadeDepthControllerTest.kt
index d2ea62d..83361da 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/NotificationShadeDepthControllerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/NotificationShadeDepthControllerTest.kt
@@ -76,7 +76,6 @@
 class NotificationShadeDepthControllerTest : SysuiTestCase() {
     private val kosmos = testKosmos()
 
-    private val applicationScope = kosmos.testScope.backgroundScope
     @Mock private lateinit var windowRootViewBlurInteractor: WindowRootViewBlurInteractor
     @Mock private lateinit var statusBarStateController: StatusBarStateController
     @Mock private lateinit var blurUtils: BlurUtils
@@ -134,7 +133,6 @@
                 context,
                 ResourcesSplitShadeStateController(),
                 windowRootViewBlurInteractor,
-                applicationScope,
                 appZoomOutOptional,
                 dumpManager,
                 configurationController,
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/call/ui/viewmodel/CallChipViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/call/ui/viewmodel/CallChipViewModelTest.kt
index dbe8f82..c7b3175 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/call/ui/viewmodel/CallChipViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/call/ui/viewmodel/CallChipViewModelTest.kt
@@ -31,7 +31,6 @@
 import com.android.systemui.plugins.activityStarter
 import com.android.systemui.res.R
 import com.android.systemui.statusbar.StatusBarIconView
-import com.android.systemui.statusbar.chips.notification.shared.StatusBarNotifChips
 import com.android.systemui.statusbar.chips.ui.model.ColorsModel
 import com.android.systemui.statusbar.chips.ui.model.OngoingActivityChipModel
 import com.android.systemui.statusbar.chips.ui.view.ChipBackgroundContainer
@@ -265,91 +264,25 @@
         }
 
     @Test
-    fun chip_positiveStartTime_notPromoted_colorsAreThemed() =
+    fun chip_positiveStartTime_colorsAreAccentThemed() =
         testScope.runTest {
             val latest by collectLastValue(underTest.chip)
 
             repo.setOngoingCallState(inCallModel(startTimeMs = 1000, promotedContent = null))
 
             assertThat((latest as OngoingActivityChipModel.Active).colors)
-                .isEqualTo(ColorsModel.Themed)
+                .isEqualTo(ColorsModel.AccentThemed)
         }
 
     @Test
-    fun chip_zeroStartTime_notPromoted_colorsAreThemed() =
+    fun chip_zeroStartTime_colorsAreAccentThemed() =
         testScope.runTest {
             val latest by collectLastValue(underTest.chip)
 
             repo.setOngoingCallState(inCallModel(startTimeMs = 0, promotedContent = null))
 
             assertThat((latest as OngoingActivityChipModel.Active).colors)
-                .isEqualTo(ColorsModel.Themed)
-        }
-
-    @Test
-    @DisableFlags(StatusBarNotifChips.FLAG_NAME)
-    fun chip_positiveStartTime_promoted_notifChipsFlagOff_colorsAreThemed() =
-        testScope.runTest {
-            val latest by collectLastValue(underTest.chip)
-
-            repo.setOngoingCallState(
-                inCallModel(startTimeMs = 1000, promotedContent = PROMOTED_CONTENT_WITH_COLOR)
-            )
-
-            assertThat((latest as OngoingActivityChipModel.Active).colors)
-                .isEqualTo(ColorsModel.Themed)
-        }
-
-    @Test
-    @DisableFlags(StatusBarNotifChips.FLAG_NAME)
-    fun chip_zeroStartTime_promoted_notifChipsFlagOff_colorsAreThemed() =
-        testScope.runTest {
-            val latest by collectLastValue(underTest.chip)
-
-            repo.setOngoingCallState(
-                inCallModel(startTimeMs = 0, promotedContent = PROMOTED_CONTENT_WITH_COLOR)
-            )
-
-            assertThat((latest as OngoingActivityChipModel.Active).colors)
-                .isEqualTo(ColorsModel.Themed)
-        }
-
-    @Test
-    @EnableFlags(StatusBarNotifChips.FLAG_NAME)
-    fun chip_positiveStartTime_promoted_notifChipsFlagOn_colorsAreCustom() =
-        testScope.runTest {
-            val latest by collectLastValue(underTest.chip)
-
-            repo.setOngoingCallState(
-                inCallModel(startTimeMs = 1000, promotedContent = PROMOTED_CONTENT_WITH_COLOR)
-            )
-
-            assertThat((latest as OngoingActivityChipModel.Active).colors)
-                .isEqualTo(
-                    ColorsModel.Custom(
-                        backgroundColorInt = PROMOTED_BACKGROUND_COLOR,
-                        primaryTextColorInt = PROMOTED_PRIMARY_TEXT_COLOR,
-                    )
-                )
-        }
-
-    @Test
-    @EnableFlags(StatusBarNotifChips.FLAG_NAME)
-    fun chip_zeroStartTime_promoted_notifChipsFlagOff_colorsAreCustom() =
-        testScope.runTest {
-            val latest by collectLastValue(underTest.chip)
-
-            repo.setOngoingCallState(
-                inCallModel(startTimeMs = 0, promotedContent = PROMOTED_CONTENT_WITH_COLOR)
-            )
-
-            assertThat((latest as OngoingActivityChipModel.Active).colors)
-                .isEqualTo(
-                    ColorsModel.Custom(
-                        backgroundColorInt = PROMOTED_BACKGROUND_COLOR,
-                        primaryTextColorInt = PROMOTED_PRIMARY_TEXT_COLOR,
-                    )
-                )
+                .isEqualTo(ColorsModel.AccentThemed)
         }
 
     @Test
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/domain/interactor/SingleNotificationChipInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/domain/interactor/SingleNotificationChipInteractorTest.kt
index 05f2585..5d19506 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/domain/interactor/SingleNotificationChipInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/domain/interactor/SingleNotificationChipInteractorTest.kt
@@ -31,6 +31,7 @@
 import com.android.systemui.statusbar.notification.data.model.activeNotificationModel
 import com.android.systemui.statusbar.notification.promoted.shared.model.PromotedNotificationContentModel
 import com.android.systemui.testKosmos
+import com.android.systemui.util.time.fakeSystemClock
 import com.google.common.truth.Truth.assertThat
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -183,7 +184,7 @@
                         statusBarChipIcon = null,
                         promotedContent = PROMOTED_CONTENT,
                     ),
-                    32L,
+                    creationTime = 32L,
                 )
 
             val latest by collectLastValue(underTest.notificationChip)
@@ -246,7 +247,7 @@
                     statusBarChipIcon = mock(),
                     promotedContent = PROMOTED_CONTENT,
                 )
-            val underTest = factory.create(startingNotif, 123L)
+            val underTest = factory.create(startingNotif, creationTime = 123L)
             val latest by collectLastValue(underTest.notificationChip)
             assertThat(latest).isNotNull()
 
@@ -306,9 +307,10 @@
         }
 
     @Test
-    fun notificationChip_appIsVisibleOnCreation_emitsNull() =
+    fun notificationChip_appIsVisibleOnCreation_emitsIsAppVisibleTrueWithTime() =
         kosmos.runTest {
             activityManagerRepository.fake.startingIsAppVisibleValue = true
+            fakeSystemClock.setCurrentTimeMillis(9000)
 
             val underTest =
                 factory.create(
@@ -323,72 +325,87 @@
 
             val latest by collectLastValue(underTest.notificationChip)
 
-            assertThat(latest).isNull()
+            assertThat(latest).isNotNull()
+            assertThat(latest!!.isAppVisible).isTrue()
+            assertThat(latest!!.lastAppVisibleTime).isEqualTo(9000)
         }
 
     @Test
-    fun notificationChip_appNotVisibleOnCreation_emitsValue() =
+    fun notificationChip_appNotVisibleOnCreation_emitsIsAppVisibleFalseWithNoTime() =
+        kosmos.runTest {
+            activityManagerRepository.fake.startingIsAppVisibleValue = false
+            fakeSystemClock.setCurrentTimeMillis(9000)
+
+            val underTest =
+                factory.create(
+                    activeNotificationModel(
+                        key = "notif",
+                        uid = UID,
+                        statusBarChipIcon = mock(),
+                        promotedContent = PROMOTED_CONTENT,
+                    ),
+                    creationTime = 1,
+                )
+
+            val latest by collectLastValue(underTest.notificationChip)
+
+            assertThat(latest).isNotNull()
+            assertThat(latest!!.isAppVisible).isFalse()
+            assertThat(latest!!.lastAppVisibleTime).isNull()
+        }
+
+    @Test
+    fun notificationChip_updatesWhenAppIsVisible() =
+        kosmos.runTest {
+            activityManagerRepository.fake.startingIsAppVisibleValue = false
+            fakeSystemClock.setCurrentTimeMillis(9000)
+
+            val underTest =
+                factory.create(
+                    activeNotificationModel(
+                        key = "notif",
+                        uid = UID,
+                        statusBarChipIcon = mock(),
+                        promotedContent = PROMOTED_CONTENT,
+                    ),
+                    creationTime = 1,
+                )
+
+            val latest by collectLastValue(underTest.notificationChip)
+
+            activityManagerRepository.fake.setIsAppVisible(UID, isAppVisible = false)
+            assertThat(latest!!.isAppVisible).isFalse()
+            assertThat(latest!!.lastAppVisibleTime).isNull()
+
+            fakeSystemClock.setCurrentTimeMillis(11000)
+            activityManagerRepository.fake.setIsAppVisible(UID, isAppVisible = true)
+            assertThat(latest!!.isAppVisible).isTrue()
+            assertThat(latest!!.lastAppVisibleTime).isEqualTo(11000)
+
+            fakeSystemClock.setCurrentTimeMillis(13000)
+            activityManagerRepository.fake.setIsAppVisible(UID, isAppVisible = false)
+            assertThat(latest!!.isAppVisible).isFalse()
+            assertThat(latest!!.lastAppVisibleTime).isEqualTo(11000)
+
+            fakeSystemClock.setCurrentTimeMillis(15000)
+            activityManagerRepository.fake.setIsAppVisible(UID, isAppVisible = true)
+            assertThat(latest!!.isAppVisible).isTrue()
+            assertThat(latest!!.lastAppVisibleTime).isEqualTo(15000)
+        }
+
+    @Test
+    fun notificationChip_updatedUid_newUidIsIgnoredButOtherDataNotIgnored() =
         kosmos.runTest {
             activityManagerRepository.fake.startingIsAppVisibleValue = false
 
-            val underTest =
-                factory.create(
-                    activeNotificationModel(
-                        key = "notif",
-                        uid = UID,
-                        statusBarChipIcon = mock(),
-                        promotedContent = PROMOTED_CONTENT,
-                    ),
-                    creationTime = 1,
-                )
-
-            val latest by collectLastValue(underTest.notificationChip)
-
-            assertThat(latest).isNotNull()
-        }
-
-    @Test
-    fun notificationChip_hidesWhenAppIsVisible() =
-        kosmos.runTest {
-            val underTest =
-                factory.create(
-                    activeNotificationModel(
-                        key = "notif",
-                        uid = UID,
-                        statusBarChipIcon = mock(),
-                        promotedContent = PROMOTED_CONTENT,
-                    ),
-                    creationTime = 1,
-                )
-
-            val latest by collectLastValue(underTest.notificationChip)
-
-            activityManagerRepository.fake.setIsAppVisible(UID, false)
-            assertThat(latest).isNotNull()
-
-            activityManagerRepository.fake.setIsAppVisible(UID, true)
-            assertThat(latest).isNull()
-
-            activityManagerRepository.fake.setIsAppVisible(UID, false)
-            assertThat(latest).isNotNull()
-        }
-
-    // Note: This test is theoretically impossible because the notification key should contain the
-    // UID, so if the UID changes then the key would also change and a new interactor would be
-    // created. But, test it just in case.
-    @Test
-    fun notificationChip_updatedUid_rechecksAppVisibility_oldObserverUnregistered() =
-        kosmos.runTest {
-            activityManagerRepository.fake.startingIsAppVisibleValue = false
-
-            val hiddenUid = 100
-            val shownUid = 101
+            val originalUid = 100
+            val newUid = 101
 
             val underTest =
                 factory.create(
                     activeNotificationModel(
                         key = "notif",
-                        uid = hiddenUid,
+                        uid = originalUid,
                         statusBarChipIcon = mock(),
                         promotedContent = PROMOTED_CONTENT,
                     ),
@@ -396,21 +413,39 @@
                 )
             val latest by collectLastValue(underTest.notificationChip)
             assertThat(latest).isNotNull()
+            assertThat(latest!!.isAppVisible).isFalse()
 
             // WHEN the notif gets a new UID that starts as visible
             activityManagerRepository.fake.startingIsAppVisibleValue = true
+            val newPromotedContentBuilder =
+                PromotedNotificationContentModel.Builder("notif").apply {
+                    this.shortCriticalText = "Arrived"
+                }
+            val newPromotedContent = newPromotedContentBuilder.build()
             underTest.setNotification(
                 activeNotificationModel(
                     key = "notif",
-                    uid = shownUid,
+                    uid = newUid,
                     statusBarChipIcon = mock(),
-                    promotedContent = PROMOTED_CONTENT,
+                    promotedContent = newPromotedContent,
                 )
             )
 
-            // THEN we re-fetch the app visibility state with the new UID, and since that UID is
-            // visible, we hide the chip
-            assertThat(latest).isNull()
+            // THEN we do update other fields like promoted content
+            assertThat(latest!!.promotedContent).isEqualTo(newPromotedContent)
+
+            // THEN we don't fetch the app visibility state for the new UID
+            assertThat(latest!!.isAppVisible).isFalse()
+
+            // AND don't listen to updates for the new UID
+            activityManagerRepository.fake.setIsAppVisible(newUid, isAppVisible = false)
+            activityManagerRepository.fake.setIsAppVisible(newUid, isAppVisible = true)
+            assertThat(latest!!.isAppVisible).isFalse()
+
+            // AND we still use updates from the old UID
+            // TODO(b/364653005): This particular behavior isn't great, can we do better?
+            activityManagerRepository.fake.setIsAppVisible(originalUid, isAppVisible = true)
+            assertThat(latest!!.isAppVisible).isTrue()
         }
 
     companion object {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/domain/interactor/StatusBarNotificationChipsInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/domain/interactor/StatusBarNotificationChipsInteractorTest.kt
index e89c929..7ed2bd3 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/domain/interactor/StatusBarNotificationChipsInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/domain/interactor/StatusBarNotificationChipsInteractorTest.kt
@@ -21,8 +21,8 @@
 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.coroutines.collectValues
+import com.android.systemui.activity.data.repository.activityManagerRepository
+import com.android.systemui.activity.data.repository.fake
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.kosmos.collectLastValue
 import com.android.systemui.kosmos.collectValues
@@ -41,7 +41,6 @@
 import com.android.systemui.util.time.fakeSystemClock
 import com.google.common.truth.Truth.assertThat
 import kotlin.test.Test
-import kotlinx.coroutines.test.runTest
 import org.junit.runner.RunWith
 import org.mockito.kotlin.mock
 
@@ -55,9 +54,9 @@
 
     @Test
     @DisableFlags(StatusBarNotifChips.FLAG_NAME)
-    fun notificationChips_flagOff_noNotifs() =
+    fun shownNotificationChips_flagOff_noNotifs() =
         kosmos.runTest {
-            val latest by collectLastValue(underTest.notificationChips)
+            val latest by collectLastValue(underTest.shownNotificationChips)
 
             setNotifs(
                 listOf(
@@ -74,9 +73,9 @@
 
     @Test
     @EnableFlags(StatusBarNotifChips.FLAG_NAME)
-    fun notificationChips_noNotifs_empty() =
+    fun shownNotificationChips_noNotifs_empty() =
         kosmos.runTest {
-            val latest by collectLastValue(underTest.notificationChips)
+            val latest by collectLastValue(underTest.shownNotificationChips)
 
             setNotifs(emptyList())
 
@@ -86,9 +85,9 @@
     @Test
     @EnableFlags(StatusBarNotifChips.FLAG_NAME)
     @DisableFlags(StatusBarConnectedDisplays.FLAG_NAME)
-    fun notificationChips_notifMissingStatusBarChipIconView_cdFlagOff_empty() =
+    fun shownNotificationChips_notifMissingStatusBarChipIconView_cdFlagOff_empty() =
         kosmos.runTest {
-            val latest by collectLastValue(underTest.notificationChips)
+            val latest by collectLastValue(underTest.shownNotificationChips)
 
             setNotifs(
                 listOf(
@@ -105,9 +104,9 @@
 
     @Test
     @EnableFlags(StatusBarNotifChips.FLAG_NAME, StatusBarConnectedDisplays.FLAG_NAME)
-    fun notificationChips_notifMissingStatusBarChipIconView_cdFlagOn_notEmpty() =
+    fun shownNotificationChips_notifMissingStatusBarChipIconView_cdFlagOn_notEmpty() =
         kosmos.runTest {
-            val latest by collectLastValue(underTest.notificationChips)
+            val latest by collectLastValue(underTest.shownNotificationChips)
 
             setNotifs(
                 listOf(
@@ -124,9 +123,9 @@
 
     @Test
     @EnableFlags(StatusBarNotifChips.FLAG_NAME)
-    fun notificationChips_onePromotedNotif_statusBarIconViewMatches() =
+    fun shownNotificationChips_onePromotedNotif_statusBarIconViewMatches() =
         kosmos.runTest {
-            val latest by collectLastValue(underTest.notificationChips)
+            val latest by collectLastValue(underTest.shownNotificationChips)
 
             val icon = mock<StatusBarIconView>()
             setNotifs(
@@ -146,9 +145,9 @@
 
     @Test
     @EnableFlags(StatusBarNotifChips.FLAG_NAME)
-    fun notificationChips_onlyForPromotedNotifs() =
+    fun shownNotificationChips_onlyForPromotedNotifs() =
         kosmos.runTest {
-            val latest by collectLastValue(underTest.notificationChips)
+            val latest by collectLastValue(underTest.shownNotificationChips)
 
             val firstIcon = mock<StatusBarIconView>()
             val secondIcon = mock<StatusBarIconView>()
@@ -179,12 +178,42 @@
             assertThat(latest!![1].statusBarChipIconView).isEqualTo(secondIcon)
         }
 
+    @Test
+    @EnableFlags(StatusBarNotifChips.FLAG_NAME)
+    fun shownNotificationChips_onlyForNotVisibleApps() =
+        kosmos.runTest {
+            activityManagerRepository.fake.startingIsAppVisibleValue = false
+
+            val latest by collectLastValue(underTest.shownNotificationChips)
+
+            val uid = 433
+            setNotifs(
+                listOf(
+                    activeNotificationModel(
+                        key = "notif",
+                        uid = uid,
+                        statusBarChipIcon = mock<StatusBarIconView>(),
+                        promotedContent = PromotedNotificationContentModel.Builder("notif1").build(),
+                    )
+                )
+            )
+
+            activityManagerRepository.fake.setIsAppVisible(uid, isAppVisible = false)
+            assertThat(latest).hasSize(1)
+
+            activityManagerRepository.fake.setIsAppVisible(uid, isAppVisible = true)
+            assertThat(latest).isEmpty()
+
+            activityManagerRepository.fake.setIsAppVisible(uid, isAppVisible = false)
+            assertThat(latest).hasSize(1)
+        }
+
     /** Regression test for b/388521980. */
     @Test
     @EnableFlags(StatusBarNotifChips.FLAG_NAME)
-    fun notificationChips_callNotifIsAlsoPromoted_callNotifExcluded() =
+    fun shownNotificationChips_callNotifIsAlsoPromoted_callNotifExcluded() =
         kosmos.runTest {
-            val latest by collectLastValue(underTest.notificationChips)
+            val latest by collectLastValue(underTest.shownNotificationChips)
 
             setNotifs(
                 listOf(
@@ -212,9 +241,9 @@
 
     @Test
     @EnableFlags(StatusBarNotifChips.FLAG_NAME)
-    fun notificationChips_notifUpdatesGoThrough() =
+    fun shownNotificationChips_notifUpdatesGoThrough() =
         kosmos.runTest {
-            val latest by collectLastValue(underTest.notificationChips)
+            val latest by collectLastValue(underTest.shownNotificationChips)
 
             val firstIcon = mock<StatusBarIconView>()
             val secondIcon = mock<StatusBarIconView>()
@@ -262,9 +291,9 @@
 
     @Test
     @EnableFlags(StatusBarNotifChips.FLAG_NAME)
-    fun notificationChips_promotedNotifDisappearsThenReappears() =
+    fun shownNotificationChips_promotedNotifDisappearsThenReappears() =
         kosmos.runTest {
-            val latest by collectLastValue(underTest.notificationChips)
+            val latest by collectLastValue(underTest.shownNotificationChips)
 
             setNotifs(
                 listOf(
@@ -304,9 +333,9 @@
 
     @Test
     @EnableFlags(StatusBarNotifChips.FLAG_NAME)
-    fun notificationChips_sortedBasedOnFirstAppearanceTime() =
+    fun shownNotificationChips_sortedByFirstAppearanceTime() =
         kosmos.runTest {
-            val latest by collectLastValue(underTest.notificationChips)
+            val latest by collectLastValue(underTest.shownNotificationChips)
 
             val firstIcon = mock<StatusBarIconView>()
             val secondIcon = mock<StatusBarIconView>()
@@ -320,8 +349,7 @@
                     promotedContent = PromotedNotificationContentModel.Builder("notif1").build(),
                 )
             setNotifs(listOf(notif1))
-            assertThat(latest).hasSize(1)
-            assertThat(latest!![0].key).isEqualTo("notif1")
+            assertThat(latest!!.map { it.key }).containsExactly("notif1").inOrder()
 
             // WHEN we add notif2 at t=2000
             fakeSystemClock.advanceTime(1000)
@@ -333,26 +361,20 @@
                 )
             setNotifs(listOf(notif1, notif2))
 
-            // THEN notif2 is ranked above notif1 because it appeared later
-            assertThat(latest).hasSize(2)
-            assertThat(latest!![0].key).isEqualTo("notif2")
-            assertThat(latest!![1].key).isEqualTo("notif1")
+            // THEN notif2 is ranked above notif1 because notif2 appeared later
+            assertThat(latest!!.map { it.key }).containsExactly("notif2", "notif1").inOrder()
 
             // WHEN notif1 and notif2 swap places
             setNotifs(listOf(notif2, notif1))
 
             // THEN notif2 is still ranked above notif1 to preserve chip ordering
-            assertThat(latest).hasSize(2)
-            assertThat(latest!![0].key).isEqualTo("notif2")
-            assertThat(latest!![1].key).isEqualTo("notif1")
+            assertThat(latest!!.map { it.key }).containsExactly("notif2", "notif1").inOrder()
 
             // WHEN notif1 and notif2 swap places again
             setNotifs(listOf(notif1, notif2))
 
             // THEN notif2 is still ranked above notif1 to preserve chip ordering
-            assertThat(latest).hasSize(2)
-            assertThat(latest!![0].key).isEqualTo("notif2")
-            assertThat(latest!![1].key).isEqualTo("notif1")
+            assertThat(latest!!.map { it.key }).containsExactly("notif2", "notif1").inOrder()
 
             // WHEN notif1 gets an update
             val notif1NewPromotedContent =
@@ -371,9 +393,7 @@
             )
 
             // THEN notif2 is still ranked above notif1 to preserve chip ordering
-            assertThat(latest).hasSize(2)
-            assertThat(latest!![0].key).isEqualTo("notif2")
-            assertThat(latest!![1].key).isEqualTo("notif1")
+            assertThat(latest!!.map { it.key }).containsExactly("notif2", "notif1").inOrder()
 
             // WHEN notif1 disappears and then reappears
             fakeSystemClock.advanceTime(1000)
@@ -384,16 +404,245 @@
             setNotifs(listOf(notif2, notif1))
 
             // THEN notif1 is now ranked first
-            assertThat(latest).hasSize(2)
-            assertThat(latest!![0].key).isEqualTo("notif1")
-            assertThat(latest!![1].key).isEqualTo("notif2")
+            assertThat(latest!!.map { it.key }).containsExactly("notif1", "notif2").inOrder()
         }
 
     @Test
     @EnableFlags(StatusBarNotifChips.FLAG_NAME)
-    fun notificationChips_notifChangesKey() =
+    fun shownNotificationChips_sortedByLastAppVisibleTime() =
         kosmos.runTest {
-            val latest by collectLastValue(underTest.notificationChips)
+            val latest by collectLastValue(underTest.shownNotificationChips)
+
+            val notif1Info = NotifInfo("notif1", mock<StatusBarIconView>(), uid = 100)
+            val notif2Info = NotifInfo("notif2", mock<StatusBarIconView>(), uid = 200)
+
+            activityManagerRepository.fake.startingIsAppVisibleValue = false
+            fakeSystemClock.setCurrentTimeMillis(1000)
+            val notif1 =
+                activeNotificationModel(
+                    key = notif1Info.key,
+                    uid = notif1Info.uid,
+                    statusBarChipIcon = notif1Info.icon,
+                    promotedContent =
+                        PromotedNotificationContentModel.Builder(notif1Info.key).build(),
+                )
+            val notif2 =
+                activeNotificationModel(
+                    key = notif2Info.key,
+                    uid = notif2Info.uid,
+                    statusBarChipIcon = notif2Info.icon,
+                    promotedContent =
+                        PromotedNotificationContentModel.Builder(notif2Info.key).build(),
+                )
+            setNotifs(listOf(notif1, notif2))
+            assertThat(latest!!.map { it.key }).containsExactly("notif1", "notif2").inOrder()
+
+            // WHEN notif2's app becomes visible
+            fakeSystemClock.advanceTime(1000)
+            activityManagerRepository.fake.setIsAppVisible(notif2Info.uid, isAppVisible = true)
+
+            // THEN notif2 is no longer shown
+            assertThat(latest!!.map { it.key }).containsExactly("notif1").inOrder()
+
+            // WHEN notif2's app is no longer visible
+            fakeSystemClock.advanceTime(1000)
+            activityManagerRepository.fake.setIsAppVisible(notif2Info.uid, isAppVisible = false)
+
+            // THEN notif2 is ranked above notif1 because it was more recently visible
+            assertThat(latest!!.map { it.key }).containsExactly("notif2", "notif1").inOrder()
+
+            // WHEN the app associated with notif1 becomes visible then un-visible
+            fakeSystemClock.advanceTime(1000)
+            activityManagerRepository.fake.setIsAppVisible(notif1Info.uid, isAppVisible = true)
+            fakeSystemClock.advanceTime(1000)
+            activityManagerRepository.fake.setIsAppVisible(notif1Info.uid, isAppVisible = false)
+
+            // THEN notif1 is now ranked above notif2 because it was more recently visible
+            assertThat(latest!!.map { it.key }).containsExactly("notif1", "notif2").inOrder()
+        }
+
+    @Test
+    @EnableFlags(StatusBarNotifChips.FLAG_NAME)
+    fun shownNotificationChips_newNotificationTakesPriorityOverLastAppVisible() =
+        kosmos.runTest {
+            val latest by collectLastValue(underTest.shownNotificationChips)
+
+            val notif1Info = NotifInfo("notif1", mock<StatusBarIconView>(), uid = 100)
+            val notif2Info = NotifInfo("notif2", mock<StatusBarIconView>(), uid = 200)
+            val notif3Info = NotifInfo("notif3", mock<StatusBarIconView>(), uid = 300)
+
+            activityManagerRepository.fake.startingIsAppVisibleValue = false
+            fakeSystemClock.setCurrentTimeMillis(1000)
+            val notif1 =
+                activeNotificationModel(
+                    key = notif1Info.key,
+                    uid = notif1Info.uid,
+                    statusBarChipIcon = notif1Info.icon,
+                    promotedContent =
+                        PromotedNotificationContentModel.Builder(notif1Info.key).build(),
+                )
+            val notif2 =
+                activeNotificationModel(
+                    key = notif2Info.key,
+                    uid = notif2Info.uid,
+                    statusBarChipIcon = notif2Info.icon,
+                    promotedContent =
+                        PromotedNotificationContentModel.Builder(notif2Info.key).build(),
+                )
+            setNotifs(listOf(notif1, notif2))
+            assertThat(latest!!.map { it.key }).containsExactly("notif1", "notif2").inOrder()
+
+            // WHEN notif2's app becomes visible then not visible
+            fakeSystemClock.advanceTime(1000)
+            activityManagerRepository.fake.setIsAppVisible(notif2Info.uid, isAppVisible = true)
+            fakeSystemClock.advanceTime(1000)
+            activityManagerRepository.fake.setIsAppVisible(notif2Info.uid, isAppVisible = false)
+
+            // THEN notif2 is ranked above notif1 because it was more recently visible
+            assertThat(latest!!.map { it.key }).containsExactly("notif2", "notif1").inOrder()
+
+            // WHEN a new notif3 appears
+            fakeSystemClock.advanceTime(1000)
+            val notif3 =
+                activeNotificationModel(
+                    key = notif3Info.key,
+                    uid = notif3Info.uid,
+                    statusBarChipIcon = notif3Info.icon,
+                    promotedContent =
+                        PromotedNotificationContentModel.Builder(notif3Info.key).build(),
+                )
+            setNotifs(listOf(notif1, notif2, notif3))
+
+            // THEN notif3 is ranked above everything else
+            // AND notif2 is still before notif1 because it was more recently visible
+            assertThat(latest!!.map { it.key })
+                .containsExactly("notif3", "notif2", "notif1")
+                .inOrder()
+        }
+
+    @Test
+    @EnableFlags(StatusBarNotifChips.FLAG_NAME)
+    fun shownNotificationChips_fullSort() =
+        kosmos.runTest {
+            val latest by collectLastValue(underTest.shownNotificationChips)
+
+            val notif1Info = NotifInfo("notif1", mock<StatusBarIconView>(), uid = 100)
+            val notif2Info = NotifInfo("notif2", mock<StatusBarIconView>(), uid = 200)
+            val notif3Info = NotifInfo("notif3", mock<StatusBarIconView>(), uid = 300)
+
+            // First, add notif1 at t=1000
+            activityManagerRepository.fake.startingIsAppVisibleValue = false
+            fakeSystemClock.setCurrentTimeMillis(1000)
+            val notif1 =
+                activeNotificationModel(
+                    key = notif1Info.key,
+                    uid = notif1Info.uid,
+                    statusBarChipIcon = notif1Info.icon,
+                    promotedContent =
+                        PromotedNotificationContentModel.Builder(notif1Info.key).build(),
+                )
+            setNotifs(listOf(notif1))
+
+            // WHEN we add notif2 at t=2000
+            fakeSystemClock.advanceTime(1000)
+            val notif2 =
+                activeNotificationModel(
+                    key = notif2Info.key,
+                    uid = notif2Info.uid,
+                    statusBarChipIcon = notif2Info.icon,
+                    promotedContent =
+                        PromotedNotificationContentModel.Builder(notif2Info.key).build(),
+                )
+            setNotifs(listOf(notif1, notif2))
+
+            // THEN notif2 is ranked above notif1 because notif2 appeared later
+            assertThat(latest!!.map { it.key }).containsExactly("notif2", "notif1").inOrder()
+
+            // WHEN notif2's app becomes visible then un-visible
+            fakeSystemClock.advanceTime(1000)
+            activityManagerRepository.fake.setIsAppVisible(notif2Info.uid, isAppVisible = true)
+            fakeSystemClock.advanceTime(1000)
+            activityManagerRepository.fake.setIsAppVisible(notif2Info.uid, isAppVisible = false)
+
+            // THEN notif2 is ranked above notif1 because it was more recently visible
+            assertThat(latest!!.map { it.key }).containsExactly("notif2", "notif1").inOrder()
+
+            // WHEN the app associated with notif1 becomes visible then un-visible
+            fakeSystemClock.advanceTime(1000)
+            activityManagerRepository.fake.setIsAppVisible(notif1Info.uid, isAppVisible = true)
+            fakeSystemClock.advanceTime(1000)
+            activityManagerRepository.fake.setIsAppVisible(notif1Info.uid, isAppVisible = false)
+
+            // THEN notif1 is ranked above notif2 because it was more recently visible
+            assertThat(latest!!.map { it.key }).containsExactly("notif1", "notif2").inOrder()
+
+            // WHEN notif2 gets an update
+            val notif2NewPromotedContent =
+                PromotedNotificationContentModel.Builder("notif2").apply {
+                    this.shortCriticalText = "Arrived"
+                }
+            setNotifs(
+                listOf(
+                    notif1,
+                    activeNotificationModel(
+                        key = notif2Info.key,
+                        uid = notif2Info.uid,
+                        statusBarChipIcon = notif2Info.icon,
+                        promotedContent = notif2NewPromotedContent.build(),
+                    ),
+                )
+            )
+
+            // THEN notif1 is still ranked above notif2 to preserve chip ordering
+            assertThat(latest!!.map { it.key }).containsExactly("notif1", "notif2").inOrder()
+
+            // WHEN a new notification appears
+            fakeSystemClock.advanceTime(1000)
+            val notif3 =
+                activeNotificationModel(
+                    key = notif3Info.key,
+                    uid = notif3Info.uid,
+                    statusBarChipIcon = notif3Info.icon,
+                    promotedContent =
+                        PromotedNotificationContentModel.Builder(notif3Info.key).build(),
+                )
+            setNotifs(listOf(notif1, notif2, notif3))
+
+            // THEN it's ranked first because it's new
+            assertThat(latest!!.map { it.key })
+                .containsExactly("notif3", "notif1", "notif2")
+                .inOrder()
+
+            // WHEN notif2 becomes visible then un-visible again
+            fakeSystemClock.advanceTime(1000)
+            activityManagerRepository.fake.setIsAppVisible(notif2Info.uid, isAppVisible = true)
+            fakeSystemClock.advanceTime(1000)
+            activityManagerRepository.fake.setIsAppVisible(notif2Info.uid, isAppVisible = false)
+
+            // THEN it moves to the front
+            assertThat(latest!!.map { it.key })
+                .containsExactly("notif2", "notif3", "notif1")
+                .inOrder()
+
+            // WHEN notif1 disappears and then reappears
+            fakeSystemClock.advanceTime(1000)
+            setNotifs(listOf(notif2, notif3))
+            assertThat(latest!!.map { it.key }).containsExactly("notif2", "notif3").inOrder()
+
+            fakeSystemClock.advanceTime(1000)
+            setNotifs(listOf(notif2, notif1, notif3))
+
+            // THEN notif1 is now ranked first
+            assertThat(latest!!.map { it.key })
+                .containsExactly("notif1", "notif2", "notif3")
+                .inOrder()
+        }
+
+    @Test
+    @EnableFlags(StatusBarNotifChips.FLAG_NAME)
+    fun shownNotificationChips_notifChangesKey() =
+        kosmos.runTest {
+            val latest by collectLastValue(underTest.shownNotificationChips)
 
             val firstIcon = mock<StatusBarIconView>()
             val secondIcon = mock<StatusBarIconView>()
@@ -466,4 +715,6 @@
                 .apply { notifs.forEach { addIndividualNotif(it) } }
                 .build()
     }
+
+    private data class NotifInfo(val key: String, val icon: StatusBarIconView, val uid: Int)
 }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModelTest.kt
index 192ad87..aaa9b58 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModelTest.kt
@@ -186,7 +186,7 @@
 
     @Test
     @DisableFlags(FLAG_PROMOTE_NOTIFICATIONS_AUTOMATICALLY)
-    fun chips_onePromotedNotif_colorMatches() =
+    fun chips_onePromotedNotif_colorIsSystemThemed() =
         kosmos.runTest {
             val latest by collectLastValue(underTest.chips)
 
@@ -209,10 +209,7 @@
             )
 
             assertThat(latest).hasSize(1)
-            val colors = latest!![0].colors
-            assertThat(colors).isInstanceOf(ColorsModel.Custom::class.java)
-            assertThat((colors as ColorsModel.Custom).backgroundColorInt).isEqualTo(56)
-            assertThat((colors as ColorsModel.Custom).primaryTextColorInt).isEqualTo(89)
+            assertThat(latest!![0].colors).isEqualTo(ColorsModel.SystemThemed)
         }
 
     @Test
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/ui/view/ChipTextTruncationHelperTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/ui/view/ChipTextTruncationHelperTest.kt
index d727089..9ec5a42 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/ui/view/ChipTextTruncationHelperTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/ui/view/ChipTextTruncationHelperTest.kt
@@ -52,24 +52,13 @@
     }
 
     @Test
-    fun shouldShowText_desiredSlightlyLargerThanMax_true() {
+    fun shouldShowText_desiredMoreThanMax_false() {
         val result =
             underTest.shouldShowText(
                 desiredTextWidthPx = (MAX_WIDTH * 1.1).toInt(),
                 widthMeasureSpec = UNLIMITED_WIDTH_SPEC,
             )
 
-        assertThat(result).isTrue()
-    }
-
-    @Test
-    fun shouldShowText_desiredMoreThanTwiceMax_false() {
-        val result =
-            underTest.shouldShowText(
-                desiredTextWidthPx = (MAX_WIDTH * 2.2).toInt(),
-                widthMeasureSpec = UNLIMITED_WIDTH_SPEC,
-            )
-
         assertThat(result).isFalse()
     }
 
@@ -80,8 +69,8 @@
                 View.MeasureSpec.makeMeasureSpec(MAX_WIDTH / 2, View.MeasureSpec.AT_MOST)
             )
 
-        // WHEN desired is more than twice the smallerWidthSpec
-        val desiredWidth = (MAX_WIDTH * 1.1).toInt()
+        // WHEN desired is more than the smallerWidthSpec
+        val desiredWidth = ((MAX_WIDTH / 2) * 1.1).toInt()
 
         val result =
             underTest.shouldShowText(
@@ -100,8 +89,8 @@
                 View.MeasureSpec.makeMeasureSpec(MAX_WIDTH * 3, View.MeasureSpec.AT_MOST)
             )
 
-        // WHEN desired is more than twice the max
-        val desiredWidth = (MAX_WIDTH * 2.2).toInt()
+        // WHEN desired is more than the max
+        val desiredWidth = (MAX_WIDTH * 1.1).toInt()
 
         val result =
             underTest.shouldShowText(
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/ui/viewmodel/ChipTransitionHelperTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/ui/viewmodel/ChipTransitionHelperTest.kt
index 60030ad..e3a84fd 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/ui/viewmodel/ChipTransitionHelperTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/ui/viewmodel/ChipTransitionHelperTest.kt
@@ -54,7 +54,7 @@
                 OngoingActivityChipModel.Active.Timer(
                     key = KEY,
                     icon = createIcon(R.drawable.ic_cake),
-                    colors = ColorsModel.Themed,
+                    colors = ColorsModel.AccentThemed,
                     startTimeMs = 100L,
                     onClickListenerLegacy = null,
                     clickBehavior = OngoingActivityChipModel.ClickBehavior.None,
@@ -68,7 +68,7 @@
                 OngoingActivityChipModel.Active.IconOnly(
                     key = KEY,
                     icon = createIcon(R.drawable.ic_hotspot),
-                    colors = ColorsModel.Themed,
+                    colors = ColorsModel.AccentThemed,
                     onClickListenerLegacy = null,
                     clickBehavior = OngoingActivityChipModel.ClickBehavior.None,
                 )
@@ -90,7 +90,7 @@
                 OngoingActivityChipModel.Active.Timer(
                     key = KEY,
                     icon = createIcon(R.drawable.ic_cake),
-                    colors = ColorsModel.Themed,
+                    colors = ColorsModel.AccentThemed,
                     startTimeMs = 100L,
                     onClickListenerLegacy = null,
                     clickBehavior = OngoingActivityChipModel.ClickBehavior.None,
@@ -132,7 +132,7 @@
                 OngoingActivityChipModel.Active.Timer(
                     key = KEY,
                     icon = createIcon(R.drawable.ic_cake),
-                    colors = ColorsModel.Themed,
+                    colors = ColorsModel.AccentThemed,
                     startTimeMs = 100L,
                     onClickListenerLegacy = null,
                     clickBehavior = OngoingActivityChipModel.ClickBehavior.None,
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/ui/viewmodel/TimeRemainingStateTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/ui/viewmodel/TimeRemainingStateTest.kt
new file mode 100644
index 0000000..5dc59e8
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/ui/viewmodel/TimeRemainingStateTest.kt
@@ -0,0 +1,237 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF 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.chips.ui.viewmodel
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.internal.R.string.duration_hours_medium
+import com.android.internal.R.string.duration_minutes_medium
+import com.android.internal.R.string.now_string_shortest
+import com.android.systemui.SysuiTestCase
+import com.google.common.truth.Truth.assertThat
+import kotlin.time.Duration.Companion.hours
+import kotlin.time.Duration.Companion.minutes
+import kotlin.time.Duration.Companion.seconds
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.cancelAndJoin
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.test.advanceTimeBy
+import kotlinx.coroutines.test.runTest
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@OptIn(ExperimentalCoroutinesApi::class)
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class TimeRemainingStateTest : SysuiTestCase() {
+
+    private var fakeTimeSource: MutableTimeSource = MutableTimeSource()
+    // We need a non-zero start time to advance to. This is needed to ensure `TimeRemainingState` is
+    // updated at least once.
+    private val startTime = 1.seconds.inWholeMilliseconds
+
+    @Test
+    fun timeRemainingState_pastTime() = runTest {
+        val state = TimeRemainingState(fakeTimeSource, startTime - 62.seconds.inWholeMilliseconds)
+        val job = launch { state.run() }
+
+        fakeTimeSource.time = startTime
+        advanceTimeBy(startTime)
+        assertThat(state.timeRemainingData).isNull()
+        job.cancelAndJoin()
+    }
+
+    @Test
+    fun timeRemainingState_lessThanOneMinute() = runTest {
+        val state = TimeRemainingState(fakeTimeSource, startTime + 59.seconds.inWholeMilliseconds)
+        val job = launch { state.run() }
+
+        fakeTimeSource.time = startTime
+        advanceTimeBy(startTime)
+        assertThat(state.timeRemainingData!!.first).isEqualTo(now_string_shortest)
+        job.cancelAndJoin()
+    }
+
+    @Test
+    fun timeRemainingState_lessThanOneMinuteInThePast() = runTest {
+        val state = TimeRemainingState(fakeTimeSource, startTime - 59.seconds.inWholeMilliseconds)
+        val job = launch { state.run() }
+
+        fakeTimeSource.time = startTime
+        advanceTimeBy(startTime)
+        assertThat(state.timeRemainingData!!.first).isEqualTo(now_string_shortest)
+        job.cancelAndJoin()
+    }
+
+    @Test
+    fun timeRemainingState_oneMinute() = runTest {
+        val state = TimeRemainingState(fakeTimeSource, startTime + 60.seconds.inWholeMilliseconds)
+        val job = launch { state.run() }
+
+        fakeTimeSource.time = startTime
+        advanceTimeBy(startTime)
+        assertThat(state.timeRemainingData!!.first).isEqualTo(duration_minutes_medium)
+        assertThat(state.timeRemainingData!!.second).isEqualTo(1)
+        job.cancelAndJoin()
+    }
+
+    @Test
+    fun timeRemainingState_lessThanOneHour() = runTest {
+        val state = TimeRemainingState(fakeTimeSource, startTime + 59.minutes.inWholeMilliseconds)
+        val job = launch { state.run() }
+
+        fakeTimeSource.time = startTime
+        advanceTimeBy(startTime)
+        assertThat(state.timeRemainingData!!.first).isEqualTo(duration_minutes_medium)
+        assertThat(state.timeRemainingData!!.second).isEqualTo(59)
+        job.cancelAndJoin()
+    }
+
+    @Test
+    fun timeRemainingState_oneHour() = runTest {
+        val state = TimeRemainingState(fakeTimeSource, startTime + 60.minutes.inWholeMilliseconds)
+        val job = launch { state.run() }
+
+        fakeTimeSource.time = startTime
+        advanceTimeBy(startTime)
+        assertThat(state.timeRemainingData!!.first).isEqualTo(duration_hours_medium)
+        assertThat(state.timeRemainingData!!.second).isEqualTo(1)
+        job.cancelAndJoin()
+    }
+
+    @Test
+    fun timeRemainingState_betweenOneAndTwoHours() = runTest {
+        val state = TimeRemainingState(fakeTimeSource, startTime + 119.minutes.inWholeMilliseconds)
+        val job = launch { state.run() }
+
+        fakeTimeSource.time = startTime
+        advanceTimeBy(startTime)
+
+        assertThat(state.timeRemainingData).isNotNull()
+        assertThat(state.timeRemainingData!!.first).isEqualTo(duration_hours_medium)
+        assertThat(state.timeRemainingData!!.second).isEqualTo(1)
+        job.cancelAndJoin()
+    }
+
+    @Test
+    fun timeRemainingState_betweenFiveAndSixHours() = runTest {
+        val state = TimeRemainingState(fakeTimeSource, startTime + 320.minutes.inWholeMilliseconds)
+        val job = launch { state.run() }
+
+        fakeTimeSource.time = startTime
+        advanceTimeBy(startTime)
+        assertThat(state.timeRemainingData!!.first).isEqualTo(duration_hours_medium)
+        assertThat(state.timeRemainingData!!.second).isEqualTo(5)
+        job.cancelAndJoin()
+    }
+
+    fun timeRemainingState_moreThan24Hours() = runTest {
+        val state =
+            TimeRemainingState(fakeTimeSource, startTime + (25 * 60.minutes.inWholeMilliseconds))
+        val job = launch { state.run() }
+
+        fakeTimeSource.time = startTime
+        advanceTimeBy(startTime)
+        assertThat(state.timeRemainingData).isNull()
+
+        job.cancelAndJoin()
+    }
+
+    @Test
+    fun timeRemainingState_updateFromMinuteToNow() = runTest {
+        fakeTimeSource.time = startTime
+        val state = TimeRemainingState(fakeTimeSource, startTime + 119.seconds.inWholeMilliseconds)
+        val job = launch { state.run() }
+
+        advanceTimeBy(startTime)
+        assertThat(state.timeRemainingData!!.first).isEqualTo(duration_minutes_medium)
+        assertThat(state.timeRemainingData!!.second).isEqualTo(1)
+
+        fakeTimeSource.time += 59.seconds.inWholeMilliseconds
+        advanceTimeBy(59.seconds.inWholeMilliseconds)
+        assertThat(state.timeRemainingData!!.first).isEqualTo(duration_minutes_medium)
+        assertThat(state.timeRemainingData!!.second).isEqualTo(1)
+
+        fakeTimeSource.time += 1.seconds.inWholeMilliseconds
+        advanceTimeBy(1.seconds.inWholeMilliseconds)
+        assertThat(state.timeRemainingData!!.first).isEqualTo(now_string_shortest)
+
+        job.cancelAndJoin()
+    }
+
+    fun timeRemainingState_updateFromNowToEmpty() = runTest {
+        fakeTimeSource.time = startTime
+        val state = TimeRemainingState(fakeTimeSource, startTime)
+        val job = launch { state.run() }
+
+        advanceTimeBy(startTime)
+        assertThat(state.timeRemainingData!!.first).isEqualTo(now_string_shortest)
+
+        fakeTimeSource.time += 62.seconds.inWholeMilliseconds
+        advanceTimeBy(62.seconds.inWholeMilliseconds)
+        assertThat(state.timeRemainingData).isNull()
+
+        job.cancelAndJoin()
+    }
+
+    @Test
+    fun timeRemainingState_updateFromHourToMinutes() = runTest {
+        fakeTimeSource.time = startTime
+        val state = TimeRemainingState(fakeTimeSource, startTime + 119.minutes.inWholeMilliseconds)
+        val job = launch { state.run() }
+
+        advanceTimeBy(startTime)
+        assertThat(state.timeRemainingData!!.first).isEqualTo(duration_hours_medium)
+        assertThat(state.timeRemainingData!!.second).isEqualTo(1)
+
+        fakeTimeSource.time += 59.minutes.inWholeMilliseconds
+        advanceTimeBy(59.minutes.inWholeMilliseconds)
+        assertThat(state.timeRemainingData!!.first).isEqualTo(duration_hours_medium)
+        assertThat(state.timeRemainingData!!.second).isEqualTo(1)
+
+        fakeTimeSource.time += 1.seconds.inWholeMilliseconds
+        advanceTimeBy(1.seconds.inWholeMilliseconds)
+        assertThat(state.timeRemainingData!!.first).isEqualTo(duration_minutes_medium)
+        assertThat(state.timeRemainingData!!.second).isEqualTo(59)
+
+        job.cancelAndJoin()
+    }
+
+    @Test
+    fun timeRemainingState_showAfterLessThan24Hours() = runTest {
+        fakeTimeSource.time = startTime
+        val state = TimeRemainingState(fakeTimeSource, startTime + 25.hours.inWholeMilliseconds)
+        val job = launch { state.run() }
+
+        advanceTimeBy(startTime)
+        assertThat(state.timeRemainingData).isNull()
+
+        fakeTimeSource.time += 1.hours.inWholeMilliseconds + 1.seconds.inWholeMilliseconds
+        advanceTimeBy(1.hours.inWholeMilliseconds + 1.seconds.inWholeMilliseconds)
+        assertThat(state.timeRemainingData!!.first).isEqualTo(duration_hours_medium)
+        assertThat(state.timeRemainingData!!.second).isEqualTo(23)
+
+        job.cancelAndJoin()
+    }
+
+    /** A fake implementation of [TimeSource] that allows the caller to set the current time */
+    private class MutableTimeSource(var time: Long = 0L) : TimeSource {
+        override fun getCurrentTime(): Long {
+            return time
+        }
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/ConversationNotificationProcessorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/ConversationNotificationProcessorTest.kt
new file mode 100644
index 0000000..67d0ade
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/ConversationNotificationProcessorTest.kt
@@ -0,0 +1,161 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.notification
+
+import android.app.Flags
+import android.app.Notification
+import android.app.Notification.EXTRA_SUMMARIZED_CONTENT
+import android.app.Person
+import android.content.pm.LauncherApps
+import android.content.pm.launcherApps
+import android.graphics.drawable.Icon
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
+import android.testing.TestableLooper.RunWithLooper
+import android.text.SpannableStringBuilder
+import android.text.style.ImageSpan
+import android.text.style.StyleSpan
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.res.R
+import com.android.systemui.statusbar.RankingBuilder
+import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow
+import com.android.systemui.statusbar.notification.row.NotificationRowContentBinderLogger
+import com.android.systemui.statusbar.notification.row.NotificationTestHelper
+import com.android.systemui.statusbar.notification.row.notificationRowContentBinderLogger
+import com.android.systemui.testKosmos
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+@RunWithLooper
+class ConversationNotificationProcessorTest : SysuiTestCase() {
+
+    private val kosmos = testKosmos()
+    private val testScope = kosmos.testScope
+    private lateinit var conversationNotificationProcessor: ConversationNotificationProcessor
+    private lateinit var testHelper: NotificationTestHelper
+    private lateinit var launcherApps: LauncherApps
+    private lateinit var logger: NotificationRowContentBinderLogger
+    private lateinit var conversationNotificationManager: ConversationNotificationManager
+
+    @Before
+    fun setup() {
+        launcherApps = kosmos.launcherApps
+        conversationNotificationManager = kosmos.conversationNotificationManager
+        logger = kosmos.notificationRowContentBinderLogger
+        testHelper = NotificationTestHelper(mContext, mDependency)
+
+        conversationNotificationProcessor =
+            ConversationNotificationProcessor(
+                context,
+                launcherApps,
+                conversationNotificationManager,
+            )
+    }
+
+    @Test
+    fun processNotification_notMessagingStyle() {
+        val nb = Notification.Builder(mContext).setSmallIcon(R.drawable.ic_person)
+        val newRow: ExpandableNotificationRow = testHelper.createRow(nb.build())
+
+        assertThat(conversationNotificationProcessor.processNotification(newRow.entry, nb, logger))
+            .isNull()
+    }
+
+    @Test
+    @DisableFlags(Flags.FLAG_NM_SUMMARIZATION, Flags.FLAG_NM_SUMMARIZATION_UI)
+    fun processNotification_messagingStyleWithSummarization_flagOff() {
+        val summarization = "hello"
+        val nb = getMessagingNotification()
+        val newRow: ExpandableNotificationRow = testHelper.createRow(nb.build())
+        newRow.entry.setRanking(
+            RankingBuilder(newRow.entry.ranking).setSummarization(summarization).build()
+        )
+
+        assertThat(conversationNotificationProcessor.processNotification(newRow.entry, nb, logger))
+            .isNotNull()
+        assertThat(nb.build().extras.getCharSequence(EXTRA_SUMMARIZED_CONTENT)).isNull()
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_NM_SUMMARIZATION)
+    fun processNotification_messagingStyleWithSummarization() {
+        val summarization = "hello"
+        val nb = getMessagingNotification()
+        val newRow: ExpandableNotificationRow = testHelper.createRow(nb.build())
+        newRow.entry.setRanking(
+            RankingBuilder(newRow.entry.ranking).setSummarization(summarization).build()
+        )
+
+        assertThat(conversationNotificationProcessor.processNotification(newRow.entry, nb, logger))
+            .isNotNull()
+
+        val processedSummary = nb.build().extras.getCharSequence(EXTRA_SUMMARIZED_CONTENT)
+        assertThat(processedSummary.toString()).isEqualTo("x$summarization")
+
+        val checkSpans = SpannableStringBuilder(processedSummary)
+        assertThat(
+                checkSpans.getSpans(
+                    /* queryStart = */ 0,
+                    /* queryEnd = */ 1,
+                    /* kind = */ ImageSpan::class.java,
+                )
+            )
+            .isNotNull()
+
+        assertThat(
+                processedSummary?.let {
+                    checkSpans.getSpans(
+                        /* queryStart = */ 0,
+                        /* queryEnd = */ it.length,
+                        /* kind = */ StyleSpan::class.java,
+                    )
+                }
+            )
+            .isNotNull()
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_NM_SUMMARIZATION)
+    fun processNotification_messagingStyleWithoutSummarization() {
+        val nb = getMessagingNotification()
+        val newRow: ExpandableNotificationRow = testHelper.createRow(nb.build())
+        assertThat(conversationNotificationProcessor.processNotification(newRow.entry, nb, logger))
+            .isNotNull()
+        assertThat(nb.build().extras.getCharSequence(EXTRA_SUMMARIZED_CONTENT)).isNull()
+    }
+
+    private fun getMessagingNotification(): Notification.Builder {
+        val displayName = "Display Name"
+        val messageText = "Message Text"
+        val personIcon = Icon.createWithResource(mContext, R.drawable.ic_person)
+        val testPerson = Person.Builder().setName(displayName).setIcon(personIcon).build()
+        val messagingStyle = Notification.MessagingStyle(testPerson)
+        messagingStyle.addMessage(
+            Notification.MessagingStyle.Message(messageText, System.currentTimeMillis(), testPerson)
+        )
+        return Notification.Builder(mContext)
+            .setSmallIcon(R.drawable.ic_person)
+            .setStyle(messagingStyle)
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/ColorizedFgsCoordinatorTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/ColorizedFgsCoordinatorTest.java
deleted file mode 100644
index 544d201..0000000
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/ColorizedFgsCoordinatorTest.java
+++ /dev/null
@@ -1,209 +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.
- */
-
-package com.android.systemui.statusbar.notification.collection.coordinator;
-
-import static android.app.Notification.FLAG_FOREGROUND_SERVICE;
-import static android.app.Notification.FLAG_PROMOTED_ONGOING;
-import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
-import static android.app.NotificationManager.IMPORTANCE_HIGH;
-import static android.app.NotificationManager.IMPORTANCE_MIN;
-
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertTrue;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.verify;
-
-import android.app.Notification;
-import android.app.PendingIntent;
-import android.app.Person;
-import android.content.Intent;
-import android.graphics.Color;
-import android.os.UserHandle;
-import android.platform.test.annotations.DisableFlags;
-import android.platform.test.annotations.EnableFlags;
-import android.testing.TestableLooper;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.statusbar.notification.collection.NotifPipeline;
-import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
-import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifPromoter;
-import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSectioner;
-import com.android.systemui.statusbar.notification.promoted.PromotedNotificationUi;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@SmallTest
-@RunWith(AndroidJUnit4.class)
-@TestableLooper.RunWithLooper
-public class ColorizedFgsCoordinatorTest extends SysuiTestCase {
-
-    private static final int NOTIF_USER_ID = 0;
-    @Mock private NotifPipeline mNotifPipeline;
-
-    private NotificationEntryBuilder mEntryBuilder;
-    private ColorizedFgsCoordinator mColorizedFgsCoordinator;
-    private NotifSectioner mFgsSection;
-
-    @Before
-    public void setup() {
-        MockitoAnnotations.initMocks(this);
-        allowTestableLooperAsMainThread();
-
-        mColorizedFgsCoordinator = new ColorizedFgsCoordinator();
-
-        mEntryBuilder = new NotificationEntryBuilder()
-                .setUser(new UserHandle(NOTIF_USER_ID));
-
-        mColorizedFgsCoordinator.attach(mNotifPipeline);
-
-        mFgsSection = mColorizedFgsCoordinator.getSectioner();
-    }
-
-    @Test
-    public void testIncludeFGSInSection_importanceDefault() {
-        // GIVEN the notification represents a colorized foreground service with > min importance
-        mEntryBuilder
-                .setFlag(mContext, FLAG_FOREGROUND_SERVICE, true)
-                .setImportance(IMPORTANCE_DEFAULT)
-                .modifyNotification(mContext)
-                .setColorized(true).setColor(Color.WHITE);
-
-        // THEN the entry is in the fgs section
-        assertTrue(mFgsSection.isInSection(mEntryBuilder.build()));
-    }
-
-    @Test
-    public void testDiscludeFGSInSection_importanceMin() {
-        // GIVEN the notification represents a colorized foreground service with min importance
-        mEntryBuilder
-                .setFlag(mContext, FLAG_FOREGROUND_SERVICE, true)
-                .setImportance(IMPORTANCE_MIN)
-                .modifyNotification(mContext)
-                .setColorized(true).setColor(Color.WHITE);
-
-        // THEN the entry is NOT in the fgs section
-        assertFalse(mFgsSection.isInSection(mEntryBuilder.build()));
-    }
-
-    @Test
-    public void testDiscludeNonFGSInSection() {
-        // GIVEN the notification represents a colorized notification with high importance that
-        // is NOT a foreground service
-        mEntryBuilder
-                .setImportance(IMPORTANCE_HIGH)
-                .setFlag(mContext, FLAG_FOREGROUND_SERVICE, false)
-                .modifyNotification(mContext).setColorized(false);
-
-        // THEN the entry is NOT in the fgs section
-        assertFalse(mFgsSection.isInSection(mEntryBuilder.build()));
-    }
-
-    @Test
-    public void testIncludeCallInSection_importanceDefault() {
-        // GIVEN the notification represents a call with > min importance
-        mEntryBuilder
-                .setImportance(IMPORTANCE_DEFAULT)
-                .modifyNotification(mContext)
-                .setStyle(makeCallStyle());
-
-        // THEN the entry is in the fgs section
-        assertTrue(mFgsSection.isInSection(mEntryBuilder.build()));
-    }
-
-    @Test
-    public void testDiscludeCallInSection_importanceMin() {
-        // GIVEN the notification represents a call with min importance
-        mEntryBuilder
-                .setImportance(IMPORTANCE_MIN)
-                .modifyNotification(mContext)
-                .setStyle(makeCallStyle());
-
-        // THEN the entry is NOT in the fgs section
-        assertFalse(mFgsSection.isInSection(mEntryBuilder.build()));
-    }
-
-    @Test
-    @EnableFlags(PromotedNotificationUi.FLAG_NAME)
-    public void testIncludePromotedOngoingInSection_flagEnabled() {
-        // GIVEN the notification has FLAG_PROMOTED_ONGOING
-        mEntryBuilder.setFlag(mContext, FLAG_PROMOTED_ONGOING, true);
-
-        // THEN the entry is in the fgs section
-        assertTrue(mFgsSection.isInSection(mEntryBuilder.build()));
-    }
-
-    @Test
-    @DisableFlags(PromotedNotificationUi.FLAG_NAME)
-    public void testDiscludePromotedOngoingInSection_flagDisabled() {
-        // GIVEN the notification has FLAG_PROMOTED_ONGOING
-        mEntryBuilder.setFlag(mContext, FLAG_PROMOTED_ONGOING, true);
-
-        // THEN the entry is NOT in the fgs section
-        assertFalse(mFgsSection.isInSection(mEntryBuilder.build()));
-    }
-
-    @Test
-    @EnableFlags(PromotedNotificationUi.FLAG_NAME)
-    public void promoterSelectsPromotedOngoing_flagEnabled() {
-        ArgumentCaptor<NotifPromoter> captor = ArgumentCaptor.forClass(NotifPromoter.class);
-        verify(mNotifPipeline).addPromoter(captor.capture());
-        NotifPromoter promoter = captor.getValue();
-
-        // GIVEN the notification has FLAG_PROMOTED_ONGOING
-        mEntryBuilder.setFlag(mContext, FLAG_PROMOTED_ONGOING, true);
-
-        // THEN the entry is promoted to top level
-        assertTrue(promoter.shouldPromoteToTopLevel(mEntryBuilder.build()));
-    }
-
-    @Test
-    @EnableFlags(PromotedNotificationUi.FLAG_NAME)
-    public void promoterIgnoresNonPromotedOngoing_flagEnabled() {
-        ArgumentCaptor<NotifPromoter> captor = ArgumentCaptor.forClass(NotifPromoter.class);
-        verify(mNotifPipeline).addPromoter(captor.capture());
-        NotifPromoter promoter = captor.getValue();
-
-        // GIVEN the notification does not have FLAG_PROMOTED_ONGOING
-        mEntryBuilder.setFlag(mContext, FLAG_PROMOTED_ONGOING, false);
-
-        // THEN the entry is NOT promoted to top level
-        assertFalse(promoter.shouldPromoteToTopLevel(mEntryBuilder.build()));
-    }
-
-    @Test
-    @DisableFlags(PromotedNotificationUi.FLAG_NAME)
-    public void noPromoterAdded_flagDisabled() {
-        verify(mNotifPipeline, never()).addPromoter(any());
-    }
-
-    private Notification.CallStyle makeCallStyle() {
-        final PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0,
-                new Intent("action"), PendingIntent.FLAG_IMMUTABLE);
-        final Person person = new Person.Builder().setName("person").build();
-        return Notification.CallStyle.forIncomingCall(person, pendingIntent, pendingIntent);
-    }
-}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/ColorizedFgsCoordinatorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/ColorizedFgsCoordinatorTest.kt
new file mode 100644
index 0000000..e93c742
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/ColorizedFgsCoordinatorTest.kt
@@ -0,0 +1,191 @@
+/*
+ * 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.
+ */
+package com.android.systemui.statusbar.notification.collection.coordinator
+
+import android.app.Notification
+import android.app.NotificationManager
+import android.app.PendingIntent
+import android.app.Person
+import android.content.Intent
+import android.graphics.Color
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
+import android.testing.TestableLooper.RunWithLooper
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.kosmos.useUnconfinedTestDispatcher
+import com.android.systemui.statusbar.notification.collection.buildEntry
+import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifPromoter
+import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSectioner
+import com.android.systemui.statusbar.notification.collection.notifPipeline
+import com.android.systemui.statusbar.notification.promoted.PromotedNotificationUi
+import com.android.systemui.testKosmos
+import com.android.systemui.util.mockito.withArgCaptor
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertTrue
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.kotlin.any
+import org.mockito.kotlin.never
+import org.mockito.kotlin.verify
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+@RunWithLooper
+class ColorizedFgsCoordinatorTest : SysuiTestCase() {
+    private val kosmos = testKosmos().useUnconfinedTestDispatcher()
+    private val notifPipeline
+        get() = kosmos.notifPipeline
+
+    private lateinit var colorizedFgsCoordinator: ColorizedFgsCoordinator
+    private lateinit var sectioner: NotifSectioner
+
+    @Before
+    fun setup() {
+        allowTestableLooperAsMainThread()
+
+        colorizedFgsCoordinator = ColorizedFgsCoordinator()
+        colorizedFgsCoordinator.attach(notifPipeline)
+        sectioner = colorizedFgsCoordinator.sectioner
+    }
+
+    @Test
+    fun testIncludeFGSInSection_importanceDefault() {
+        // GIVEN the notification represents a colorized foreground service with > min importance
+        val entry = buildEntry {
+            setFlag(mContext, Notification.FLAG_FOREGROUND_SERVICE, true)
+            setImportance(NotificationManager.IMPORTANCE_DEFAULT)
+            modifyNotification(mContext).setColorized(true).setColor(Color.WHITE)
+        }
+
+        // THEN the entry is in the fgs section
+        assertTrue(sectioner.isInSection(entry))
+    }
+
+    @Test
+    fun testDiscludeFGSInSection_importanceMin() {
+        // GIVEN the notification represents a colorized foreground service with min importance
+        val entry = buildEntry {
+            setFlag(mContext, Notification.FLAG_FOREGROUND_SERVICE, true)
+            setImportance(NotificationManager.IMPORTANCE_MIN)
+            modifyNotification(mContext).setColorized(true).setColor(Color.WHITE)
+        }
+
+        // THEN the entry is NOT in the fgs section
+        assertFalse(sectioner.isInSection(entry))
+    }
+
+    @Test
+    fun testDiscludeNonFGSInSection() {
+        // GIVEN the notification represents a colorized notification with high importance that
+        // is NOT a foreground service
+        val entry = buildEntry {
+            setImportance(NotificationManager.IMPORTANCE_HIGH)
+            setFlag(mContext, Notification.FLAG_FOREGROUND_SERVICE, false)
+            modifyNotification(mContext).setColorized(false)
+        }
+
+        // THEN the entry is NOT in the fgs section
+        assertFalse(sectioner.isInSection(entry))
+    }
+
+    @Test
+    fun testIncludeCallInSection_importanceDefault() {
+        // GIVEN the notification represents a call with > min importance
+        val entry = buildEntry {
+            setImportance(NotificationManager.IMPORTANCE_DEFAULT)
+            modifyNotification(mContext).setStyle(makeCallStyle())
+        }
+
+        // THEN the entry is in the fgs section
+        assertTrue(sectioner.isInSection(entry))
+    }
+
+    @Test
+    fun testDiscludeCallInSection_importanceMin() {
+        // GIVEN the notification represents a call with min importance
+        val entry = buildEntry {
+            setImportance(NotificationManager.IMPORTANCE_MIN)
+            modifyNotification(mContext).setStyle(makeCallStyle())
+        }
+
+        // THEN the entry is NOT in the fgs section
+        assertFalse(sectioner.isInSection(entry))
+    }
+
+    @Test
+    @EnableFlags(PromotedNotificationUi.FLAG_NAME)
+    fun testIncludePromotedOngoingInSection_flagEnabled() {
+        // GIVEN the notification has FLAG_PROMOTED_ONGOING
+        val entry = buildEntry { setFlag(mContext, Notification.FLAG_PROMOTED_ONGOING, true) }
+
+        // THEN the entry is in the fgs section
+        assertTrue(sectioner.isInSection(entry))
+    }
+
+    @Test
+    @DisableFlags(PromotedNotificationUi.FLAG_NAME)
+    fun testDiscludePromotedOngoingInSection_flagDisabled() {
+        // GIVEN the notification has FLAG_PROMOTED_ONGOING
+        val entry = buildEntry { setFlag(mContext, Notification.FLAG_PROMOTED_ONGOING, true) }
+
+        // THEN the entry is NOT in the fgs section
+        assertFalse(sectioner.isInSection(entry))
+    }
+
+    @Test
+    @EnableFlags(PromotedNotificationUi.FLAG_NAME)
+    fun promoterSelectsPromotedOngoing_flagEnabled() {
+        val promoter: NotifPromoter = withArgCaptor { verify(notifPipeline).addPromoter(capture()) }
+
+        // GIVEN the notification has FLAG_PROMOTED_ONGOING
+        val entry = buildEntry { setFlag(mContext, Notification.FLAG_PROMOTED_ONGOING, true) }
+
+        // THEN the entry is promoted to top level
+        assertTrue(promoter.shouldPromoteToTopLevel(entry))
+    }
+
+    @Test
+    @EnableFlags(PromotedNotificationUi.FLAG_NAME)
+    fun promoterIgnoresNonPromotedOngoing_flagEnabled() {
+        val promoter: NotifPromoter = withArgCaptor { verify(notifPipeline).addPromoter(capture()) }
+
+        // GIVEN the notification does not have FLAG_PROMOTED_ONGOING
+        val entry = buildEntry { setFlag(mContext, Notification.FLAG_PROMOTED_ONGOING, false) }
+
+        // THEN the entry is NOT promoted to top level
+        assertFalse(promoter.shouldPromoteToTopLevel(entry))
+    }
+
+    @Test
+    @DisableFlags(PromotedNotificationUi.FLAG_NAME)
+    fun noPromoterAdded_flagDisabled() {
+        verify(notifPipeline, never()).addPromoter(any())
+    }
+
+    private fun makeCallStyle(): Notification.CallStyle {
+        val pendingIntent =
+            PendingIntent.getBroadcast(mContext, 0, Intent("action"), PendingIntent.FLAG_IMMUTABLE)
+        val person = Person.Builder().setName("person").build()
+        return Notification.CallStyle.forOngoingCall(person, pendingIntent)
+    }
+
+    companion object {
+        private const val NOTIF_USER_ID = 0
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/emptyshade/ui/viewmodel/EmptyShadeViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/emptyshade/ui/viewmodel/EmptyShadeViewModelTest.kt
index 5ba972de..7cbc839 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/emptyshade/ui/viewmodel/EmptyShadeViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/emptyshade/ui/viewmodel/EmptyShadeViewModelTest.kt
@@ -140,7 +140,7 @@
 
     @Test
     @EnableFlags(ModesEmptyShadeFix.FLAG_NAME)
-    @DisableFlags(Flags.FLAG_MODES_UI, Flags.FLAG_MODES_API)
+    @DisableFlags(Flags.FLAG_MODES_UI)
     fun text_changesWhenNotifsHiddenInShade() =
         testScope.runTest {
             val text by collectLastValue(underTest.text)
@@ -163,7 +163,7 @@
         }
 
     @Test
-    @EnableFlags(ModesEmptyShadeFix.FLAG_NAME, Flags.FLAG_MODES_UI, Flags.FLAG_MODES_API)
+    @EnableFlags(ModesEmptyShadeFix.FLAG_NAME, Flags.FLAG_MODES_UI)
     fun text_changesWhenLocaleChanges() =
         testScope.runTest {
             val text by collectLastValue(underTest.text)
@@ -186,7 +186,7 @@
         }
 
     @Test
-    @EnableFlags(ModesEmptyShadeFix.FLAG_NAME, Flags.FLAG_MODES_UI, Flags.FLAG_MODES_API)
+    @EnableFlags(ModesEmptyShadeFix.FLAG_NAME, Flags.FLAG_MODES_UI)
     fun text_reflectsModesHidingNotifications() =
         testScope.runTest {
             val text by collectLastValue(underTest.text)
@@ -250,7 +250,7 @@
         }
 
     @Test
-    @EnableFlags(ModesEmptyShadeFix.FLAG_NAME, Flags.FLAG_MODES_UI, Flags.FLAG_MODES_API)
+    @EnableFlags(ModesEmptyShadeFix.FLAG_NAME, Flags.FLAG_MODES_UI)
     fun onClick_whenHistoryDisabled_leadsToSettingsPage() =
         testScope.runTest {
             val onClick by collectLastValue(underTest.onClick)
@@ -264,7 +264,7 @@
         }
 
     @Test
-    @EnableFlags(ModesEmptyShadeFix.FLAG_NAME, Flags.FLAG_MODES_UI, Flags.FLAG_MODES_API)
+    @EnableFlags(ModesEmptyShadeFix.FLAG_NAME, Flags.FLAG_MODES_UI)
     fun onClick_whenHistoryEnabled_leadsToHistoryPage() =
         testScope.runTest {
             val onClick by collectLastValue(underTest.onClick)
@@ -279,7 +279,7 @@
         }
 
     @Test
-    @EnableFlags(ModesEmptyShadeFix.FLAG_NAME, Flags.FLAG_MODES_UI, Flags.FLAG_MODES_API)
+    @EnableFlags(ModesEmptyShadeFix.FLAG_NAME, Flags.FLAG_MODES_UI)
     fun onClick_whenOneModeHidingNotifications_leadsToModeSettings() =
         testScope.runTest {
             val onClick by collectLastValue(underTest.onClick)
@@ -305,7 +305,7 @@
         }
 
     @Test
-    @EnableFlags(ModesEmptyShadeFix.FLAG_NAME, Flags.FLAG_MODES_UI, Flags.FLAG_MODES_API)
+    @EnableFlags(ModesEmptyShadeFix.FLAG_NAME, Flags.FLAG_MODES_UI)
     fun onClick_whenMultipleModesHidingNotifications_leadsToGeneralModesSettings() =
         testScope.runTest {
             val onClick by collectLastValue(underTest.onClick)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/icon/domain/interactor/NotificationIconsInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/icon/domain/interactor/NotificationIconsInteractorTest.kt
index ee4d099..ee698ae 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/icon/domain/interactor/NotificationIconsInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/icon/domain/interactor/NotificationIconsInteractorTest.kt
@@ -32,8 +32,12 @@
 import com.android.systemui.statusbar.notification.data.repository.notificationsKeyguardViewStateRepository
 import com.android.systemui.statusbar.notification.domain.interactor.activeNotificationsInteractor
 import com.android.systemui.statusbar.notification.domain.interactor.headsUpNotificationIconInteractor
+import com.android.systemui.statusbar.notification.promoted.domain.interactor.aodPromotedNotificationInteractor
+import com.android.systemui.statusbar.notification.promoted.shared.model.PromotedNotificationContentModel
+import com.android.systemui.statusbar.notification.promoted.shared.model.PromotedNotificationContentModel.Style.Base
 import com.android.systemui.statusbar.notification.shared.byIsAmbient
 import com.android.systemui.statusbar.notification.shared.byIsLastMessageFromReply
+import com.android.systemui.statusbar.notification.shared.byIsPromoted
 import com.android.systemui.statusbar.notification.shared.byIsPulsing
 import com.android.systemui.statusbar.notification.shared.byIsRowDismissed
 import com.android.systemui.statusbar.notification.shared.byIsSilent
@@ -58,12 +62,14 @@
     private val testScope = kosmos.testScope
     private val activeNotificationListRepository = kosmos.activeNotificationListRepository
     private val notificationsKeyguardInteractor = kosmos.notificationsKeyguardInteractor
+    private val aodPromotedNotificationInteractor = kosmos.aodPromotedNotificationInteractor
 
     private val underTest =
         NotificationIconsInteractor(
             kosmos.activeNotificationsInteractor,
             kosmos.bubblesOptional,
             kosmos.headsUpNotificationIconInteractor,
+            kosmos.aodPromotedNotificationInteractor,
             kosmos.notificationsKeyguardViewStateRepository,
         )
 
@@ -141,6 +147,22 @@
             notificationsKeyguardInteractor.setNotificationsFullyHidden(true)
             assertThat(filteredSet).comparingElementsUsing(byIsPulsing).contains(true)
         }
+
+    @Test
+    fun filteredEntrySet_showAodPromoted() {
+        testScope.runTest {
+            val filteredSet by collectLastValue(underTest.filteredNotifSet(showAodPromoted = true))
+            assertThat(filteredSet).comparingElementsUsing(byIsPromoted).contains(true)
+        }
+    }
+
+    @Test
+    fun filteredEntrySet_noAodPromoted() {
+        testScope.runTest {
+            val filteredSet by collectLastValue(underTest.filteredNotifSet(showAodPromoted = false))
+            assertThat(filteredSet).comparingElementsUsing(byIsPromoted).doesNotContain(true)
+        }
+    }
 }
 
 @SmallTest
@@ -326,4 +348,12 @@
         activeNotificationModel(key = "notif5", isLastMessageFromReply = true),
         activeNotificationModel(key = "notif6", isSuppressedFromStatusBar = true),
         activeNotificationModel(key = "notif7", isPulsing = true),
+        activeNotificationModel(key = "notif8", promotedContent = promotedContent("notif8", Base)),
     )
+
+private fun promotedContent(
+    key: String,
+    style: PromotedNotificationContentModel.Style,
+): PromotedNotificationContentModel {
+    return PromotedNotificationContentModel.Builder(key).apply { this.style = style }.build()
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java
index da31cd9..7d406b4 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java
@@ -209,6 +209,26 @@
     }
 
     @Test
+    public void testInflationProcessesMessagingStyle() throws Exception {
+        String displayName = "Display Name";
+        String messageText = "Message Text";
+        Icon personIcon = Icon.createWithResource(
+                mContext, com.android.systemui.res.R.drawable.ic_person);
+        Person testPerson = new Person.Builder().setName(displayName).setIcon(personIcon).build();
+        Notification.MessagingStyle messagingStyle = new Notification.MessagingStyle(testPerson);
+        messagingStyle.addMessage(new Notification.MessagingStyle.Message(
+                messageText, System.currentTimeMillis(), testPerson));
+        Notification messageNotif = new Notification.Builder(mContext)
+                .setSmallIcon(com.android.systemui.res.R.drawable.ic_person)
+                .setStyle(messagingStyle)
+                .build();
+        ExpandableNotificationRow newRow = mHelper.createRow(messageNotif);
+        inflateAndWait(mNotificationInflater, FLAG_CONTENT_VIEW_ALL, newRow);
+
+        verify(mConversationNotificationProcessor).processNotification(any(), any(), any());
+    }
+
+    @Test
     @Ignore
     public void testInflationIsRetriedIfAsyncFails() throws Exception {
         NotificationContentInflater.InflationProgress result =
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.kt
index d43cc78..4c1f4f1 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.kt
@@ -71,6 +71,10 @@
 import com.android.systemui.statusbar.notification.domain.interactor.activeNotificationsInteractor
 import com.android.systemui.statusbar.notification.headsup.HeadsUpManager
 import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier
+import com.android.systemui.statusbar.notification.row.icon.AppIconProvider
+import com.android.systemui.statusbar.notification.row.icon.NotificationIconStyleProvider
+import com.android.systemui.statusbar.notification.row.icon.appIconProvider
+import com.android.systemui.statusbar.notification.row.icon.notificationIconStyleProvider
 import com.android.systemui.statusbar.notification.stack.NotificationListContainer
 import com.android.systemui.statusbar.policy.DeviceProvisionedController
 import com.android.systemui.testKosmos
@@ -203,6 +207,8 @@
                 accessibilityManager,
                 highPriorityProvider,
                 iNotificationManager,
+                kosmos.appIconProvider,
+                kosmos.notificationIconStyleProvider,
                 userManager,
                 peopleSpaceWidgetManager,
                 launcherApps,
@@ -512,6 +518,8 @@
             .bindNotification(
                 any<PackageManager>(),
                 any<INotificationManager>(),
+                any<AppIconProvider>(),
+                any<NotificationIconStyleProvider>(),
                 eq(onUserInteractionCallback),
                 eq(channelEditorDialogController),
                 eq(statusBarNotification.packageName),
@@ -550,6 +558,8 @@
             .bindNotification(
                 any<PackageManager>(),
                 any<INotificationManager>(),
+                any<AppIconProvider>(),
+                any<NotificationIconStyleProvider>(),
                 eq(onUserInteractionCallback),
                 eq(channelEditorDialogController),
                 eq(statusBarNotification.packageName),
@@ -586,6 +596,8 @@
             .bindNotification(
                 any<PackageManager>(),
                 any<INotificationManager>(),
+                any<AppIconProvider>(),
+                any<NotificationIconStyleProvider>(),
                 eq(onUserInteractionCallback),
                 eq(channelEditorDialogController),
                 eq(statusBarNotification.packageName),
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.kt
index 2945fa9..96ae070 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.kt
@@ -64,6 +64,10 @@
 import com.android.systemui.statusbar.notification.AssistantFeedbackController
 import com.android.systemui.statusbar.notification.collection.NotificationEntry
 import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder
+import com.android.systemui.statusbar.notification.row.icon.AppIconProvider
+import com.android.systemui.statusbar.notification.row.icon.NotificationIconStyleProvider
+import com.android.systemui.statusbar.notification.row.icon.appIconProvider
+import com.android.systemui.statusbar.notification.row.icon.notificationIconStyleProvider
 import com.android.telecom.telecomManager
 import com.google.common.truth.Truth.assertThat
 import java.util.concurrent.CountDownLatch
@@ -862,6 +866,8 @@
     private fun bindNotification(
         pm: PackageManager = this.mockPackageManager,
         iNotificationManager: INotificationManager = this.mockINotificationManager,
+        appIconProvider: AppIconProvider = kosmos.appIconProvider,
+        iconStyleProvider: NotificationIconStyleProvider = kosmos.notificationIconStyleProvider,
         onUserInteractionCallback: OnUserInteractionCallback = this.onUserInteractionCallback,
         channelEditorDialogController: ChannelEditorDialogController =
             this.channelEditorDialogController,
@@ -882,6 +888,8 @@
         underTest.bindNotification(
             pm,
             iNotificationManager,
+            appIconProvider,
+            iconStyleProvider,
             onUserInteractionCallback,
             channelEditorDialogController,
             pkg,
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImplTest.kt
index c77b09a..82eca37 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImplTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImplTest.kt
@@ -587,6 +587,35 @@
         Assert.assertFalse(hasText(publicView, contentTitle))
     }
 
+    @Test
+    @Throws(java.lang.Exception::class)
+    @EnableFlags(android.app.Flags.FLAG_NM_SUMMARIZATION)
+    fun testAllMessagingStyleProcessedAsConversations() {
+        val displayName = "Display Name"
+        val messageText = "Message Text"
+        val personIcon = Icon.createWithResource(mContext, R.drawable.ic_person)
+        val testPerson = Person.Builder().setName(displayName).setIcon(personIcon).build()
+        val messagingStyle = Notification.MessagingStyle(testPerson)
+        messagingStyle.addMessage(
+            Notification.MessagingStyle.Message(messageText, System.currentTimeMillis(), testPerson)
+        )
+        val messageNotif =
+            Notification.Builder(mContext)
+                .setSmallIcon(R.drawable.ic_person)
+                .setStyle(messagingStyle)
+                .build()
+        val newRow: ExpandableNotificationRow = testHelper.createRow(messageNotif)
+
+        inflateAndWait(
+            false,
+            notificationInflater,
+            FLAG_CONTENT_VIEW_ALL,
+            REDACTION_TYPE_NONE,
+            newRow,
+        )
+        verify(conversationNotificationProcessor).processNotification(any(), any(), any())
+    }
+
     private class ExceptionHolder {
         var exception: Exception? = null
     }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/PromotedNotificationInfoTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/PromotedNotificationInfoTest.java
index acdbd62..5638e0b 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/PromotedNotificationInfoTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/PromotedNotificationInfoTest.java
@@ -48,6 +48,8 @@
 import com.android.systemui.statusbar.notification.AssistantFeedbackController;
 import com.android.systemui.statusbar.notification.collection.NotificationEntry;
 import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
+import com.android.systemui.statusbar.notification.row.icon.AppIconProvider;
+import com.android.systemui.statusbar.notification.row.icon.NotificationIconStyleProvider;
 
 import org.junit.Before;
 import org.junit.Rule;
@@ -57,8 +59,6 @@
 import org.mockito.junit.MockitoJUnit;
 import org.mockito.junit.MockitoRule;
 
-import java.util.concurrent.CountDownLatch;
-
 @SmallTest
 @RunWith(AndroidJUnit4.class)
 @TestableLooper.RunWithLooper
@@ -82,6 +82,10 @@
     @Mock
     private INotificationManager mMockINotificationManager;
     @Mock
+    private AppIconProvider mMockAppIconProvider;
+    @Mock
+    private NotificationIconStyleProvider mMockIconStyleProvider;
+    @Mock
     private PackageManager mMockPackageManager;
     @Mock
     private OnUserInteractionCallback mOnUserInteractionCallback;
@@ -127,10 +131,11 @@
     public void testBindNotification_setsOnClickListenerForFeedback() throws Exception {
 
         // Bind the notification to the Info object
-        final CountDownLatch latch = new CountDownLatch(1);
         mInfo.bindNotification(
                 mMockPackageManager,
                 mMockINotificationManager,
+                mMockAppIconProvider,
+                mMockIconStyleProvider,
                 mOnUserInteractionCallback,
                 mChannelEditorDialogController,
                 TEST_PACKAGE_NAME,
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/shared/TestActiveNotificationModel.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/shared/TestActiveNotificationModel.kt
index 16c5c8a..531b30b 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/shared/TestActiveNotificationModel.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/shared/TestActiveNotificationModel.kt
@@ -33,7 +33,12 @@
 val byIsLastMessageFromReply: Correspondence<ActiveNotificationModel, Boolean> =
     Correspondence.transforming(
         { it?.isLastMessageFromReply },
-        "has an isLastMessageFromReply value of"
+        "has an isLastMessageFromReply value of",
     )
 val byIsPulsing: Correspondence<ActiveNotificationModel, Boolean> =
     Correspondence.transforming({ it?.isPulsing }, "has an isPulsing value of")
+val byIsPromoted: Correspondence<ActiveNotificationModel, Boolean> =
+    Correspondence.transforming(
+        { it?.promotedContent != null },
+        "has (or doesn't have) a promoted content model",
+    )
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.kt
index 57b7df7..31f8590 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.kt
@@ -51,11 +51,13 @@
 import com.android.systemui.shade.ShadeViewStateProvider
 import com.android.systemui.statusbar.CommandQueue
 import com.android.systemui.statusbar.StatusBarState
+import com.android.systemui.statusbar.core.NewStatusBarIcons
 import com.android.systemui.statusbar.data.repository.StatusBarContentInsetsProviderStore
 import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler
 import com.android.systemui.statusbar.layout.mockStatusBarContentInsetsProvider
 import com.android.systemui.statusbar.phone.ui.StatusBarIconController
 import com.android.systemui.statusbar.phone.ui.TintedIconManager
+import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.batteryViewModelFactory
 import com.android.systemui.statusbar.policy.BatteryController
 import com.android.systemui.statusbar.policy.ConfigurationController
 import com.android.systemui.statusbar.policy.KeyguardStateController
@@ -85,6 +87,7 @@
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 @RunWithLooper(setAsMainLooper = true)
+@DisableFlags(NewStatusBarIcons.FLAG_NAME)
 class KeyguardStatusBarViewControllerTest : SysuiTestCase() {
     private lateinit var kosmos: Kosmos
     private lateinit var testScope: TestScope
@@ -190,6 +193,7 @@
             statusBarIconController,
             iconManagerFactory,
             batteryMeterViewController,
+            kosmos.batteryViewModelFactory,
             shadeViewStateProvider,
             keyguardStateController,
             keyguardBypassController,
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java
index 6f785a3..dde6e2e 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java
@@ -65,11 +65,9 @@
 import com.android.keyguard.KeyguardMessageAreaController;
 import com.android.keyguard.KeyguardSecurityModel;
 import com.android.keyguard.KeyguardUpdateMonitor;
-import com.android.keyguard.KeyguardUpdateMonitorCallback;
 import com.android.keyguard.ViewMediatorCallback;
 import com.android.systemui.Flags;
 import com.android.systemui.SysuiTestCase;
-import com.android.systemui.biometrics.domain.interactor.UdfpsOverlayInteractor;
 import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor;
 import com.android.systemui.bouncer.domain.interactor.BouncerInteractor;
 import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerCallbackInteractor;
@@ -146,7 +144,6 @@
     @Mock private SysuiStatusBarStateController mStatusBarStateController;
     @Mock private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
     @Mock private View mNotificationContainer;
-    @Mock private KeyguardBypassController mBypassController;
     @Mock private KeyguardMessageAreaController.Factory mKeyguardMessageAreaFactory;
     @Mock private KeyguardMessageAreaController mKeyguardMessageAreaController;
     @Mock private KeyguardMessageArea mKeyguardMessageArea;
@@ -158,7 +155,6 @@
     @Mock private PrimaryBouncerCallbackInteractor mPrimaryBouncerCallbackInteractor;
     @Mock private PrimaryBouncerInteractor mPrimaryBouncerInteractor;
     @Mock private AlternateBouncerInteractor mAlternateBouncerInteractor;
-    @Mock private UdfpsOverlayInteractor mUdfpsOverlayInteractor;
     @Mock private ActivityStarter mActivityStarter;
     @Mock private BouncerView mBouncerView;
     @Mock private BouncerViewDelegate mBouncerViewDelegate;
@@ -167,7 +163,6 @@
     @Mock private NotificationShadeWindowView mNotificationShadeWindowView;
     @Mock private WindowInsetsController mWindowInsetsController;
     @Mock private TaskbarDelegate mTaskbarDelegate;
-    @Mock private StatusBarKeyguardViewManager.KeyguardViewManagerCallback mCallback;
     @Mock private SelectedUserInteractor mSelectedUserInteractor;
     @Mock private DeviceEntryInteractor mDeviceEntryInteractor;
     @Mock private SceneInteractor mSceneInteractor;
@@ -190,8 +185,6 @@
     private KeyguardTransitionInteractor mKeyguardTransitionInteractor;
     @Captor
     private ArgumentCaptor<OnBackInvokedCallback> mBackCallbackCaptor;
-    @Captor
-    private ArgumentCaptor<KeyguardUpdateMonitorCallback> mKeyguardUpdateMonitorCallback;
     @Mock
     private KeyguardDismissActionInteractor mKeyguardDismissActionInteractor;
 
@@ -227,7 +220,6 @@
                         mock(DockManager.class),
                         mNotificationShadeWindowController,
                         mKeyguardStateController,
-                        mKeyguardMessageAreaFactory,
                         Optional.of(mSysUiUnfoldComponent),
                         () -> mShadeController,
                         mLatencyTracker,
@@ -236,7 +228,6 @@
                         mPrimaryBouncerInteractor,
                         mBouncerView,
                         mAlternateBouncerInteractor,
-                        mUdfpsOverlayInteractor,
                         mActivityStarter,
                         mKeyguardTransitionInteractor,
                         mock(KeyguardDismissTransitionInteractor.class),
@@ -732,7 +723,6 @@
                         mock(DockManager.class),
                         mock(NotificationShadeWindowController.class),
                         mKeyguardStateController,
-                        mKeyguardMessageAreaFactory,
                         Optional.of(mSysUiUnfoldComponent),
                         () -> mShadeController,
                         mLatencyTracker,
@@ -741,7 +731,6 @@
                         mPrimaryBouncerInteractor,
                         mBouncerView,
                         mAlternateBouncerInteractor,
-                        mUdfpsOverlayInteractor,
                         mActivityStarter,
                         mock(KeyguardTransitionInteractor.class),
                         mock(KeyguardDismissTransitionInteractor.class),
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/FakeHomeStatusBarViewModel.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/FakeHomeStatusBarViewModel.kt
index 4759c08..183cd8f 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/FakeHomeStatusBarViewModel.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/FakeHomeStatusBarViewModel.kt
@@ -19,6 +19,9 @@
 import android.graphics.Color
 import android.graphics.Rect
 import android.view.View
+import androidx.compose.runtime.getValue
+import com.android.systemui.lifecycle.ExclusiveActivatable
+import com.android.systemui.lifecycle.Hydrator
 import com.android.systemui.plugins.DarkIconDispatcher
 import com.android.systemui.statusbar.chips.mediaprojection.domain.model.MediaProjectionStopDialogModel
 import com.android.systemui.statusbar.chips.ui.model.MultipleOngoingActivityChipsModel
@@ -26,15 +29,20 @@
 import com.android.systemui.statusbar.chips.ui.model.OngoingActivityChipModel
 import com.android.systemui.statusbar.events.shared.model.SystemEventAnimationState.Idle
 import com.android.systemui.statusbar.featurepods.popups.shared.model.PopupChipModel
+import com.android.systemui.statusbar.phone.domain.interactor.IsAreaDark
+import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.BatteryViewModel
 import com.android.systemui.statusbar.pipeline.shared.ui.model.SystemInfoCombinedVisibilityModel
 import com.android.systemui.statusbar.pipeline.shared.ui.model.VisibilityModel
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.MutableSharedFlow
 import kotlinx.coroutines.flow.MutableStateFlow
+import org.mockito.Mockito.mock
 
 class FakeHomeStatusBarViewModel(
     override val operatorNameViewModel: StatusBarOperatorNameViewModel
-) : HomeStatusBarViewModel {
+) : HomeStatusBarViewModel, ExclusiveActivatable() {
+    private val hydrator = Hydrator("FakeHomeStatusBarViewModel.hydrator")
+
     override val areNotificationsLightsOut = MutableStateFlow(false)
 
     override val isTransitioningFromLockscreenToOccluded = MutableStateFlow(false)
@@ -56,6 +64,11 @@
 
     override val isHomeStatusBarAllowedByScene = MutableStateFlow(false)
 
+    override val batteryViewModelFactory: BatteryViewModel.Factory =
+        object : BatteryViewModel.Factory {
+            override fun create(): BatteryViewModel = mock(BatteryViewModel::class.java)
+        }
+
     override val shouldShowOperatorNameView = MutableStateFlow(false)
 
     override val isClockVisible =
@@ -80,6 +93,7 @@
 
     var darkIconTint = Color.BLACK
     var lightIconTint = Color.WHITE
+    var darkIntensity = 0f
 
     override val areaTint: Flow<StatusBarTintColor> =
         MutableStateFlow(
@@ -91,4 +105,22 @@
                 }
             }
         )
+
+    val isAreaDarkSource =
+        MutableStateFlow(
+            IsAreaDark { viewBounds ->
+                if (DarkIconDispatcher.isInAreas(darkRegions, viewBounds)) {
+                    darkIntensity < 0.5f
+                } else {
+                    false
+                }
+            }
+        )
+
+    override val areaDark: IsAreaDark by
+        hydrator.hydratedStateOf(traceName = "areaDark", source = isAreaDarkSource)
+
+    override suspend fun onActivated(): Nothing {
+        hydrator.activate()
+    }
 }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/domain/interactor/ZenModeInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/domain/interactor/ZenModeInteractorTest.kt
index ff1ffcc..22e28d8 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/domain/interactor/ZenModeInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/domain/interactor/ZenModeInteractorTest.kt
@@ -469,7 +469,7 @@
         }
 
     @Test
-    @EnableFlags(ModesEmptyShadeFix.FLAG_NAME, Flags.FLAG_MODES_UI, Flags.FLAG_MODES_API)
+    @EnableFlags(ModesEmptyShadeFix.FLAG_NAME, Flags.FLAG_MODES_UI)
     fun modesHidingNotifications_onlyIncludesModesWithNotifListSuppression() =
         kosmos.runTest {
             val modesHidingNotifications by collectLastValue(underTest.modesHidingNotifications)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/unfold/DisplaySwitchLatencyTrackerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/unfold/DisplaySwitchLatencyTrackerTest.kt
index 354edac..36e18e6 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/unfold/DisplaySwitchLatencyTrackerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/unfold/DisplaySwitchLatencyTrackerTest.kt
@@ -56,7 +56,6 @@
 import com.android.systemui.unfold.domain.interactor.UnfoldTransitionInteractor
 import com.android.systemui.unfoldedDeviceState
 import com.android.systemui.util.animation.data.repository.fakeAnimationStatusRepository
-import com.android.systemui.util.mockito.any
 import com.android.systemui.util.mockito.capture
 import com.android.systemui.util.time.FakeSystemClock
 import com.google.common.truth.Truth.assertThat
@@ -79,8 +78,10 @@
 import org.mockito.Mockito.verify
 import org.mockito.Mockito.`when` as whenever
 import org.mockito.MockitoAnnotations
+import org.mockito.kotlin.any
 import org.mockito.kotlin.mock
 import org.mockito.kotlin.times
+import org.mockito.kotlin.verifyNoMoreInteractions
 
 @RunWith(AndroidJUnit4::class)
 @SmallTest
@@ -603,12 +604,39 @@
         }
     }
 
+    @Test
+    fun foldingStarted_screenStillOn_eventSentOnlyAfterScreenSwitches() {
+        // can happen for both folding and unfolding (with animations off) but it's more likely to
+        // happen when folding as waiting for screen on is the default case then
+        testScope.runTest {
+            startInUnfoldedState(displaySwitchLatencyTracker)
+            setDeviceState(FOLDED)
+            powerInteractor.setScreenPowerState(SCREEN_ON)
+            runCurrent()
+
+            verifyNoMoreInteractions(displaySwitchLatencyLogger)
+
+            powerInteractor.setScreenPowerState(SCREEN_OFF)
+            runCurrent()
+            powerInteractor.setScreenPowerState(SCREEN_ON)
+            runCurrent()
+
+            verify(displaySwitchLatencyLogger).log(any())
+        }
+    }
+
     private suspend fun TestScope.startInFoldedState(tracker: DisplaySwitchLatencyTracker) {
         setDeviceState(FOLDED)
         tracker.start()
         runCurrent()
     }
 
+    private suspend fun TestScope.startInUnfoldedState(tracker: DisplaySwitchLatencyTracker) {
+        setDeviceState(UNFOLDED)
+        tracker.start()
+        runCurrent()
+    }
+
     private suspend fun TestScope.startUnfolding() {
         setDeviceState(HALF_FOLDED)
         powerInteractor.setScreenPowerState(SCREEN_OFF)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioSharingStreamSliderViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioSharingStreamSliderViewModelTest.kt
index e484d80..04ab988 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioSharingStreamSliderViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioSharingStreamSliderViewModelTest.kt
@@ -19,21 +19,17 @@
 import android.bluetooth.BluetoothDevice
 import androidx.test.ext.junit.runners.AndroidJUnit4
 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.common.shared.model.Icon
-import com.android.systemui.coroutines.collectLastValue
-import com.android.systemui.haptics.slider.sliderHapticsViewModelFactory
-import com.android.systemui.kosmos.testScope
+import com.android.systemui.kosmos.applicationCoroutineScope
+import com.android.systemui.kosmos.collectLastValue
+import com.android.systemui.kosmos.runCurrent
+import com.android.systemui.kosmos.runTest
 import com.android.systemui.res.R
 import com.android.systemui.testKosmos
 import com.android.systemui.volume.data.repository.audioSharingRepository
-import com.android.systemui.volume.domain.interactor.audioSharingInteractor
 import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.test.runCurrent
-import kotlinx.coroutines.test.runTest
-import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.kotlin.mock
@@ -43,47 +39,30 @@
 class AudioSharingStreamSliderViewModelTest : SysuiTestCase() {
 
     private val kosmos = testKosmos()
-    private val testScope = kosmos.testScope
 
-    private lateinit var stream: AudioSharingStreamSliderViewModel
-
-    @Before
-    fun setUp() {
-        stream = audioSharingStreamSliderViewModel()
-    }
-
-    private fun audioSharingStreamSliderViewModel(): AudioSharingStreamSliderViewModel {
-        return AudioSharingStreamSliderViewModel(
-            testScope.backgroundScope,
-            context,
-            kosmos.audioSharingInteractor,
-            kosmos.uiEventLogger,
-            kosmos.sliderHapticsViewModelFactory,
-        )
-    }
+    private val underTest: AudioSharingStreamSliderViewModel =
+        with(kosmos) { audioSharingStreamSliderViewModelFactory.create(applicationCoroutineScope) }
 
     @Test
     fun slider_media_inAudioSharing() =
-        with(kosmos) {
-            testScope.runTest {
-                val audioSharingSlider by collectLastValue(stream.slider)
+        kosmos.runTest {
+            val audioSharingSlider by collectLastValue(underTest.slider)
 
-                val bluetoothDevice: BluetoothDevice = mock {}
-                val cachedDevice: CachedBluetoothDevice = mock {
-                    on { groupId }.thenReturn(123)
-                    on { device }.thenReturn(bluetoothDevice)
-                    on { name }.thenReturn("my headset 2")
-                }
-                audioSharingRepository.setSecondaryDevice(cachedDevice)
-
-                audioSharingRepository.setInAudioSharing(true)
-                audioSharingRepository.setSecondaryGroupId(123)
-
-                runCurrent()
-
-                assertThat(audioSharingSlider!!.label).isEqualTo("my headset 2")
-                assertThat(audioSharingSlider!!.icon)
-                    .isEqualTo(Icon.Resource(R.drawable.ic_volume_media_bt, null))
+            val bluetoothDevice: BluetoothDevice = mock {}
+            val cachedDevice: CachedBluetoothDevice = mock {
+                on { groupId }.thenReturn(123)
+                on { device }.thenReturn(bluetoothDevice)
+                on { name }.thenReturn("my headset 2")
             }
+            audioSharingRepository.setSecondaryDevice(cachedDevice)
+
+            audioSharingRepository.setInAudioSharing(true)
+            audioSharingRepository.setSecondaryGroupId(123)
+
+            runCurrent()
+
+            assertThat(audioSharingSlider!!.label).isEqualTo("my headset 2")
+            assertThat(audioSharingSlider!!.icon)
+                .isEqualTo(Icon.Resource(R.drawable.ic_volume_media_bt, null))
         }
 }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/wallpapers/data/repository/WallpaperRepositoryImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/wallpapers/data/repository/WallpaperRepositoryImplTest.kt
index d89516d..7c166de 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/wallpapers/data/repository/WallpaperRepositoryImplTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/wallpapers/data/repository/WallpaperRepositoryImplTest.kt
@@ -22,20 +22,23 @@
 import android.content.Intent
 import android.content.pm.UserInfo
 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.app.wallpaperManager
 import com.android.internal.R
 import com.android.systemui.SysuiTestCase
+import com.android.systemui.broadcast.broadcastDispatcher
 import com.android.systemui.coroutines.collectLastValue
-import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
+import com.android.systemui.kosmos.testScope
 import com.android.systemui.res.R as SysUIR
 import com.android.systemui.shared.Flags as SharedFlags
+import com.android.systemui.testKosmos
 import com.android.systemui.user.data.model.SelectedUserModel
 import com.android.systemui.user.data.model.SelectionStatus
-import com.android.systemui.user.data.repository.FakeUserRepository
+import com.android.systemui.user.data.repository.fakeUserRepository
+import com.android.systemui.util.settings.fakeSettings
 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
@@ -43,6 +46,7 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.kotlin.any
+import org.mockito.kotlin.doAnswer
 import org.mockito.kotlin.mock
 import org.mockito.kotlin.whenever
 
@@ -50,42 +54,39 @@
 @RunWith(AndroidJUnit4::class)
 class WallpaperRepositoryImplTest : SysuiTestCase() {
 
-    private val testDispatcher = StandardTestDispatcher()
-    private val testScope = TestScope(testDispatcher)
-    private val userRepository = FakeUserRepository()
-    private val wallpaperFocalAreaRepository = FakeWallpaperFocalAreaRepository()
-    private val wallpaperManager: WallpaperManager = mock()
-    private val keyguardTransitionInteractor: KeyguardTransitionInteractor = mock()
+    private var isWallpaperSupported = true
+    private val kosmos =
+        testKosmos().apply {
+            wallpaperManager =
+                mock<WallpaperManager>() {
+                    on { isWallpaperSupported } doAnswer { isWallpaperSupported }
+                }
+        }
+    private val secureSettings = kosmos.fakeSettings
+    private val testScope = kosmos.testScope
+    private val userRepository = kosmos.fakeUserRepository
+    private val broadcastDispatcher = kosmos.broadcastDispatcher
 
-    private val underTest: WallpaperRepositoryImpl by lazy {
-        WallpaperRepositoryImpl(
-            testScope.backgroundScope,
-            testDispatcher,
-            fakeBroadcastDispatcher,
-            userRepository,
-            wallpaperFocalAreaRepository,
-            wallpaperManager,
-            context,
-            keyguardTransitionInteractor,
-        )
-    }
+    // Initialized in each test since certain flows rely on mocked data that isn't
+    // modifiable after start, like wallpaperManager.isWallpaperSupported
+    private lateinit var underTest: WallpaperRepositoryImpl
 
     lateinit var focalAreaTarget: String
 
     @Before
     fun setUp() {
-        whenever(wallpaperManager.isWallpaperSupported).thenReturn(true)
         focalAreaTarget = context.resources.getString(SysUIR.string.focal_area_target)
     }
 
     @Test
     fun wallpaperInfo_nullInfo() =
         testScope.runTest {
+            underTest = kosmos.wallpaperRepository
             val latest by collectLastValue(underTest.wallpaperInfo)
 
-            whenever(wallpaperManager.getWallpaperInfoForUser(any())).thenReturn(null)
+            whenever(kosmos.wallpaperManager.getWallpaperInfoForUser(any())).thenReturn(null)
 
-            fakeBroadcastDispatcher.sendIntentToMatchingReceiversOnly(
+            broadcastDispatcher.sendIntentToMatchingReceiversOnly(
                 context,
                 Intent(Intent.ACTION_WALLPAPER_CHANGED),
             )
@@ -96,11 +97,13 @@
     @Test
     fun wallpaperInfo_hasInfoFromManager() =
         testScope.runTest {
+            underTest = kosmos.wallpaperRepository
             val latest by collectLastValue(underTest.wallpaperInfo)
 
-            whenever(wallpaperManager.getWallpaperInfoForUser(any())).thenReturn(UNSUPPORTED_WP)
+            whenever(kosmos.wallpaperManager.getWallpaperInfoForUser(any()))
+                .thenReturn(UNSUPPORTED_WP)
 
-            fakeBroadcastDispatcher.sendIntentToMatchingReceiversOnly(
+            broadcastDispatcher.sendIntentToMatchingReceiversOnly(
                 context,
                 Intent(Intent.ACTION_WALLPAPER_CHANGED),
             )
@@ -111,7 +114,8 @@
     @Test
     fun wallpaperInfo_initialValueIsFetched() =
         testScope.runTest {
-            whenever(wallpaperManager.getWallpaperInfoForUser(USER_WITH_SUPPORTED_WP.id))
+            underTest = kosmos.wallpaperRepository
+            whenever(kosmos.wallpaperManager.getWallpaperInfoForUser(USER_WITH_SUPPORTED_WP.id))
                 .thenReturn(SUPPORTED_WP)
             userRepository.setUserInfos(listOf(USER_WITH_SUPPORTED_WP))
             userRepository.setSelectedUserInfo(USER_WITH_SUPPORTED_WP)
@@ -126,15 +130,16 @@
     @Test
     fun wallpaperInfo_updatesOnUserChanged() =
         testScope.runTest {
+            underTest = kosmos.wallpaperRepository
             val latest by collectLastValue(underTest.wallpaperInfo)
 
             val user3 = UserInfo(/* id= */ 3, /* name= */ "user3", /* flags= */ 0)
             val user3Wp = mock<WallpaperInfo>()
-            whenever(wallpaperManager.getWallpaperInfoForUser(user3.id)).thenReturn(user3Wp)
+            whenever(kosmos.wallpaperManager.getWallpaperInfoForUser(user3.id)).thenReturn(user3Wp)
 
             val user4 = UserInfo(/* id= */ 4, /* name= */ "user4", /* flags= */ 0)
             val user4Wp = mock<WallpaperInfo>()
-            whenever(wallpaperManager.getWallpaperInfoForUser(user4.id)).thenReturn(user4Wp)
+            whenever(kosmos.wallpaperManager.getWallpaperInfoForUser(user4.id)).thenReturn(user4Wp)
 
             userRepository.setUserInfos(listOf(user3, user4))
 
@@ -154,15 +159,16 @@
     @Test
     fun wallpaperInfo_doesNotUpdateOnUserChanging() =
         testScope.runTest {
+            underTest = kosmos.wallpaperRepository
             val latest by collectLastValue(underTest.wallpaperInfo)
 
             val user3 = UserInfo(/* id= */ 3, /* name= */ "user3", /* flags= */ 0)
             val user3Wp = mock<WallpaperInfo>()
-            whenever(wallpaperManager.getWallpaperInfoForUser(user3.id)).thenReturn(user3Wp)
+            whenever(kosmos.wallpaperManager.getWallpaperInfoForUser(user3.id)).thenReturn(user3Wp)
 
             val user4 = UserInfo(/* id= */ 4, /* name= */ "user4", /* flags= */ 0)
             val user4Wp = mock<WallpaperInfo>()
-            whenever(wallpaperManager.getWallpaperInfoForUser(user4.id)).thenReturn(user4Wp)
+            whenever(kosmos.wallpaperManager.getWallpaperInfoForUser(user4.id)).thenReturn(user4Wp)
 
             userRepository.setUserInfos(listOf(user3, user4))
 
@@ -183,17 +189,18 @@
     @Test
     fun wallpaperInfo_updatesOnIntent() =
         testScope.runTest {
+            underTest = kosmos.wallpaperRepository
             val latest by collectLastValue(underTest.wallpaperInfo)
 
             val wp1 = mock<WallpaperInfo>()
-            whenever(wallpaperManager.getWallpaperInfoForUser(any())).thenReturn(wp1)
+            whenever(kosmos.wallpaperManager.getWallpaperInfoForUser(any())).thenReturn(wp1)
 
             assertThat(latest).isEqualTo(wp1)
 
             // WHEN the info is new and a broadcast is sent
             val wp2 = mock<WallpaperInfo>()
-            whenever(wallpaperManager.getWallpaperInfoForUser(any())).thenReturn(wp2)
-            fakeBroadcastDispatcher.sendIntentToMatchingReceiversOnly(
+            whenever(kosmos.wallpaperManager.getWallpaperInfoForUser(any())).thenReturn(wp2)
+            broadcastDispatcher.sendIntentToMatchingReceiversOnly(
                 context,
                 Intent(Intent.ACTION_WALLPAPER_CHANGED),
             )
@@ -205,15 +212,16 @@
     @Test
     fun wallpaperInfo_wallpaperNotSupported_alwaysNull() =
         testScope.runTest {
-            whenever(wallpaperManager.isWallpaperSupported).thenReturn(false)
+            isWallpaperSupported = false
+            underTest = kosmos.wallpaperRepository
 
             val latest by collectLastValue(underTest.wallpaperInfo)
             assertThat(latest).isNull()
 
             // Even WHEN there *is* current wallpaper
             val wp1 = mock<WallpaperInfo>()
-            whenever(wallpaperManager.getWallpaperInfoForUser(any())).thenReturn(wp1)
-            fakeBroadcastDispatcher.sendIntentToMatchingReceiversOnly(
+            whenever(kosmos.wallpaperManager.getWallpaperInfoForUser(any())).thenReturn(wp1)
+            broadcastDispatcher.sendIntentToMatchingReceiversOnly(
                 context,
                 Intent(Intent.ACTION_WALLPAPER_CHANGED),
             )
@@ -226,6 +234,8 @@
     @EnableFlags(SharedFlags.FLAG_AMBIENT_AOD)
     fun wallpaperSupportsAmbientMode_deviceDoesNotSupport_false() =
         testScope.runTest {
+            underTest = kosmos.wallpaperRepository
+            secureSettings.putInt(Settings.Secure.DOZE_ALWAYS_ON_WALLPAPER_ENABLED, 1)
             context.orCreateTestableResources.addOverride(
                 R.bool.config_dozeSupportsAodWallpaper,
                 false,
@@ -239,6 +249,8 @@
     @EnableFlags(SharedFlags.FLAG_AMBIENT_AOD)
     fun wallpaperSupportsAmbientMode_deviceDoesSupport_true() =
         testScope.runTest {
+            underTest = kosmos.wallpaperRepository
+            secureSettings.putInt(Settings.Secure.DOZE_ALWAYS_ON_WALLPAPER_ENABLED, 1)
             context.orCreateTestableResources.addOverride(
                 R.bool.config_dozeSupportsAodWallpaper,
                 true,
@@ -249,19 +261,34 @@
         }
 
     @Test
-    @Ignore("ag/31591766")
+    @EnableFlags(SharedFlags.FLAG_AMBIENT_AOD)
+    fun wallpaperSupportsAmbientMode_deviceDoesSupport_settingDisabled_false() =
+        testScope.runTest {
+            underTest = kosmos.wallpaperRepository
+            secureSettings.putInt(Settings.Secure.DOZE_ALWAYS_ON_WALLPAPER_ENABLED, 0)
+            context.orCreateTestableResources.addOverride(
+                R.bool.config_dozeSupportsAodWallpaper,
+                true,
+            )
+
+            val latest by collectLastValue(underTest.wallpaperSupportsAmbientMode)
+            assertThat(latest).isFalse()
+        }
+
+    @Test
     @EnableFlags(SharedFlags.FLAG_EXTENDED_WALLPAPER_EFFECTS)
     fun shouldSendNotificationLayout_setExtendedEffectsWallpaper_launchSendLayoutJob() =
         testScope.runTest {
+            underTest = kosmos.wallpaperRepository
             val latest by collectLastValue(underTest.shouldSendFocalArea)
             val extedendEffectsWallpaper =
                 mock<WallpaperInfo>().apply {
                     whenever(this.component).thenReturn(ComponentName(context, focalAreaTarget))
                 }
 
-            whenever(wallpaperManager.getWallpaperInfoForUser(any()))
+            whenever(kosmos.wallpaperManager.getWallpaperInfoForUser(any()))
                 .thenReturn(extedendEffectsWallpaper)
-            fakeBroadcastDispatcher.sendIntentToMatchingReceiversOnly(
+            broadcastDispatcher.sendIntentToMatchingReceiversOnly(
                 context,
                 Intent(Intent.ACTION_WALLPAPER_CHANGED),
             )
@@ -275,14 +302,15 @@
     @EnableFlags(SharedFlags.FLAG_EXTENDED_WALLPAPER_EFFECTS)
     fun shouldSendNotificationLayout_setNotExtendedEffectsWallpaper_cancelSendLayoutJob() =
         testScope.runTest {
+            underTest = kosmos.wallpaperRepository
             val latest by collectLastValue(underTest.shouldSendFocalArea)
             val extendedEffectsWallpaper =
                 mock<WallpaperInfo>().apply {
                     whenever(this.component).thenReturn(ComponentName("", focalAreaTarget))
                 }
-            whenever(wallpaperManager.getWallpaperInfoForUser(any()))
+            whenever(kosmos.wallpaperManager.getWallpaperInfoForUser(any()))
                 .thenReturn(extendedEffectsWallpaper)
-            fakeBroadcastDispatcher.sendIntentToMatchingReceiversOnly(
+            broadcastDispatcher.sendIntentToMatchingReceiversOnly(
                 context,
                 Intent(Intent.ACTION_WALLPAPER_CHANGED),
             )
@@ -290,11 +318,14 @@
             assertThat(underTest.sendLockscreenLayoutJob).isNotNull()
             assertThat(underTest.sendLockscreenLayoutJob!!.isActive).isEqualTo(true)
 
-            whenever(wallpaperManager.getWallpaperInfoForUser(any())).thenReturn(UNSUPPORTED_WP)
-            fakeBroadcastDispatcher.sendIntentToMatchingReceiversOnly(
+            whenever(kosmos.wallpaperManager.getWallpaperInfoForUser(any()))
+                .thenReturn(UNSUPPORTED_WP)
+            broadcastDispatcher.sendIntentToMatchingReceiversOnly(
                 context,
                 Intent(Intent.ACTION_WALLPAPER_CHANGED),
             )
+            runCurrent()
+
             assertThat(latest).isFalse()
             assertThat(underTest.sendLockscreenLayoutJob?.isCancelled).isEqualTo(true)
         }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/wallpapers/domain/interactor/WallpaperFocalAreaInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/wallpapers/domain/interactor/WallpaperFocalAreaInteractorTest.kt
index cd6e18a..31afc29 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/wallpapers/domain/interactor/WallpaperFocalAreaInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/wallpapers/domain/interactor/WallpaperFocalAreaInteractorTest.kt
@@ -30,8 +30,6 @@
 import com.android.systemui.res.R
 import com.android.systemui.shade.data.repository.ShadeRepository
 import com.android.systemui.shade.data.repository.shadeRepository
-import com.android.systemui.statusbar.notification.data.repository.activeNotificationListRepository
-import com.android.systemui.statusbar.notification.data.repository.setActiveNotifs
 import com.android.systemui.statusbar.notification.domain.interactor.activeNotificationsInteractor
 import com.android.systemui.testKosmos
 import com.android.systemui.wallpapers.data.repository.fakeWallpaperFocalAreaRepository
@@ -110,7 +108,7 @@
             )
             val bounds by collectLastValue(underTest.wallpaperFocalAreaBounds)
             kosmos.shadeRepository.setShadeLayoutWide(false)
-            kosmos.activeNotificationListRepository.setActiveNotifs(0)
+
             kosmos.wallpaperFocalAreaRepository.setShortcutAbsoluteTop(1800F)
             kosmos.wallpaperFocalAreaRepository.setNotificationDefaultTop(400F)
             kosmos.wallpaperFocalAreaRepository.setNotificationStackAbsoluteBottom(400F)
@@ -130,7 +128,6 @@
             )
             val bounds by collectLastValue(underTest.wallpaperFocalAreaBounds)
             kosmos.shadeRepository.setShadeLayoutWide(false)
-            kosmos.activeNotificationListRepository.setActiveNotifs(1)
             kosmos.wallpaperFocalAreaRepository.setShortcutAbsoluteTop(1800F)
             kosmos.wallpaperFocalAreaRepository.setNotificationDefaultTop(400F)
             kosmos.wallpaperFocalAreaRepository.setNotificationStackAbsoluteBottom(600F)
@@ -139,7 +136,7 @@
         }
 
     @Test
-    fun focalAreaBounds_withNotifications_inUnfoldLandscape() =
+    fun focalAreaBounds_inUnfoldLandscape() =
         testScope.runTest {
             overrideMockedResources(
                 OverrideResources(
@@ -150,32 +147,11 @@
             )
             val bounds by collectLastValue(underTest.wallpaperFocalAreaBounds)
             kosmos.shadeRepository.setShadeLayoutWide(true)
-            kosmos.activeNotificationListRepository.setActiveNotifs(1)
-            kosmos.wallpaperFocalAreaRepository.setShortcutAbsoluteTop(1400F)
-            kosmos.wallpaperFocalAreaRepository.setNotificationDefaultTop(400F)
-            kosmos.wallpaperFocalAreaRepository.setNotificationStackAbsoluteBottom(600F)
-
-            assertThat(bounds).isEqualTo(RectF(500f, 600F, 1000F, 1100F))
-        }
-
-    @Test
-    fun focalAreaBounds_withoutNotifications_inUnfoldLandscape() =
-        testScope.runTest {
-            overrideMockedResources(
-                OverrideResources(
-                    screenWidth = 2000,
-                    screenHeight = 1600,
-                    centerAlignFocalArea = false,
-                )
-            )
-            val bounds by collectLastValue(underTest.wallpaperFocalAreaBounds)
-            kosmos.shadeRepository.setShadeLayoutWide(true)
-            kosmos.activeNotificationListRepository.setActiveNotifs(0)
             kosmos.wallpaperFocalAreaRepository.setShortcutAbsoluteTop(1400F)
             kosmos.wallpaperFocalAreaRepository.setNotificationDefaultTop(400F)
             kosmos.wallpaperFocalAreaRepository.setNotificationStackAbsoluteBottom(400F)
 
-            assertThat(bounds).isEqualTo(RectF(1000f, 600F, 1500F, 1100F))
+            assertThat(bounds).isEqualTo(RectF(600f, 600F, 1400F, 1100F))
         }
 
     @Test
@@ -190,7 +166,6 @@
             )
             val bounds by collectLastValue(underTest.wallpaperFocalAreaBounds)
             kosmos.shadeRepository.setShadeLayoutWide(false)
-            kosmos.activeNotificationListRepository.setActiveNotifs(1)
             kosmos.wallpaperFocalAreaRepository.setShortcutAbsoluteTop(1800F)
             kosmos.wallpaperFocalAreaRepository.setNotificationDefaultTop(400F)
             kosmos.wallpaperFocalAreaRepository.setNotificationStackAbsoluteBottom(600F)
@@ -210,7 +185,6 @@
             )
             val bounds by collectLastValue(underTest.wallpaperFocalAreaBounds)
             kosmos.shadeRepository.setShadeLayoutWide(false)
-            kosmos.activeNotificationListRepository.setActiveNotifs(0)
             kosmos.wallpaperFocalAreaRepository.setShortcutAbsoluteTop(1800F)
             kosmos.wallpaperFocalAreaRepository.setNotificationDefaultTop(400F)
             kosmos.wallpaperFocalAreaRepository.setNotificationStackAbsoluteBottom(600F)
@@ -219,7 +193,7 @@
         }
 
     @Test
-    fun focalAreaBounds_withNotifications_inTabletLandscape() =
+    fun focalAreaBounds_inTabletLandscape() =
         testScope.runTest {
             overrideMockedResources(
                 OverrideResources(
@@ -230,7 +204,6 @@
             )
             val bounds by collectLastValue(underTest.wallpaperFocalAreaBounds)
             kosmos.shadeRepository.setShadeLayoutWide(true)
-            kosmos.activeNotificationListRepository.setActiveNotifs(1)
             kosmos.wallpaperFocalAreaRepository.setShortcutAbsoluteTop(1800F)
             kosmos.wallpaperFocalAreaRepository.setNotificationDefaultTop(200F)
             kosmos.wallpaperFocalAreaRepository.setNotificationStackAbsoluteBottom(200F)
@@ -239,26 +212,6 @@
         }
 
     @Test
-    fun focalAreaBounds_withoutNotifications_inTabletLandscape() =
-        testScope.runTest {
-            overrideMockedResources(
-                OverrideResources(
-                    screenWidth = 3000,
-                    screenHeight = 2000,
-                    centerAlignFocalArea = true,
-                )
-            )
-            val bounds by collectLastValue(underTest.wallpaperFocalAreaBounds)
-            kosmos.shadeRepository.setShadeLayoutWide(true)
-            kosmos.activeNotificationListRepository.setActiveNotifs(0)
-            kosmos.wallpaperFocalAreaRepository.setShortcutAbsoluteTop(1800F)
-            kosmos.wallpaperFocalAreaRepository.setNotificationDefaultTop(400F)
-            kosmos.wallpaperFocalAreaRepository.setNotificationStackAbsoluteBottom(400F)
-
-            assertThat(bounds).isEqualTo(RectF(1000f, 600F, 2000F, 1400F))
-        }
-
-    @Test
     fun onTap_inFocalBounds() =
         testScope.runTest {
             kosmos.wallpaperFocalAreaRepository.setTapPosition(PointF(0F, 0F))
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/window/ui/viewmodel/WindowRootViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/window/ui/viewmodel/WindowRootViewModelTest.kt
index 390518f..3da4f29a6 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/window/ui/viewmodel/WindowRootViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/window/ui/viewmodel/WindowRootViewModelTest.kt
@@ -23,32 +23,28 @@
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.coroutines.collectLastValue
 import com.android.systemui.kosmos.testScope
-import com.android.systemui.lifecycle.activateIn
 import com.android.systemui.testKosmos
+import com.android.systemui.window.data.repository.fakeWindowRootViewBlurRepository
+import com.android.systemui.window.data.repository.windowRootViewBlurRepository
 import com.google.common.truth.Truth.assertThat
 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)
-@EnableFlags(Flags.FLAG_BOUNCER_UI_REVAMP)
+@EnableFlags(Flags.FLAG_BOUNCER_UI_REVAMP, Flags.FLAG_GLANCEABLE_HUB_BLURRED_BACKGROUND)
 class WindowRootViewModelTest : SysuiTestCase() {
     val kosmos = testKosmos()
     val testScope = kosmos.testScope
 
     val underTest by lazy { kosmos.windowRootViewModel }
 
-    @Before
-    fun setup() {
-        underTest.activateIn(testScope)
-    }
-
     @Test
     fun bouncerTransitionChangesWindowBlurRadius() =
         testScope.runTest {
+            kosmos.fakeWindowRootViewBlurRepository.isBlurSupported.value = true
             val blurRadius by collectLastValue(underTest.blurRadius)
             val isBlurOpaque by collectLastValue(underTest.isBlurOpaque)
             runCurrent()
@@ -59,4 +55,27 @@
             assertThat(blurRadius).isEqualTo(30)
             assertThat(isBlurOpaque).isEqualTo(false)
         }
+
+    @Test
+    fun blurRadiusDoesNotChangeWhenBlurIsNotSupported() =
+        testScope.runTest {
+            kosmos.fakeWindowRootViewBlurRepository.isBlurSupported.value = false
+            val blurRadius by collectLastValue(underTest.blurRadius)
+            runCurrent()
+
+            kosmos.fakeBouncerTransitions.first().windowBlurRadius.value = 30.0f
+            runCurrent()
+
+            assertThat(blurRadius).isEqualTo(0f)
+
+            kosmos.fakeGlanceableHubTransitions.first().windowBlurRadius.value = 50.0f
+            runCurrent()
+
+            assertThat(blurRadius).isEqualTo(0f)
+
+            kosmos.windowRootViewBlurRepository.blurRadius.value = 60
+            runCurrent()
+
+            assertThat(blurRadius).isEqualTo(0f)
+        }
 }
diff --git a/packages/SystemUI/plugin_core/proguard.flags b/packages/SystemUI/plugin_core/proguard.flags
index 6240898..8b78ba4 100644
--- a/packages/SystemUI/plugin_core/proguard.flags
+++ b/packages/SystemUI/plugin_core/proguard.flags
@@ -8,4 +8,7 @@
 -keep interface com.android.systemui.plugins.annotations.** {
     *;
 }
--keep,allowshrinking,allowoptimization,allowobfuscation,allowaccessmodification @com.android.systemui.plugins.annotations.** class *
+# TODO(b/373579455): Evaluate if <init> needs to be kept.
+-keep,allowshrinking,allowoptimization,allowobfuscation,allowaccessmodification @com.android.systemui.plugins.annotations.** class * {
+    void <init>();
+}
diff --git a/packages/SystemUI/proguard_common.flags b/packages/SystemUI/proguard_common.flags
index e152c98..2b908a7 100644
--- a/packages/SystemUI/proguard_common.flags
+++ b/packages/SystemUI/proguard_common.flags
@@ -12,8 +12,14 @@
 # Note that we restrict this to SysUISingleton classes, as other registering
 # classes should either *always* unregister or *never* register from their
 # constructor. We also keep callback class names for easier debugging.
--keepnames @com.android.systemui.util.annotations.WeaklyReferencedCallback class *
--keepnames class * extends @com.android.systemui.util.annotations.WeaklyReferencedCallback **
+# TODO(b/373579455): Evaluate if <init> needs to be kept.
+-keepnames @com.android.systemui.util.annotations.WeaklyReferencedCallback class * {
+  void <init>();
+}
+# TODO(b/373579455): Evaluate if <init> needs to be kept.
+-keepnames class * extends @com.android.systemui.util.annotations.WeaklyReferencedCallback ** {
+  void <init>();
+}
 -if @com.android.systemui.util.annotations.WeaklyReferencedCallback class *
 -keepclassmembers,allowaccessmodification @com.android.systemui.dagger.SysUISingleton class * {
   <1> *;
@@ -23,10 +29,16 @@
   <1> *;
 }
 
--keep class androidx.core.app.CoreComponentFactory
+# TODO(b/373579455): Evaluate if <init> needs to be kept.
+-keep class androidx.core.app.CoreComponentFactory {
+  void <init>();
+}
 
 # Keep the wm shell lib
--keep class com.android.wm.shell.*
+# TODO(b/373579455): Evaluate if <init> needs to be kept.
+-keep class com.android.wm.shell.* {
+  void <init>();
+}
 # Keep the protolog group methods that are called by the generated code
 -keepclassmembers class com.android.wm.shell.protolog.ShellProtoLogGroup {
     *;
diff --git a/packages/SystemUI/res-keyguard/drawable/pin_bouncer_confirm.xml b/packages/SystemUI/res-keyguard/drawable/pin_bouncer_confirm.xml
new file mode 100644
index 0000000..61d6a904
--- /dev/null
+++ b/packages/SystemUI/res-keyguard/drawable/pin_bouncer_confirm.xml
@@ -0,0 +1,30 @@
+<!--
+  ~ Copyright (C) 2025 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT 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="40dp"
+    android:height="40dp"
+    android:viewportHeight="40"
+    android:viewportWidth="40">
+    <path
+        android:fillColor="#F7DAEE"
+        android:fillType="evenOdd"
+        android:pathData="M20.76,19C21.65,19 22.096,17.924 21.467,17.294L19.284,15.105C18.895,14.716 18.895,14.085 19.285,13.695C19.674,13.306 20.306,13.306 20.695,13.695L26.293,19.293C26.683,19.683 26.683,20.317 26.293,20.707L20.705,26.295C20.315,26.685 19.683,26.686 19.292,26.298C18.9,25.907 18.898,25.272 19.29,24.88L21.463,22.707C22.093,22.077 21.647,21 20.756,21H10C9.448,21 9,20.552 9,20C9,19.448 9.448,19 10,19H20.76ZM32,26C32,26.552 31.552,27 31,27C30.448,27 30,26.552 30,26V14C30,13.448 30.448,13 31,13C31.552,13 32,13.448 32,14V26Z"
+        android:strokeColor="#F7DAEE"
+        android:strokeLineCap="round"
+        android:strokeLineJoin="round"
+        android:strokeWidth="2" />
+</vector>
diff --git a/packages/SystemUI/res-keyguard/drawable/pin_bouncer_delete.xml b/packages/SystemUI/res-keyguard/drawable/pin_bouncer_delete.xml
new file mode 100644
index 0000000..044656d
--- /dev/null
+++ b/packages/SystemUI/res-keyguard/drawable/pin_bouncer_delete.xml
@@ -0,0 +1,25 @@
+<!--
+  ~ Copyright (C) 2025 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT 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="40dp"
+    android:height="40dp"
+    android:viewportHeight="40"
+    android:viewportWidth="40">
+    <path
+        android:fillColor="#ECDFE5"
+        android:pathData="M18.792,26.5L23.333,21.958L27.875,26.5L29.875,24.542L25.292,20L29.792,15.458L27.833,13.5L23.333,18.042L18.792,13.5L16.792,15.458L21.375,20L16.792,24.542L18.792,26.5ZM14.708,33.333C14.292,33.333 13.875,33.236 13.458,33.042C13.069,32.847 12.75,32.569 12.5,32.208L3.333,20L12.458,7.792C12.708,7.431 13.028,7.153 13.417,6.958C13.833,6.764 14.264,6.667 14.708,6.667H33.917C34.694,6.667 35.347,6.944 35.875,7.5C36.431,8.028 36.708,8.681 36.708,9.458V30.542C36.708,31.319 36.431,31.986 35.875,32.542C35.347,33.069 34.694,33.333 33.917,33.333H14.708Z" />
+</vector>
diff --git a/packages/SystemUI/res-keyguard/values-bs/strings.xml b/packages/SystemUI/res-keyguard/values-bs/strings.xml
index baef51a..249cc6c 100644
--- a/packages/SystemUI/res-keyguard/values-bs/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bs/strings.xml
@@ -34,7 +34,7 @@
     <string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Brzo punjenje"</string>
     <string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Sporo punjenje"</string>
     <string name="keyguard_plugged_in_charging_limited" msgid="5369697538556777542">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Punjenje je na čekanju radi zaštite baterije"</string>
-    <string name="keyguard_plugged_in_incompatible_charger" msgid="6384203333154532125">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Provjera dodatne opreme za punjenje"</string>
+    <string name="keyguard_plugged_in_incompatible_charger" msgid="6384203333154532125">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Provjera dodatka za punjenje"</string>
     <string name="keyguard_network_locked_message" msgid="407096292844868608">"Mreža je zaključana"</string>
     <string name="keyguard_missing_sim_message_short" msgid="685029586173458728">"Nema SIM-a"</string>
     <string name="keyguard_permanent_disabled_sim_message_short" msgid="3955052454216046100">"Neupotrebljiv SIM."</string>
diff --git a/packages/SystemUI/res-keyguard/values-kn/strings.xml b/packages/SystemUI/res-keyguard/values-kn/strings.xml
index 7560621..55d9374 100644
--- a/packages/SystemUI/res-keyguard/values-kn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-kn/strings.xml
@@ -23,7 +23,7 @@
     <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"ನಿಮ್ಮ ಪಿನ್ ನಮೂದಿಸಿ"</string>
     <string name="keyguard_enter_pin" msgid="8114529922480276834">"ಪಿನ್ ನಮೂದಿಸಿ"</string>
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"ನಿಮ್ಮ ಪ್ಯಾಟರ್ನ್ ನಮೂದಿಸಿ"</string>
-    <string name="keyguard_enter_pattern" msgid="7616595160901084119">"ಪ್ಯಾಟರ್ನ್ ಅನ್ನು ಬಿಡಿಸಿ"</string>
+    <string name="keyguard_enter_pattern" msgid="7616595160901084119">"ಪ್ಯಾಟರ್ನ್ ಅನ್ನು ಬರೆಯಿರಿ"</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>
diff --git a/packages/SystemUI/res/layout/battery_status_chip.xml b/packages/SystemUI/res/layout/battery_status_chip.xml
index 7437183..7399651 100644
--- a/packages/SystemUI/res/layout/battery_status_chip.xml
+++ b/packages/SystemUI/res/layout/battery_status_chip.xml
@@ -24,21 +24,13 @@
 
     <LinearLayout
         android:id="@+id/rounded_container"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:minHeight="@dimen/ongoing_appops_chip_height"
-        android:layout_gravity="center"
-        android:background="@drawable/statusbar_chip_bg"
-        android:clipToOutline="true"
-        android:gravity="center"
-        android:maxWidth="@dimen/ongoing_appops_chip_max_width"
-        android:minWidth="@dimen/ongoing_appops_chip_min_width">
+        style="@style/StatusBar.EventChip">
 
         <com.android.systemui.battery.BatteryMeterView
             android:id="@+id/battery_meter_view"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_marginHorizontal="10dp" />
+            android:layout_marginHorizontal="@dimen/ongoing_appops_chip_content_horizontal_margin" />
 
     </LinearLayout>
 </merge>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/bindable_status_bar_compose_icon.xml b/packages/SystemUI/res/layout/bindable_status_bar_compose_icon.xml
new file mode 100644
index 0000000..fa9318b
--- /dev/null
+++ b/packages/SystemUI/res/layout/bindable_status_bar_compose_icon.xml
@@ -0,0 +1,33 @@
+<?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.
+  -->
+
+<!-- Base layout that provides a single bindable compose view -->
+<com.android.systemui.statusbar.pipeline.shared.ui.view.SingleBindableStatusBarComposeIconView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:gravity="center_vertical"
+    >
+
+    <androidx.compose.ui.platform.ComposeView
+        android:id="@+id/compose_view"
+        android:layout_height="@dimen/status_bar_bindable_icon_size"
+        android:layout_width="wrap_content"
+        android:layout_gravity="center_vertical"
+        android:padding="4sp"
+        />
+
+</com.android.systemui.statusbar.pipeline.shared.ui.view.SingleBindableStatusBarComposeIconView>
diff --git a/packages/SystemUI/res/layout/combined_qs_header.xml b/packages/SystemUI/res/layout/combined_qs_header.xml
index b9ef88e..32407c6 100644
--- a/packages/SystemUI/res/layout/combined_qs_header.xml
+++ b/packages/SystemUI/res/layout/combined_qs_header.xml
@@ -147,6 +147,7 @@
                 android:id="@+id/batteryRemainingIcon"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
+                android:visibility="gone"
                 app:textAppearance="@style/TextAppearance.QS.Status" />
         </LinearLayout>
     </FrameLayout>
diff --git a/packages/SystemUI/res/layout/magic_action_button.xml b/packages/SystemUI/res/layout/magic_action_button.xml
index 82d8d70..381d6b1 100644
--- a/packages/SystemUI/res/layout/magic_action_button.xml
+++ b/packages/SystemUI/res/layout/magic_action_button.xml
@@ -1,4 +1,5 @@
-<Button xmlns:android="http://schemas.android.com/apk/res/android"
+<com.android.systemui.statusbar.notification.row.MagicActionButton
+    xmlns:android="http://schemas.android.com/apk/res/android"
     style="@android:style/Widget.Material.Button"
     android:layout_width="wrap_content"
     android:layout_height="@dimen/magic_action_button_touch_target_height"
diff --git a/packages/SystemUI/res/layout/media_session_view.xml b/packages/SystemUI/res/layout/media_session_view.xml
index 109e63c..4472373 100644
--- a/packages/SystemUI/res/layout/media_session_view.xml
+++ b/packages/SystemUI/res/layout/media_session_view.xml
@@ -93,7 +93,7 @@
         android:layout_width="0dp"
         android:layout_height="0dp"
         android:orientation="vertical"
-        app:layout_constraintGuide_end="@dimen/qs_media_session_collapsed_guideline" />
+        app:layout_constraintGuide_end="@dimen/qs_media_session_collapsed_legacy_guideline" />
 
     <!-- App icon -->
     <com.android.internal.widget.CachingIconView
diff --git a/packages/SystemUI/res/layout/ongoing_activity_chip_content.xml b/packages/SystemUI/res/layout/ongoing_activity_chip_content.xml
index 6f42286..b66a88a 100644
--- a/packages/SystemUI/res/layout/ongoing_activity_chip_content.xml
+++ b/packages/SystemUI/res/layout/ongoing_activity_chip_content.xml
@@ -43,9 +43,6 @@
              ongoing_activity_chip_short_time_delta] will ever be shown at one time. -->
 
         <!-- Shows a timer, like 00:01. -->
-        <!-- Don't use the LimitedWidth style for the timer because the end of the timer is often
-             the most important value. ChipChronometer has the correct logic for when the timer is
-             too large for the space allowed. -->
         <com.android.systemui.statusbar.chips.ui.view.ChipChronometer
             android:id="@+id/ongoing_activity_chip_time"
             style="@style/StatusBar.Chip.Text"
@@ -54,14 +51,14 @@
         <!-- Shows generic text. -->
         <com.android.systemui.statusbar.chips.ui.view.ChipTextView
             android:id="@+id/ongoing_activity_chip_text"
-            style="@style/StatusBar.Chip.Text.LimitedWidth"
+            style="@style/StatusBar.Chip.Text"
             android:visibility="gone"
             />
 
         <!-- Shows a time delta in short form, like "15min" or "1hr". -->
         <com.android.systemui.statusbar.chips.ui.view.ChipDateTimeView
             android:id="@+id/ongoing_activity_chip_short_time_delta"
-            style="@style/StatusBar.Chip.Text.LimitedWidth"
+            style="@style/StatusBar.Chip.Text"
             android:visibility="gone"
             />
 
diff --git a/packages/SystemUI/res/layout/promoted_notification_info.xml b/packages/SystemUI/res/layout/promoted_notification_info.xml
index 5d170a9..2e0a0ca 100644
--- a/packages/SystemUI/res/layout/promoted_notification_info.xml
+++ b/packages/SystemUI/res/layout/promoted_notification_info.xml
@@ -323,32 +323,44 @@
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:minHeight="60dp"
+            android:layout_marginTop="@dimen/notification_importance_button_separation"
             android:gravity="center_vertical"
-            android:paddingStart="4dp"
-            android:paddingEnd="4dp"
+            android:background="@drawable/rounded_corners"
+            android:backgroundTint="@androidprv:color/materialColorPrimaryContainer"
             >
             <TextView
+                android:id="@+id/promoted_explain_title"
+                android:text="@string/live_notifications_title"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_alignParentStart="true"
+                android:gravity="start|center_vertical"
+                android:padding="16dp"
+                android:color="@androidprv:color/materialColorOnPrimary"
+                style="@style/TextAppearance.NotificationInfo.Button"/>
+            <TextView
+                android:id="@+id/promoted_explain"
+                android:text="@string/live_notifications_desc"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_below="@id/promoted_explain_title"
+                android:gravity="start|center_vertical"
+                android:maxWidth="200dp"
+                android:padding="16dp"
+                style="@style/TextAppearance.NotificationImportanceDetail"/>
+            <TextView
                 android:id="@+id/promoted_demote"
                 android:text="@string/notification_inline_disable_promotion"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_alignParentStart="true"
+                android:layout_below="@id/promoted_explain"
+                android:layout_alignParentEnd="true"
+                android:padding="16dp"
                 android:gravity="start|center_vertical"
                 android:minWidth="@dimen/notification_importance_toggle_size"
                 android:minHeight="@dimen/notification_importance_toggle_size"
                 android:maxWidth="200dp"
                 style="@style/TextAppearance.NotificationInfo.Button"/>
-            <TextView
-                android:id="@+id/promoted_dismiss"
-                android:text="@string/notification_inline_dismiss"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_alignParentEnd="true"
-                android:gravity="end|center_vertical"
-                android:minWidth="@dimen/notification_importance_toggle_size"
-                android:minHeight="@dimen/notification_importance_toggle_size"
-                android:maxWidth="125dp"
-                style="@style/TextAppearance.NotificationInfo.Button"/>
         </RelativeLayout>
 
         <RelativeLayout
diff --git a/packages/SystemUI/res/layout/status_bar_event_chip_compose.xml b/packages/SystemUI/res/layout/status_bar_event_chip_compose.xml
new file mode 100644
index 0000000..ff96ab1
--- /dev/null
+++ b/packages/SystemUI/res/layout/status_bar_event_chip_compose.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  ~ Copyright (C) 2025 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<merge xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="match_parent"
+    android:layout_gravity="center_vertical|end">
+
+    <LinearLayout
+        android:id="@+id/rounded_container"
+        style="@style/StatusBar.EventChip">
+
+        <!-- Stub for the composable -->
+        <androidx.compose.ui.platform.ComposeView
+            android:id="@+id/compose_view"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginHorizontal="@dimen/ongoing_appops_chip_content_horizontal_margin" />
+
+    </LinearLayout>
+</merge>
diff --git a/packages/SystemUI/res/layout/system_icons.xml b/packages/SystemUI/res/layout/system_icons.xml
index c28dc50..bb99d58 100644
--- a/packages/SystemUI/res/layout/system_icons.xml
+++ b/packages/SystemUI/res/layout/system_icons.xml
@@ -34,12 +34,17 @@
         android:orientation="horizontal"/>
 
     <!-- PaddingEnd is added to balance hover padding, compensating for paddingStart in statusIcons.
-         See b/339589733 -->
+         See b/339589733.
+
+         Default visibility is now "gone" to make space for the new battery icon
+         -->
     <com.android.systemui.battery.BatteryMeterView android:id="@+id/battery"
         android:layout_height="wrap_content"
         android:layout_width="wrap_content"
         android:clipToPadding="false"
         android:clipChildren="false"
         android:paddingEnd="@dimen/status_bar_battery_end_padding"
+        android:visibility="gone"
         systemui:textAppearance="@style/TextAppearance.StatusBar.Clock" />
+
 </LinearLayout>
diff --git a/packages/SystemUI/res/layout/volume_dialog.xml b/packages/SystemUI/res/layout/volume_dialog.xml
index 8ad99ab..889aefe 100644
--- a/packages/SystemUI/res/layout/volume_dialog.xml
+++ b/packages/SystemUI/res/layout/volume_dialog.xml
@@ -14,7 +14,6 @@
      limitations under the License.
 -->
 <androidx.constraintlayout.motion.widget.MotionLayout 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/volume_dialog"
     android:layout_width="match_parent"
@@ -30,42 +29,47 @@
         android:layout_marginTop="@dimen/volume_dialog_background_top_margin"
         android:layout_marginBottom="@dimen/volume_dialog_background_vertical_margin"
         android:background="@drawable/volume_dialog_background"
-        app:layout_constraintBottom_toBottomOf="@id/volume_dialog_settings"
+        app:layout_constraintBottom_toBottomOf="@id/volume_dialog_bottom_section_container"
         app:layout_constraintEnd_toEndOf="@id/volume_dialog_main_slider_container"
         app:layout_constraintStart_toStartOf="@id/volume_dialog_main_slider_container"
         app:layout_constraintTop_toTopOf="@id/volume_dialog_main_slider_container" />
 
-    <include
-        android:id="@id/volume_ringer_drawer"
-        layout="@layout/volume_ringer_drawer"
+    <FrameLayout
+        android:id="@+id/volume_dialog_top_section_container"
         android:layout_width="0dp"
         android:layout_height="0dp"
-        android:layout_marginEnd="@dimen/volume_dialog_ringer_drawer_diff_end_margin"
         android:layout_marginBottom="@dimen/volume_dialog_components_spacing"
+        android:clipChildren="false"
         app:layout_constraintBottom_toTopOf="@id/volume_dialog_main_slider_container"
         app:layout_constraintEnd_toEndOf="@id/volume_dialog_main_slider_container"
+        app:layout_constraintHeight_default="spread"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent" />
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintWidth_default="spread">
+
+        <include layout="@layout/volume_dialog_top_section" />
+    </FrameLayout>
 
     <include
         android:id="@+id/volume_dialog_main_slider_container"
         layout="@layout/volume_dialog_slider" />
 
-    <ImageButton
-        android:id="@+id/volume_dialog_settings"
-        android:layout_width="@dimen/volume_dialog_button_size"
-        android:layout_height="@dimen/volume_dialog_button_size"
+    <FrameLayout
+        android:id="@+id/volume_dialog_bottom_section_container"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
         android:layout_marginTop="@dimen/volume_dialog_components_spacing"
-        android:background="@drawable/ripple_drawable_20dp"
-        android:contentDescription="@string/accessibility_volume_settings"
-        android:scaleType="centerInside"
-        android:soundEffectsEnabled="false"
-        android:tint="@androidprv:color/materialColorPrimary"
+        android:clipChildren="false"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="@id/volume_dialog_main_slider_container"
+        app:layout_constraintHeight_default="wrap"
         app:layout_constraintStart_toStartOf="@id/volume_dialog_main_slider_container"
         app:layout_constraintTop_toBottomOf="@id/volume_dialog_main_slider_container"
-        app:layout_constraintVertical_bias="0" />
+        app:layout_constraintVertical_bias="0"
+        app:layout_constraintWidth_default="wrap">
+
+        <include layout="@layout/volume_dialog_bottom_section" />
+    </FrameLayout>
 
     <LinearLayout
         android:id="@+id/volume_dialog_floating_sliders_container"
diff --git a/packages/SystemUI/res/layout/volume_dialog_bottom_section.xml b/packages/SystemUI/res/layout/volume_dialog_bottom_section.xml
new file mode 100644
index 0000000..b94c430
--- /dev/null
+++ b/packages/SystemUI/res/layout/volume_dialog_bottom_section.xml
@@ -0,0 +1,26 @@
+<!--
+     Copyright (C) 2024 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<ImageButton xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+    android:id="@+id/volume_dialog_settings"
+    android:layout_width="@dimen/volume_dialog_button_size"
+    android:layout_height="@dimen/volume_dialog_button_size"
+    android:layout_gravity="center"
+    android:background="@drawable/ripple_drawable_20dp"
+    android:contentDescription="@string/accessibility_volume_settings"
+    android:scaleType="centerInside"
+    android:soundEffectsEnabled="false"
+    android:tint="@androidprv:color/materialColorPrimary" />
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/volume_ringer_drawer.xml b/packages/SystemUI/res/layout/volume_dialog_top_section.xml
similarity index 92%
rename from packages/SystemUI/res/layout/volume_ringer_drawer.xml
rename to packages/SystemUI/res/layout/volume_dialog_top_section.xml
index 8f51dbc..4fc20e2 100644
--- a/packages/SystemUI/res/layout/volume_ringer_drawer.xml
+++ b/packages/SystemUI/res/layout/volume_dialog_top_section.xml
@@ -23,16 +23,17 @@
     android:clipToPadding="false"
     android:gravity="center"
     android:layoutDirection="ltr"
+    android:paddingEnd="@dimen/volume_dialog_ringer_drawer_diff_end_margin"
     app:layoutDescription="@xml/volume_dialog_ringer_drawer_motion_scene">
 
     <View
         android:id="@+id/ringer_buttons_background"
         android:layout_width="@dimen/volume_dialog_width"
         android:layout_height="0dp"
-        android:visibility="gone"
         android:layout_marginTop="@dimen/volume_dialog_background_vertical_margin"
         android:layout_marginBottom="@dimen/volume_dialog_background_vertical_margin"
-        android:background="@drawable/volume_dialog_ringer_background" />
+        android:background="@drawable/volume_dialog_ringer_background"
+        android:visibility="gone" />
 
     <!-- add ringer buttons here -->
 
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index e1ad98f..b8b69b6 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Batterypersentasie is onbekend."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Gekoppel aan <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Gekoppel aan <xliff:g id="CAST">%s</xliff:g>."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"Vou groep uit."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"Maak app oop."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Nie gekoppel nie."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Swerwing"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Af"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Verken sentrummodus"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Kry toegang tot jou gunstelinglegstukke en -skermbeskermers terwyl jy laai."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Kom ons begin"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Wys jou gunstelingsluimerskerms tydens die laaiproses"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Wissel gebruiker"</string>
     <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"aftrekkieslys"</string>
     <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Alle programme en data in hierdie sessie sal uitgevee word."</string>
@@ -807,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Word aan die bokant van gesprekskennisgewings en as \'n profielfoto op sluitskerm gewys, verskyn as \'n borrel, onderbreek Moenie Steur Nie"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioriteit"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> steun nie gesprekskenmerke nie"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Terugvoer"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Maak toe"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Moenie weer wys nie"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Hierdie kennisgewings kan nie gewysig word nie."</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Gebruik vingerafdruk om oop te maak"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Stawing word vereis. Raak die vingerafdruksensor om te staaf."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"Oproep aan die gang"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Nog besig"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobiele data"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Gekoppel"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Tydelik gekoppel"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Voubare toestel word ontvou"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Voubare toestel word omgekeer"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Voorste skerm is aangeskakel"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"gevou"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"oopgevou"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index feee18f..c89ea75 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"የባትሪ መቶኛ አይታወቅም።"</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"ከ<xliff:g id="BLUETOOTH">%s</xliff:g> ጋር ተገናኝቷል።"</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"ከ<xliff:g id="CAST">%s</xliff:g> ጋር ተገናኝቷል።"</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"ቡድንን ዘርጋ።"</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"መተግበሪያ ክፈት።"</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"አልተገናኘም።"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"በማዛወር ላይ"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"ጠፍቷል"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"የመገናኛ ሁነታን ያስሱ"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"ኃይል በሚሞሉበት ወቅት የእርስዎን ተወዳጅ ምግብሮች እና ማያ ገፅ ቆጣቢዎችን ይድረሱ።"</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"እንሂድ"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"ኃይል በሚሞሉበት ጊዜ ተወዳጅ የገፀ ማያ አሳራፊዎችዎን ያሳዩ"</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>
@@ -807,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"ግብረመልስ"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"አሰናብት"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"ዳግም አታሳይ"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"እነዚህ ማሳወቂያዎች ሊሻሻሉ አይችሉም።"</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"ለመክፈት የጣት አሻራ ይጠቀሙ"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"ማረጋገጥ ያስፈልጋል። ለማረጋገጥ የጣት አሻራ ዳሳሹን ይንኩ።"</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"እየተካሄደ ያለ ጥሪ"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"በመካሄድ ላይ ያለ"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"የተንቀሳቃሽ ስልክ ውሂብ"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"ተገናኝቷል"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"በጊዜያዊነት ተገናኝቷል"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"መታጠፍ የሚችል መሣሪያ እየተዘረጋ ነው"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"መታጠፍ የሚችል መሣሪያ እየተገለበጠ ነው"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"የፊት ለፊት ማያ ገፅ በርቷል"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"የታጠፈ"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"የተዘረጋ"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 31bbbb6..962f1c9 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"نسبة شحن البطارية غير معروفة."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"متصل بـ <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"تم الاتصال بـ <xliff:g id="CAST">%s</xliff:g>."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"سيتم توسيع المجموعة."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"سيتم فتح التطبيق."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"غير متصل."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"التجوال"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"غير مفعّلة"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"التعرُّف على \"وضع الإرساء\""</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"يمكنك الاطّلاع على التطبيقات المصغّرة وشاشات الاستراحة المفضَّلة لديك أثناء شحن الجهاز."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"لنبدأ"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"سيتم عرض شاشات الاستراحة المفضَّلة أثناء شحن الجهاز"</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>
@@ -807,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"الملاحظات"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"إغلاق"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"عدم الإظهار مرة أخرى"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"يتعذّر تعديل هذه الإشعارات."</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"يمكنك استخدام بصمة الإصبع للفتح"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"المصادقة مطلوبة. المس مستشعر بصمات الإصبع للمصادقة."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"مكالمة جارية"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"مستمر"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"بيانات الجوّال"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"متصلة بالإنترنت"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"متصلة مؤقتًا"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"جهاز قابل للطي يجري فتحه"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"جهاز قابل للطي يجري قلبه"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"تم تفعيل الشاشة الأمامية"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"مطوي"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"غير مطوي"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"‫%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index 7d7e4f7..b88e9e9 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -804,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"মতামত"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"অগ্ৰাহ্য কৰক"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"পুনৰাই নেদেখুৱাব"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"এই জাননীসমূহ সংশোধন কৰিব নোৱাৰি।"</string>
@@ -1395,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"জপাব পৰা ডিভাইচৰ জাপ খুলি থকা হৈছে"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"জপাব পৰা ডিভাইচৰ ওলোটাই থকা হৈছে"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"সন্মুখৰ স্ক্ৰীনখন অন কৰা হৈছে"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"ফ’ল্ড কৰা"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"আনফ’ল্ড কৰা"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index 2551d9c..e629969 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Batareyanın faizi naməlumdur."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> üzərindən qoşuldu."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> cihazına qoşulub."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"Qrupu genişləndirin."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"Tətbiqi açın."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Qoşulu deyil."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Rouminq"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Deaktiv"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Hab rejimini araşdırın"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Şarj edərkən sevimli vidcet və ekran qoruyucularınıza daxil olun."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Başlayaq"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Şarj edilərkən sevimli ekran qoruyucularınızı göstərin"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Switch user"</string>
     <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"aşağı çəkilən menyu"</string>
     <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Bu sessiyada bütün tətbiqlər və data silinəcək."</string>
@@ -807,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Söhbət bildirişlərinin yuxarısında və kilid ekranında profil şəkli kimi göstərilir, baloncuq kimi görünür, Narahat Etməyin rejimini kəsir"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> söhbət funksiyalarını dəstəkləmir"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Rəy"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Rədd edin"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Yenidən göstərməyin"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Bu bildirişlər dəyişdirilə bilməz."</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Açmaq üçün barmaq izindən istifadə edin"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Doğrulanma tələb olunur. Doğrulamaq üçün barmaq izi sensoruna toxunun."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"Davam edən zəng"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Davam edir"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobil data"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Qoşulub"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Müvəqqəti qoşulub"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Qatlana bilən cihaz açılır"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Qatlana bilən cihaz fırladılır"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Ön ekran aktiv edildi"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"qatlanmış"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"açıq"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index b01d837..1970144 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -109,14 +109,14 @@
     <string name="screenrecord_title" msgid="4257171601439507792">"Snimač ekrana"</string>
     <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="7415261783188749730">"Želite da snimite ekran?"</string>
-    <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Snimi jednu aplikaciju"</string>
+    <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Želite da snimate ekran?"</string>
+    <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Snimaj jednu aplikaciju"</string>
     <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="4882406311415082016">"Snimi ovaj ekran"</string>
     <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="4169494703993148253">"Snimi %s"</string>
     <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Kada snimate ceo ekran, snima se sve što je na njemu. Zato pazite na lozinke, informacije o plaćanju, poruke, slike, audio i video sadržaj."</string>
     <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Kada snimate aplikaciju, snima se sav sadržaj koji se prikazuje ili pušta u njoj. Zato pazite na lozinke, informacije o plaćanju, poruke, slike, audio i video sadržaj."</string>
     <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Snimi ekran"</string>
-    <string name="screenrecord_app_selector_title" msgid="3854492366333954736">"Odaberite aplikaciju koju želite da snimite"</string>
+    <string name="screenrecord_app_selector_title" msgid="3854492366333954736">"Odaberite aplikaciju za snimanje"</string>
     <string name="screenrecord_audio_label" msgid="6183558856175159629">"Snimaj zvuk"</string>
     <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Zvuk uređaja"</string>
     <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Zvuk sa uređaja, na primer, muzika, pozivi i melodije zvona"</string>
@@ -573,7 +573,7 @@
     <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="7094417930857938876">"Kada delite aplikaciju, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> vidi sav sadržaj koji se prikazuje ili pušta u njoj. Zato pazite na lozinke, informacije o plaćanju, poruke, slike, audio i video sadržaj."</string>
     <string name="media_projection_entry_app_permission_dialog_continue_entire_screen" msgid="1850848182344377579">"Deli ekran"</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_share_app_selector_title" msgid="1419515119767501822">"Odaberite aplikaciju koju želite da delite"</string>
+    <string name="media_projection_entry_share_app_selector_title" msgid="1419515119767501822">"Odaberite aplikaciju za deljenje"</string>
     <string name="media_projection_entry_cast_permission_dialog_title" msgid="752756942658159416">"Želite da prebacite ekran?"</string>
     <string name="media_projection_entry_cast_permission_dialog_option_text_single_app" msgid="6073353940838561981">"Prebaci jednu aplikaciju"</string>
     <string name="media_projection_entry_cast_permission_dialog_option_text_entire_screen" msgid="8389508187954155307">"Prebaci ceo ekran"</string>
@@ -804,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Prikazuje se u vrhu obaveštenja o konverzacijama i kao slika profila na zaključanom ekranu, pojavljuje se kao oblačić, prekida režim Ne uznemiravaj"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritetno"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne podržava funkcije konverzacije"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Povratne informacije"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Odbaci"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Ne prikazuj ponovo"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Ova obaveštenja ne mogu da se menjaju."</string>
@@ -1395,6 +1394,7 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Uređaj na preklop se otvara"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Uređaj na preklop se obrće"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Prednji ekran je uključen"</string>
+    <string name="rear_display_unfolded_front_screen_on_slide_to_cancel" msgid="1455192420423012859">"Prevucite da biste koristili unutrašnji ekran"</string>
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"zatvoreno"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"otvoreno"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index 8f1af5f..afbac9f 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -804,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Водгук"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Закрыць"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Больш не паказваць"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Гэтыя апавяшчэнні нельга змяніць."</string>
@@ -1395,6 +1394,7 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Складная прылада ў раскладзеным выглядзе"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Перавернутая складная прылада"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Пярэдні экран уключаны"</string>
+    <string name="rear_display_unfolded_front_screen_on_slide_to_cancel" msgid="1455192420423012859">"Правядзіце пальцам, каб выкарыстоўваць унутраны экран"</string>
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"складзена"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"раскладзена"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index 3538152..77542de 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Процентът на батерията е неизвестен."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Има връзка с <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Установена е връзка с/ъс <xliff:g id="CAST">%s</xliff:g>."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"Разгъване на групата."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"Отваряне на приложението."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Няма връзка."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Роуминг"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Изключени"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Разглеждане на режима „Контролен център“"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Използвайте любимите си приспособления и скрийнсейвъри по време на зареждане."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Начало"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Показване на любимите ви скрийнсейвъри при зареждане"</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>
@@ -807,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Отзиви"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Отхвърляне"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Да не се показва отново"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Тези известия не могат да бъдат променяни."</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Използвайте отпечатък за отваряне"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Изисква се удостоверяване на самоличността. За целта докоснете сензора за отпечатъци."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"Текущо обаждане"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Текуща активност"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"Мобилни данни"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Свързано"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Установена е временна връзка"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Разгъване на сгъваемо устройство"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Обръщане на сгъваемо устройство"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Предният екран е включен"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"затворено"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"отворено"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index 4d88594..6bd1e0c 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"ব্যাটারি কত শতাংশ আছে তা জানা যায়নি।"</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g>এ সংযুক্ত হয়ে আছে।"</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> এর সাথে সংযুক্ত৷"</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"গ্রুপ বড় করুন।"</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"অ্যাপ্লিকেশন খুলুন।"</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"সংযুক্ত নয়৷"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"রোমিং"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"বন্ধ"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"হাব মোড ঘুরে দেখুন"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"চার্জ করার সময় আপনার পছন্দের উইজেট এবং স্ক্রিন সেভার অ্যাক্সেস করুন।"</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"শুরু করা যাক"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"চার্জিংয়ের সময় আপনার পছন্দের স্ক্রিন সেভার দেখুন"</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>
@@ -807,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"মতামত"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"বাতিল করুন"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"আর দেখতে চাই না"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"এই বিজ্ঞপ্তিগুলি পরিবর্তন করা যাবে না।"</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"খুলতে ফিঙ্গারপ্রিন্ট ব্যবহার করুন"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"যাচাইকরণ করতে হবে। যাচাইকরণ করতে আঙুলের ছাপের সেন্সরে টাচ করুন।"</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"চালু থাকা কল"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"চলছে"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"মোবাইল ডেটা"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"কানেক্ট করা আছে"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"সাময়িকভাবে কানেক্ট করা হয়েছে"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"ফোল্ড করা যায় এমন ডিভাইস খোলা হচ্ছে"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"ফোল্ড করা যায় এমন ডিভাইস উল্টানো হচ্ছে"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"ফ্রন্ট স্ক্রিন চালু আছে"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"ফোল্ড করা রয়েছে"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"ফোল্ড করা নেই"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index 9e86aa9..4ccc38a 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -250,8 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Postotak napunjenosti baterije nije poznat"</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Povezan na <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Povezan na <xliff:g id="CAST">%s</xliff:g>."</string>
-    <string name="accessibility_expand_group" msgid="521237935987978624">"Proširite grupu."</string>
-    <string name="accessibility_open_application" msgid="1749126077501259712">"Otvorite aplikaciju."</string>
+    <string name="accessibility_expand_group" msgid="521237935987978624">"Proširivanje grupe."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"Otvaranje aplikacije."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Nije povezano."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roming"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Isključeno"</string>
@@ -541,7 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Istražite način rada središta"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Pristupajte svojim omiljenim vidžetima i čuvarima ekrana tokom punjenja."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Započnimo"</string>
-    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Prikaz vaših omiljenih čuvara zaslona tijekom punjenja"</string>
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Prikaz vaših omiljenih čuvara ekrana tokom punjenja"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Zamijeni korisnika"</string>
     <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"padajući meni"</string>
     <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Sve aplikacije i podaci iz ove sesije će se izbrisati."</string>
@@ -804,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Prikazuje se na vrhu obavještenja u razgovorima i kao slika profila na zaključanom ekranu, izgleda kao oblačić, prekida funkciju Ne ometaj"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritetno"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ne podržava funkcije razgovora"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Povratne informacije"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Odbaci"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Ne prikazuj ponovo"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Ta obavještenja se ne mogu izmijeniti."</string>
@@ -1305,7 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Otvorite pomoću otiska prsta"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Potrebna je autentifikacija. Dodirnite senzor za otisak prsta da autentificirate."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"Poziv u toku"</string>
-    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"U tijeku"</string>
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"U toku"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"Prijenos podataka na mobilnoj mreži"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Povezano"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Privremeno povezano"</string>
@@ -1395,6 +1394,7 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Sklopivi uređaj se rasklapa"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Sklopivi uređaj se obrće"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Prednji ekran je uključen"</string>
+    <string name="rear_display_unfolded_front_screen_on_slide_to_cancel" msgid="1455192420423012859">"Kliznite za upotrebu unutarnjeg zaslona"</string>
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"sklopljeno"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"otklopljeno"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 25b236d..80558a9 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Es desconeix el percentatge de bateria."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"S\'ha connectat a <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Està connectat amb <xliff:g id="CAST">%s</xliff:g>."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"Desplega el grup."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"Obre l\'aplicació."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Sense connexió."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Itinerància"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Desactivades"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Explora el mode Hub"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Accedeix als teus widgets i estalvis de pantalla preferits mentre es carrega."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Som-hi"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Mostra els teus estalvis de pantalla preferits durant la càrrega"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Canvia d\'usuari"</string>
     <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menú desplegable"</string>
     <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Totes les aplicacions i les dades d\'aquesta sessió se suprimiran."</string>
@@ -573,7 +570,7 @@
     <!-- no translation found for media_projection_entry_app_permission_dialog_option_text_entire_screen (5100078808078139706) -->
     <skip />
     <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="5504288438067851086">"Quan comparteixes tota la pantalla, qualsevol cosa que es mostra en pantalla és visible a <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>. 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="7094417930857938876">"Quan comparteixes una aplicació, qualsevol cosa que es mostra o que es reprodueix en aquesta aplicació és visible a <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>. 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="7094417930857938876">"Quan comparteixes una aplicació, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> pot veure qualsevol cosa que s\'hi mostra o que s\'hi reprodueix. 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_entire_screen" msgid="1850848182344377579">"Comparteix la pantalla"</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_share_app_selector_title" msgid="1419515119767501822">"Tria una aplicació per compartir"</string>
@@ -807,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Es mostra a la part superior de les notificacions de les converses i com a foto de perfil a la pantalla de bloqueig, apareix com una bombolla, interromp el mode No molestis"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritat"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> no admet les funcions de converses"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Suggeriments"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Ignora"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"No ho tornis a mostrar"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Aquestes notificacions no es poden modificar."</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Utilitza l\'empremta digital per obrir"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Autenticació necessària. Toca el sensor d\'empremtes digitals per autenticar-te."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"Trucada en curs"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"En curs"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"Dades mòbils"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Connectat"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Connexió temporal"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Dispositiu plegable desplegant-se"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Dispositiu plegable girant"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"La pantalla frontal està activada"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"plegat"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"desplegat"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 26105c7..ee32107 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Procento baterie není známé."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Připojeno k zařízení <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Jste připojeni k zařízení <xliff:g id="CAST">%s</xliff:g>."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"Rozbalit skupinu."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"Otevřít aplikaci."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Nepřipojeno."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Vypnuto"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Prozkoumejte Režim centra"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Mějte po ruce oblíbené widgety a spořiče obrazovky při nabíjení."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Jdeme na to"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Během nabíjení zobrazovat oblíbené spořiče obrazovky"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Přepnout uživatele"</string>
     <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"rozbalovací nabídka"</string>
     <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Veškeré aplikace a data v této relaci budou vymazána."</string>
@@ -573,7 +570,7 @@
     <!-- no translation found for media_projection_entry_app_permission_dialog_option_text_entire_screen (5100078808078139706) -->
     <skip />
     <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="5504288438067851086">"Při sdílení celé obrazovky vidí aplikace <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> vše, co se na obrazovce nachází nebo děje. Buďte proto opatrní, když jde o hesla, platební údaje, zprávy, fotografie, zvuk a video."</string>
-    <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="7094417930857938876">"Při sdílení aplikace vidí aplikace <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> vše, co se ve sdílené aplikaci nachází nebo děje. Buďte proto opatrní, když jde o hesla, platební údaje, zprávy, fotografie, zvuk a video."</string>
+    <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="7094417930857938876">"Při sdílení aplikace vidí <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> vše, co se ve sdílené aplikaci nachází nebo děje. Buďte proto opatrní, když jde o hesla, platební údaje, zprávy, fotografie, zvuk a video."</string>
     <string name="media_projection_entry_app_permission_dialog_continue_entire_screen" msgid="1850848182344377579">"Sdílet obrazovku"</string>
     <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_share_app_selector_title" msgid="1419515119767501822">"Vyberte aplikaci ke sdílení"</string>
@@ -807,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Zobrazuje se v horní části sekce konverzací a na obrazovce uzamčení se objevuje jako profilová fotka, má podobu bubliny a deaktivuje režim Nerušit"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritní"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> funkce konverzace nepodporuje"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Zpětná vazba"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Zavřít"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Už nezobrazovat"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Tato oznámení nelze upravit."</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"K otevření použijte otisk prstu"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Je vyžadováno ověření. Dotkněte se snímače otisků prstů."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"Probíhající hovor"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Probíhá"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobilní data"</string>
     <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>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Rozkládání rozkládacího zařízení"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Otáčení rozkládacího zařízení"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Přední obrazovka je zapnutá"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"složené"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"rozložené"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 2fe576f..323b9d8 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -804,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Vises øverst i samtalenotifikationer og som et profilbillede på låseskærmen. Vises som en boble, der afbryder Forstyr ikke"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> understøtter ikke samtalefunktioner"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Feedback"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Luk"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Vis ikke igen"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Disse notifikationer kan ikke redigeres."</string>
@@ -1395,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Foldbar enhed foldes ud"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Foldbar enhed vendes om"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Frontskærmen er aktiveret"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"foldet"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"foldet ud"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 68f3a41..3c8be75 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -142,7 +142,7 @@
     <string name="share_to_app_stop_dialog_title_generic" msgid="9079161538135843648">"Teilen beenden?"</string>
     <string name="share_to_app_stop_dialog_message_entire_screen_with_host_app" msgid="522823522115375414">"Du teilst momentan deinen gesamten Bildschirm mit der App <xliff:g id="HOST_APP_NAME">%1$s</xliff:g>"</string>
     <string name="share_to_app_stop_dialog_message_entire_screen" msgid="5090115386271179270">"Du teilst momentan deinen gesamten Bildschirm mit einer App"</string>
-    <string name="share_to_app_stop_dialog_message_single_app_specific" msgid="5923772039347985172">"Du teilst momentan die App <xliff:g id="APP_BEING_SHARED_NAME">%1$s</xliff:g>"</string>
+    <string name="share_to_app_stop_dialog_message_single_app_specific" msgid="5923772039347985172">"Du teilst momentan <xliff:g id="APP_BEING_SHARED_NAME">%1$s</xliff:g>"</string>
     <string name="share_to_app_stop_dialog_message_single_app_generic" msgid="6681016774654578261">"Du teilst momentan Inhalte einer App"</string>
     <string name="share_to_app_stop_dialog_message_generic" msgid="7622174291691249392">"Du teilst momentan Inhalte mit einer App"</string>
     <string name="share_to_app_stop_dialog_button" msgid="6334056916284230217">"Freigabe beenden"</string>
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Akkustand unbekannt."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Mit <xliff:g id="BLUETOOTH">%s</xliff:g> verbunden"</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Verbunden mit <xliff:g id="CAST">%s</xliff:g>."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"Gruppe erweitern."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"Anwendung öffnen."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Nicht verbunden"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Aus"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Hub-Modus entdecken"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Du kannst während des Ladevorgangs auf deine bevorzugten Widgets und Bildschirmschoner zugreifen."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Los gehts"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Beim Laden deine bevorzugten Bildschirmschoner anzeigen"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Nutzer wechseln"</string>
     <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"Pull-down-Menü"</string>
     <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Alle Apps und Daten in dieser Sitzung werden gelöscht."</string>
@@ -807,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Wird oben im Bereich „Unterhaltungen“ sowie als Profilbild auf dem Sperrbildschirm angezeigt, erscheint als Bubble, unterbricht „Bitte nicht stören“"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Priorität"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> unterstützt keine Funktionen für Unterhaltungen"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Feedback"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Schließen"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Nicht mehr anzeigen"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Diese Benachrichtigungen können nicht geändert werden."</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Mit Fingerabdruck öffnen"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Authentifizierung erforderlich. Tippe dazu einfach auf den Fingerabdrucksensor."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"Aktiver Anruf"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Aktiv"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobile Daten"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Verbunden"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Vorübergehend verbunden"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Faltbares Gerät wird geöffnet"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Faltbares Gerät wird umgeklappt"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Frontdisplay aktiviert"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"zugeklappt"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"aufgeklappt"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 412e315..470dd2c 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Άγνωστο ποσοστό μπαταρίας."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Συνδέθηκε στο <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Συνδέθηκε σε <xliff:g id="CAST">%s</xliff:g>."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"Αναπτύξτε την ομάδα."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"Ανοίξτε την εφαρμογή."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Μη συνδεδεμένο"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Περιαγωγή"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Ανενεργά"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Εξερεύνηση της λειτουργίας Hub"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Αποκτήστε πρόσβαση στα αγαπημένα σας γραφικά στοιχεία και τις προφυλάξεις οθόνης κατά τη φόρτιση."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Ας ξεκινήσουμε"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Εμφάνιση αγαπημένων προφυλάξεων οθόνης κατά τη φόρτιση"</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>
@@ -807,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Σχόλια"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Παράβλεψη"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Να μην εμφανιστεί ξανά"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Δεν είναι δυνατή η τροποποίηση αυτών των ειδοποιήσεων"</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Χρήση δακτυλικού αποτυπώματος για άνοιγμα"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Απαιτείται έλεγχος ταυτότητας. Αγγίξτε τον αισθητήρα δακτυλικών αποτυπωμάτων για έλεγχο ταυτότητας."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"Κλήση σε εξέλιξη"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Σε εξέλιξη"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"Δεδομένα κινητής τηλεφωνίας"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Συνδέθηκε"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Προσωρινή σύνδεση"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Αναδιπλούμενη συσκευή που ξεδιπλώνει"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Αναδιπλούμενη συσκευή που διπλώνει"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Η μπροστινή οθόνη ενεργοποιήθηκε"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"διπλωμένη"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"ξεδιπλωμένη"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index d5c5666..0c161a7 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Battery percentage unknown."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Connected to <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Connected to <xliff:g id="CAST">%s</xliff:g>."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"Expand group."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"Open application."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Not connected."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Off"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Explore Hub Mode"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Access your favourite widgets and screen savers while charging."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Let\'s go"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Show your favourite screensavers while charging"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Switch user"</string>
     <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"pulldown menu"</string>
     <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"All apps and data in this session will be deleted."</string>
@@ -807,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Shows at the top of conversation notifications and as a profile picture on lock screen, appears as a bubble, interrupts Do Not Disturb"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Priority"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> doesn’t support conversation features"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Feedback"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Dismiss"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Don\'t show again"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"These notifications can\'t be modified."</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Use fingerprint to open"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Authentication required. Touch the fingerprint sensor to authenticate."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"Ongoing call"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Ongoing"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobile data"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Connected"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Temporarily connected"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Foldable device being unfolded"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Foldable device being flipped around"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Front screen turned on"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"folded"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"unfolded"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index b3010e2..3a7440b 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -804,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Shows at the top of conversation notifications and as a profile picture on lock screen, appears as a bubble, interrupts Do Not Disturb"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Priority"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> doesn’t support conversation features"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Feedback"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Dismiss"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Don\'t show again"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"These notifications can\'t be modified."</string>
@@ -1395,6 +1394,7 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Foldable device being unfolded"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Foldable device being flipped around"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Front screen turned on"</string>
+    <string name="rear_display_unfolded_front_screen_on_slide_to_cancel" msgid="1455192420423012859">"Slide to use inner screen"</string>
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"folded"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"unfolded"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index d5c5666..0c161a7 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Battery percentage unknown."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Connected to <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Connected to <xliff:g id="CAST">%s</xliff:g>."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"Expand group."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"Open application."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Not connected."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Off"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Explore Hub Mode"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Access your favourite widgets and screen savers while charging."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Let\'s go"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Show your favourite screensavers while charging"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Switch user"</string>
     <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"pulldown menu"</string>
     <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"All apps and data in this session will be deleted."</string>
@@ -807,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Shows at the top of conversation notifications and as a profile picture on lock screen, appears as a bubble, interrupts Do Not Disturb"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Priority"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> doesn’t support conversation features"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Feedback"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Dismiss"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Don\'t show again"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"These notifications can\'t be modified."</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Use fingerprint to open"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Authentication required. Touch the fingerprint sensor to authenticate."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"Ongoing call"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Ongoing"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobile data"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Connected"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Temporarily connected"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Foldable device being unfolded"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Foldable device being flipped around"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Front screen turned on"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"folded"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"unfolded"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index d5c5666..0c161a7 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Battery percentage unknown."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Connected to <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Connected to <xliff:g id="CAST">%s</xliff:g>."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"Expand group."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"Open application."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Not connected."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Off"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Explore Hub Mode"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Access your favourite widgets and screen savers while charging."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Let\'s go"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Show your favourite screensavers while charging"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Switch user"</string>
     <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"pulldown menu"</string>
     <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"All apps and data in this session will be deleted."</string>
@@ -807,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Shows at the top of conversation notifications and as a profile picture on lock screen, appears as a bubble, interrupts Do Not Disturb"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Priority"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> doesn’t support conversation features"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Feedback"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Dismiss"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Don\'t show again"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"These notifications can\'t be modified."</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Use fingerprint to open"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Authentication required. Touch the fingerprint sensor to authenticate."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"Ongoing call"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Ongoing"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobile data"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Connected"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Temporarily connected"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Foldable device being unfolded"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Foldable device being flipped around"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Front screen turned on"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"folded"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"unfolded"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 966c9f3..dd8f735 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -804,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Aparece en forma de burbuja y como foto de perfil en la parte superior de las notificaciones de conversación, en la pantalla de bloqueo, y detiene el modo No interrumpir"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritaria"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> no admite funciones de conversación"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Comentarios"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Descartar"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"No volver a mostrar"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"No se pueden modificar estas notificaciones."</string>
@@ -963,8 +962,8 @@
     <string name="right_keycode" msgid="2480715509844798438">"Clave de código derecho"</string>
     <string name="left_icon" msgid="5036278531966897006">"Ícono izquierdo"</string>
     <string name="right_icon" msgid="1103955040645237425">"Ícono derecho"</string>
-    <string name="drag_to_add_tiles" msgid="8933270127508303672">"Mantén presionada la tarjeta y arrástrala para agregarla"</string>
-    <string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"Mantén presionada la tarjeta y arrástrala para reorganizarla"</string>
+    <string name="drag_to_add_tiles" msgid="8933270127508303672">"Mantén presionada una tarjeta y arrástrala para agregarla"</string>
+    <string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"Mantén presionada una tarjeta y arrástrala para reubicarla"</string>
     <string name="drag_to_remove_tiles" msgid="4682194717573850385">"Arrastra aquí para quitar"</string>
     <string name="drag_to_remove_disabled" msgid="933046987838658850">"Necesitas al menos <xliff:g id="MIN_NUM_TILES">%1$d</xliff:g> tarjetas"</string>
     <string name="qs_edit" msgid="5583565172803472437">"Editar"</string>
@@ -1395,6 +1394,7 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Dispositivo plegable siendo desplegado"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Dispositivo plegable siendo girado"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Pantalla frontal activada"</string>
+    <string name="rear_display_unfolded_front_screen_on_slide_to_cancel" msgid="1455192420423012859">"Desliza para usar la pantalla interior"</string>
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"plegado"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"desplegado"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 3c052be..a2fcc5c 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Porcentaje de batería desconocido."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Conectado a <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Conectado a <xliff:g id="CAST">%s</xliff:g>."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"Mostrar grupo."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"Abrir aplicación."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"No conectado."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Desactivados"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Descubre el modo Base"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Accede a tus widgets y salvapantallas favoritos mientras se carga."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Vamos allá"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Muestra tus salvapantallas favoritos mientras se carga"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Cambiar de usuario"</string>
     <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menú desplegable"</string>
     <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Se eliminarán todas las aplicaciones y datos de esta sesión."</string>
@@ -807,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Se muestra encima de las notificaciones de conversaciones y como imagen de perfil en la pantalla de bloqueo, aparece como burbuja e interrumpe el modo No molestar"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioridad"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> no admite funciones de conversación"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Comentarios"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Cerrar"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"No volver a mostrar"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Estas notificaciones no se pueden modificar."</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Usa la huella digital para abrir"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Autenticación obligatoria. Toca el sensor de huellas digitales para autenticarte."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"Llamada en curso"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"En curso"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"Datos móviles"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Conectado"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Conectada temporalmente"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Dispositivo plegable desplegándose"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Dispositivo plegable mostrado desde varios ángulos"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Pantalla frontal encendida"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"plegado"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"desplegado"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index defaa77..bca7491 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -133,7 +133,7 @@
     <string name="screenrecord_save_error" msgid="5862648532560118815">"Viga ekraanisalvestise salvestamisel"</string>
     <string name="screenrecord_start_error" msgid="2200660692479682368">"Viga ekraanikuva salvestamise alustamisel"</string>
     <string name="screenrecord_stop_dialog_title" msgid="8716193661764511095">"Kas peatada salvestamine?"</string>
-    <string name="screenrecord_stop_dialog_message" msgid="6262768207331626817">"Salvestate praegu kogu oma ekraanikuva"</string>
+    <string name="screenrecord_stop_dialog_message" msgid="6262768207331626817">"Salvestate praegu kogu oma ekraanikuva."</string>
     <string name="screenrecord_stop_dialog_message_specific_app" msgid="5995770227684523244">"Salvestate praegu rakendust <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="screenrecord_stop_dialog_button" msgid="2883812564938194350">"Peata salvestamine"</string>
     <string name="share_to_app_chip_accessibility_label" msgid="4210256229976947065">"Ekraani jagamine"</string>
@@ -804,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Kuvatakse mullina vestluste märguannete ülaosas ja profiilipildina lukustuskuval ning katkestab režiimi Mitte segada"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioriteetne"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei toeta vestlusfunktsioone"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Tagasiside"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Loobu"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Ära enam näita"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Neid märguandeid ei saa muuta."</string>
@@ -1395,6 +1394,7 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Volditava seadme lahtivoltimine"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Volditava seadme ümberpööramine"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Esiekraan on sisse lülitatud"</string>
+    <string name="rear_display_unfolded_front_screen_on_slide_to_cancel" msgid="1455192420423012859">"Lohistamine sisemisele ekraanile"</string>
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"kokku volditud"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"lahti volditud"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index 02da5a1..f447dc6 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Bateriaren ehunekoa ezezaguna da."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> gailura konektatuta."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Hona konektatuta: <xliff:g id="CAST">%s</xliff:g>."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"Zabaldu taldea."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"Ireki aplikazioa."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Konektatu gabe."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Ibiltaritza"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Desaktibatuta"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Arakatu kontrol-zentro modua"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Erabili gogoko dituzun widgetak eta pantaila-babesleak gailua kargatu bitartean."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Has gaitezen"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Bistaratu gogoko pantaila-babesleak kargatu bitartean"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Aldatu erabiltzailea"</string>
     <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"zabaldu menua"</string>
     <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Saioko aplikazio eta datu guztiak ezabatuko dira."</string>
@@ -576,7 +573,7 @@
     <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="7094417930857938876">"Aplikazio bat partekatzen ari zarenean, aplikazio horretan agertzen den edo bertan erreproduzitzen ari den guztia ikusi dezake <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> aplikazioak. Beraz, kontuz ibili pasahitzekin, ordainketen xehetasunekin, mezuekin, argazkiekin, audioekin eta bideoekin, besteak beste."</string>
     <string name="media_projection_entry_app_permission_dialog_continue_entire_screen" msgid="1850848182344377579">"Partekatu pantaila"</string>
     <string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak aukera desgaitu du"</string>
-    <string name="media_projection_entry_share_app_selector_title" msgid="1419515119767501822">"Aukeratu zer aplikazio partekatu nahi duzun"</string>
+    <string name="media_projection_entry_share_app_selector_title" msgid="1419515119767501822">"Aukeratu zein aplikazio partekatu nahi duzun"</string>
     <string name="media_projection_entry_cast_permission_dialog_title" msgid="752756942658159416">"Pantaila igorri nahi duzu?"</string>
     <string name="media_projection_entry_cast_permission_dialog_option_text_single_app" msgid="6073353940838561981">"Igorri aplikazio bat"</string>
     <string name="media_projection_entry_cast_permission_dialog_option_text_entire_screen" msgid="8389508187954155307">"Igorri pantaila osoa"</string>
@@ -807,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Elkarrizketen jakinarazpenen goialdean eta profileko argazki gisa agertzen da pantaila blokeatuan, burbuila batean, eta ez molestatzeko modua eteten du"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Lehentasuna"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak ez ditu onartzen elkarrizketetarako eginbideak"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Iritzia"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Baztertu"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Ez erakutsi berriro"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Jakinarazpen horiek ezin dira aldatu."</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Erabili hatz-marka irekitzeko"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Autentifikazioa behar da. Autentifikatzeko, ukitu hatz-marken sentsorea."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"Deia abian"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Abian"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"Datu-konexioa"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Konektatuta"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Aldi baterako konektatuta"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Gailu tolesgarria zabaltzen"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Gailu tolesgarria biratzen"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Aurreko pantaila piztuta dago"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"tolestuta"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"tolestu gabe"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 5253897..800bf78 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -804,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"بازخورد"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"بستن"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"دیگر نشان داده نشود"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"این اعلان‌ها قابل اصلاح نیستند."</string>
@@ -921,7 +920,7 @@
     <string name="group_accessibility_toggle_bounce_keys" msgid="4183584952493519179">"تغییر وضعیت کلیدهای ضدتکرار"</string>
     <string name="group_accessibility_toggle_mouse_keys" msgid="534757719357514361">"تغییر وضعیت کلیدهای موشواره"</string>
     <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"تغییر وضعیت کلیدهای چسبان"</string>
-    <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"تغییر وضعیت کلیدهای آهسته"</string>
+    <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"تغییر وضعیت کلیدهای تأخیری"</string>
     <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"تغییر وضعیت «دسترسی صوتی»"</string>
     <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"‏روشن/خاموش کردن TalkBack"</string>
     <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"روشن/خاموش کردن درشت‌نمایی"</string>
@@ -1320,7 +1319,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">"‏فعلاً Wi-Fi به‌طور خودکار متصل نمی‌شود"</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">"‏برای بهبود تجربه استفاده از دستگاه، برنامه‌ها و سرویس‌ها همچنان می‌توانند در هر زمانی شبکه‌های Wi-Fi را اسکن کنند؛ حتی وقتی که Wi-Fi خاموش باشد. می‌توانید این مورد را در تنظیمات اسکن کردن Wi‑Fi تغییر دهید. "<annotation id="link">"تغییر"</annotation></string>
     <string name="turn_off_airplane_mode" msgid="8425587763226548579">"خاموش کردن حالت هواپیما"</string>
@@ -1395,6 +1394,7 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"دستگاه تاشو درحال باز شدن"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"دستگاه تاشو درحال چرخش به اطراف"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"صفحه‌نمایش جلو روشن شد"</string>
+    <string name="rear_display_unfolded_front_screen_on_slide_to_cancel" msgid="1455192420423012859">"برای استفاده از صفحه‌نمایش داخلی، بلغزانید"</string>
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"تاشده"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"تانشده"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 1bd952e..fdf18a3 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -252,10 +252,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Akun varaustaso ei tiedossa."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Yhteys: <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Yhdistetty kohteeseen <xliff:g id="CAST">%s</xliff:g>"</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"Laajenna ryhmä."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"Avaa sovellus."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Ei yhteyttä."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Pois päältä"</string>
@@ -545,8 +543,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Tutustu hubitilaan"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Käytä suosikkiwidgetejä ja -näytönsäästäjiä latauksen aikana."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Aloitetaan"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Näytä suosikkinäytönsäästäjiä latauksen aikana"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Vaihda käyttäjää"</string>
     <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"alasvetovalikko"</string>
     <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Kaikki sovellukset ja tämän istunnon tiedot poistetaan."</string>
@@ -809,8 +806,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Näkyy keskusteluilmoitusten yläosassa ja profiilikuvana lukitusnäytöllä, näkyy kuplana, keskeyttää Älä häiritse ‑tilan"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Tärkeä"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei tue keskusteluominaisuuksia"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Palaute"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Hylkää"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Älä näytä uudelleen"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Näitä ilmoituksia ei voi muokata"</string>
@@ -1310,8 +1306,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Avaa sormenjäljellä"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Todennus vaaditaan. Todenna koskettamalla sormenjälkitunnistinta."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"Käynnissä oleva puhelu"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Käynnissä"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobiilidata"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Yhdistetty"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Väliaikaisesti yhdistetty"</string>
@@ -1401,6 +1396,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Taitettava laite taitetaan"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Taitettava laite käännetään ympäri"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Etunäyttö päällä"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"taitettu"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"taittamaton"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 6360a12..dde9b64 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Pourcentage de la pile inconnu."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Connecté à : <xliff:g id="BLUETOOTH">%s</xliff:g>"</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Connecté à <xliff:g id="CAST">%s</xliff:g>."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"Développer le groupe."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"Ouvrir l\'appli."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Non connecté"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Itinérance"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Désactivé"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Explorer le mode Console"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Accéder à vos widgets et écrans de veille préférés pendant le chargement."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Allons-y"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Affichez vos écrans de veille préférés pendant le chargement"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Changer d\'utilisateur"</string>
     <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menu déroulant"</string>
     <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Toutes les applis et les données de cette session seront supprimées."</string>
@@ -807,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"S\'affiche dans le haut des notifications de conversation et comme photo de profil à l\'écran de verrouillage, s\'affiche comme bulle, interrompt le mode Ne pas déranger"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritaire"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne prend pas en charge les fonctionnalités de conversation"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Commentaires"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Fermer"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Ne plus afficher"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Ces notifications ne peuvent pas être modifiées"</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Servez-vous de votre empreinte digitale pour ouvrir"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Authentification requise. Touchez le capteur d\'empreintes digitales pour vous authentifier."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"Appel en cours"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"En cours"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"Données cellulaires"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Connexion active"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Connectée temporairement"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Appareil pliable en cours de dépliage"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Appareil pliable en train d\'être retourné"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Écran avant activé"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"plié"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"déplié"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 6d9760c..53dbfea 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -114,7 +114,7 @@
     <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="4882406311415082016">"Enregistrer cet écran"</string>
     <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="4169494703993148253">"Enregistrer %s"</string>
     <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Lorsque vous enregistrez l\'intégralité de votre écran, tout ce qui s\'y affiche est enregistré. Faites donc attention aux éléments tels que les mots de passe, les détails de mode de paiement, les messages, les photos, et les contenus audio et vidéo."</string>
-    <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Lorsque vous enregistrez une appli, tout ce qui est affiché ou lu dans celle-ci est enregistré. 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>
+    <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Lorsque vous enregistrez une appli, tout ce qui est affiché ou lu dans celle-ci est enregistré. Faites donc preuve de vigilance concernant les mots de passe, les infos sur le mode de paiement, les messages, les photos, et les contenus audio et vidéo."</string>
     <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Enregistrer l\'écran"</string>
     <string name="screenrecord_app_selector_title" msgid="3854492366333954736">"Choisir l\'appli à enregistrer"</string>
     <string name="screenrecord_audio_label" msgid="6183558856175159629">"Enregistrer l\'audio"</string>
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Pourcentage de la batterie inconnu."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Connecté à : <xliff:g id="BLUETOOTH">%s</xliff:g>"</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Connecté à <xliff:g id="CAST">%s</xliff:g>."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"Développer le groupe."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"Ouvrir l\'application."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Non connecté"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Itinérance"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Désactivées"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Découvrir le mode Hub"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Accédez à vos widgets et économiseurs d\'écran préférés lorsque l\'appareil est en charge."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"C\'est parti"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Afficher vos économiseurs d\'écran préférés pendant la recharge"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Changer d\'utilisateur"</string>
     <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menu déroulant"</string>
     <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Toutes les applications et les données de cette session seront supprimées."</string>
@@ -807,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"S\'affiche en haut des notifications de conversation et en tant que photo de profil sur l\'écran de verrouillage, apparaît sous forme de bulle, interrompt le mode Ne pas déranger"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritaire"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> n\'est pas compatible avec les fonctionnalités de conversation"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Commentaires"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Ignorer"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Ne plus afficher"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Impossible de modifier ces notifications."</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Utilisez votre empreinte pour ouvrir"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Authentification requise. Appuyez sur le lecteur d\'empreintes digitales pour vous authentifier."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"Appel en cours"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"En cours"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"Données mobiles"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Connecté"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Connexion temporaire"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Appareil pliable qui est déplié"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Appareil pliable qui est retourné"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Écran avant activé"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"plié"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"déplié"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index 3195ff5..03ec2b0 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -804,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Móstrase na parte superior das notificacións das conversas e como imaxe do perfil na pantalla de bloqueo, aparece como unha burbulla e interrompe o modo Non molestar"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioridade"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> non admite funcións de conversa"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Comentarios"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Pechar"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Non volver mostrar"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Estas notificacións non se poden modificar."</string>
@@ -1395,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Dispositivo pregable abríndose"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Dispositivo pregable xirando"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Activouse a pantalla dianteira"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"dispositivo pregado"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"dispositivo despregado"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index 7ad58e9..0c27927 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"બૅટરીની ટકાવારી અજાણ છે."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> થી કનેક્ટ થયાં."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> થી કનેક્ટ કરેલ."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"ગ્રૂપને મોટું કરો."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"ઍપ્લિકેશન ખોલો."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"કનેક્ટ થયેલું નથી."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"રોમિંગ"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"બંધ કરો"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"હબ મોડ શોધખોળ કરો"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"ચાર્જ કરતી વખતે તમારા મનપસંદ વિજેટ અને સ્ક્રીન સેવર ઍક્સેસ કરો."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"ચાલો પ્રારંભ કરીએ"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"ચાર્જ વખતે તમારું મનપસંદ સ્ક્રીનસેવર બતાવો"</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>
@@ -807,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"પ્રતિસાદ"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"છોડી દો"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"ફરી બતાવશો નહીં"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"આ નોટિફિકેશનમાં કોઈ ફેરફાર થઈ શકશે નહીં."</string>
@@ -914,7 +910,7 @@
     <string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"ઍપ્લિકેશનો"</string>
     <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
     <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"બ્રાઉઝર"</string>
-    <string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Contacts"</string>
+    <string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"સંપર્કો"</string>
     <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"ઇમેઇલ"</string>
     <string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
     <string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"મ્યુઝિક"</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"ખોલવા માટે ફિંગરપ્રિન્ટનો ઉપયોગ કરો"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"પ્રમાણીકરણ આવશ્યક છે. પ્રમાણિત કરવા માટે ફિંગરપ્રિન્ટ સેન્સરને ટચ કરો."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"ચાલુ કૉલ"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"ચાલી રહેલી પ્રવૃત્તિ"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"મોબાઇલ ડેટા"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"કનેક્ટ કરેલું"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"હંગામી રીતે કનેક્ટ કર્યું"</string>
@@ -1399,6 +1394,7 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"ફોલ્ડ કરી શકાય એવું ડિવાઇસ અનફોલ્ડ કરવામાં આવી રહ્યું છે"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"ફોલ્ડ કરી શકાય એવું ડિવાઇસ ફ્લિપ કરવામાં આવી રહ્યું છે"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"ફ્રન્ટ સ્ક્રીનની સુવિધા ચાલુ કરેલી છે"</string>
+    <string name="rear_display_unfolded_front_screen_on_slide_to_cancel" msgid="1455192420423012859">"અંદરની સ્ક્રીનનો ઉપયોગ કરવા માટે સ્લાઇડ કરો"</string>
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"ફોલ્ડ કરેલું"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"અનફોલ્ડ કરેલું"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index f629f22..f2daffe 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -142,7 +142,7 @@
     <string name="share_to_app_stop_dialog_title_generic" msgid="9079161538135843648">"क्या आपको शेयर करने की प्रोसेस बंद करनी है?"</string>
     <string name="share_to_app_stop_dialog_message_entire_screen_with_host_app" msgid="522823522115375414">"फ़िलहाल, <xliff:g id="HOST_APP_NAME">%1$s</xliff:g> पर पूरी स्क्रीन शेयर की जा रही है"</string>
     <string name="share_to_app_stop_dialog_message_entire_screen" msgid="5090115386271179270">"फ़िलहाल, किसी ऐप्लिकेशन पर पूरी स्क्रीन शेयर की जा रही है"</string>
-    <string name="share_to_app_stop_dialog_message_single_app_specific" msgid="5923772039347985172">"फ़िलहाल, <xliff:g id="APP_BEING_SHARED_NAME">%1$s</xliff:g> शेयर किया जा रहा है"</string>
+    <string name="share_to_app_stop_dialog_message_single_app_specific" msgid="5923772039347985172">"फ़िलहाल, <xliff:g id="APP_BEING_SHARED_NAME">%1$s</xliff:g> की स्क्रीन शेयर की जा रही है"</string>
     <string name="share_to_app_stop_dialog_message_single_app_generic" msgid="6681016774654578261">"फ़िलहाल, कोई ऐप्लिकेशन शेयर किया जा रहा है"</string>
     <string name="share_to_app_stop_dialog_message_generic" msgid="7622174291691249392">"फ़िलहाल, ऐप्लिकेशन के साथ कुछ शेयर किया जा रहा है"</string>
     <string name="share_to_app_stop_dialog_button" msgid="6334056916284230217">"शेयर करना बंद करें"</string>
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"इस बारे में जानकारी नहीं है कि अभी बैटरी कितने प्रतिशत चार्ज है."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> से कनेक्ट किया गया."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> से कनेक्ट है."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"ग्रुप को बड़ा करें."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"ऐप्लिकेशन खोलें."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"कनेक्ट नहीं है."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"रोमिंग"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"बंद है"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"हब मोड को एक्सप्लोर करें"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"चार्जिंग के दौरान, अपने पसंदीदा विजेट और स्क्रीन सेवर को ऐक्सेस करें."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"आइए शुरू करें"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"चार्ज करते समय अपने पसंदीदा स्क्रीन सेवर दिखाएं"</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>
@@ -807,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"सुझाव/राय दें या शिकायत करें"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"खारिज करें"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"फिर से न दिखाएं"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"ये सूचनाएं नहीं बदली जा सकती हैं."</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"खोलने के लिए, फ़िंगरप्रिंट का इस्तेमाल करें"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"पुष्टि करना ज़रूरी है. पुष्टि करने के लिए, फ़िंगरप्रिंट सेंसर को छुएं."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"पहले से जारी कॉल"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"जारी है"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"मोबाइल डेटा"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"कनेक्ट हो गया"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"इंटरनेट कनेक्शन कुछ समय के लिए है"</string>
@@ -1399,6 +1394,7 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"फ़ोल्ड किया जा सकने वाला डिवाइस अनफ़ोल्ड किया जा रहा है"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"फ़ोल्ड किया जा सकने वाला डिवाइस पलटा जा रहा है"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"फ़्रंट स्क्रीन चालू है"</string>
+    <string name="rear_display_unfolded_front_screen_on_slide_to_cancel" msgid="1455192420423012859">"इनर स्क्रीन का इस्तेमाल करने के लिए स्लाइड करें"</string>
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"डिवाइस फ़ोल्ड किया गया"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"डिवाइस अनफ़ोल्ड किया गया"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
@@ -1457,7 +1453,7 @@
     <string name="shortcut_helper_category_current_app_shortcuts" msgid="4017840565974573628">"मौजूदा ऐप्लिकेशन"</string>
     <string name="shortcut_helper_category_a11y" msgid="6314444792641773464">"सुलभता"</string>
     <string name="shortcut_helper_title" msgid="8567500639300970049">"कीबोर्ड शॉर्टकट"</string>
-    <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"शॉर्टकट पसंद के मुताबिक बनाएं"</string>
+    <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"पसंद के मुताबिक शॉर्टकट बनाएं"</string>
     <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"क्या आपको शॉर्टकट हटाना है?"</string>
     <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"क्या आपको फिर से डिफ़ॉल्ट शॉर्टकट चालू करने हैं?"</string>
     <string name="shortcut_customize_mode_add_shortcut_description" msgid="7636040209946696120">"यह शॉर्टकट बनाने के लिए, ऐक्शन बटन और एक या उससे ज़्यादा अन्य बटन एक साथ दबाएं"</string>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index dd0a6c1..5222e80 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -804,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Prikazuje se pri vrhu obavijesti razgovora i kao profilna slika na zaključanom zaslonu, izgleda kao oblačić, prekida Ne uznemiravaj"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritetno"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ne podržava značajke razgovora"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Povratne informacije"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Odbaci"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Ne prikazuj ponovo"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Te se obavijesti ne mogu izmijeniti."</string>
@@ -1395,6 +1394,7 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Rasklopljen sklopivi uređaj"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Okretanje sklopivog uređaja sa svih strana"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Prednji zaslon je uključen"</string>
+    <string name="rear_display_unfolded_front_screen_on_slide_to_cancel" msgid="1455192420423012859">"Kliznite za upotrebu unutarnjeg zaslona"</string>
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"zatvoreno"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"otvoreno"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 56270b4..109c52f 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Az akkumulátor töltöttségi szintje ismeretlen."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Csatlakoztatva a következőhöz: <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Csatlakozva a következőhöz: <xliff:g id="CAST">%s</xliff:g>."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"Csoport kibontása."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"Alkalmazás megnyitása."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Nincs csatlakozva."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Ki"</string>
@@ -298,7 +296,7 @@
     <string name="accessibility_rotation_lock_on_landscape" msgid="936972553861524360">"A képernyő zárolva van fekvő tájolásban."</string>
     <string name="accessibility_rotation_lock_on_portrait" msgid="2356633398683813837">"A képernyő zárolva van álló tájolásban."</string>
     <string name="dessert_case" msgid="9104973640704357717">"Dessert Case"</string>
-    <string name="start_dreams" msgid="9131802557946276718">"Képernyővédő"</string>
+    <string name="start_dreams" msgid="9131802557946276718">"Képernyőkímélő"</string>
     <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
     <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Ne zavarjanak"</string>
     <string name="quick_settings_modes_label" msgid="879156359479504244">"Módok"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"A Hub mód felfedezése"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Töltés közben hozzáférhet kedvenc moduljaihoz és képernyőkímélőihez."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Kezdés"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Kedvenc képernyőkímélők megjelenítése töltés közben"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Felhasználóváltás"</string>
     <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"lehúzható menü"</string>
     <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"A munkamenetben található összes alkalmazás és adat törlődni fog."</string>
@@ -807,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"A beszélgetésekre vonatkozó értesítések tetején, lebegő buborékként látható, megjeleníti a profilképet a lezárási képernyőn, és megszakítja a Ne zavarjanak funkciót"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritás"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> nem támogatja a beszélgetési funkciókat"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Visszajelzés"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Elvetés"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Ne jelenjen meg újra"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Ezeket az értesítéseket nem lehet módosítani."</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Ujjlenyomat használata a megnyitáshoz"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Hitelesítés szükséges. Érintse meg az ujjlenyomat-érzékelőt a hitelesítéshez."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"Hívás folyamatban"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Folyamatban van"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobiladat"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Csatlakozva"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Ideiglenesen csatlakoztatva"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Összehajtható eszköz kihajtása"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Összehajtható eszköz körbeforgatása"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Előlapi képernyő bekapcsolva"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"összehajtva"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"kihajtva"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index bb92212..914d2cd 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Մարտկոցի լիցքի մակարդակն անհայտ է։"</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Միացված է <xliff:g id="BLUETOOTH">%s</xliff:g>-ին:"</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Միացված է <xliff:g id="CAST">%s</xliff:g>-ին:"</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"Ծավալել խումբը։"</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"Բացել հավելվածը։"</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Միացված չէ:"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Ռոումինգ"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Անջատված է"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Բացահայտեք հանգույցի ռեժիմը"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Օգտագործեք ձեր սիրած վիջեթները և էկրանապահները, մինչ ձեր սարքը լիցքավորվում է։"</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Սկսել"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Ցուցադրել էկրանապահներ լիցքավորման ժամանակ"</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>
@@ -807,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Կարծիք հայտնել"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Փակել"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Այլևս ցույց չտալ"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Այս ծանուցումները չեն կարող փոփոխվել:"</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Բացելու համար օգտագործեք մատնահետքը"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Պահանջվում է նույնականացում։ Դրա համար մատը հպեք մատնահետքի սկաներին։"</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"Ընթացիկ զանգ"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Հիմա"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"Բջջային ինտերնետ"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Միացած է"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Ժամանակավոր կապ"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Ծալովի սարք՝ բացված վիճակում"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Ծալովի սարք՝ շրջված վիճակում"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Առջևի էկրանը միացված է"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"ծալված"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"բացված"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 60f8ea7..62e3476 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Persentase baterai tidak diketahui."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Terhubung ke <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Terhubung ke <xliff:g id="CAST">%s</xliff:g>."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"Meluaskan grup."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"Membuka aplikasi."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Tidak terhubung."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Nonaktif"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Jelajahi mode hub"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Akses widget dan screensaver favorit Anda saat mengisi daya."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Mulai"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Tampilkan screensaver favorit saat mengisi daya"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Beralih pengguna"</string>
     <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menu pulldown"</string>
     <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Semua aplikasi dan data dalam sesi ini akan dihapus."</string>
@@ -807,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Masukan"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Tutup"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Jangan tampilkan lagi"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Notifikasi ini tidak dapat diubah."</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Gunakan sidik jari untuk membuka"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Perlu autentikasi. Sentuh sensor sidik jari untuk melakukan autentikasi."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"Panggilan sedang berlangsung"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Sedang berlangsung"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"Data seluler"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Terhubung"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Terhubung sementara"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Perangkat foldable sedang dibentangkan"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Perangkat foldable sedang dibalik"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Layar depan diaktifkan"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"ditutup"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"dibuka"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index 68e395b..4e486d0 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -804,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Birtist efst í samtalstilkynningum og sem prófílmynd á lásskjánum. Birtist sem blaðra sem truflar „Ónáðið ekki“"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Forgangur"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> styður ekki samtalseiginleika"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Ábendingar"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Loka"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Ekki sýna aftur"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Ekki er hægt að breyta þessum tilkynningum."</string>
@@ -1395,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Samanbrjótanlegt tæki opnað"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Samanbrjótanlegu tæki snúið við"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Kveikt á fremri skjá"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"samanbrotið"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"opið"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index c839a7b..786254b 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -408,8 +408,8 @@
     <string name="custom_trace_settings_dialog_title" msgid="2608570500144830554">"Impostazioni di traccia personalizzate"</string>
     <string name="restore_default" msgid="5259420807486239755">"Ripristina predefinite"</string>
     <string name="quick_settings_onehanded_label" msgid="2416537930246274991">"Modalità a una mano"</string>
-    <string name="quick_settings_hearing_devices_label" msgid="7277170419679404129">"Apparecchi acustici"</string>
-    <string name="quick_settings_hearing_devices_connected" msgid="6519069502397037781">"Attivi"</string>
+    <string name="quick_settings_hearing_devices_label" msgid="7277170419679404129">"Protesi uditive"</string>
+    <string name="quick_settings_hearing_devices_connected" msgid="6519069502397037781">"Attive"</string>
     <string name="quick_settings_hearing_devices_disconnected" msgid="8907061223998176187">"Disconnessi"</string>
     <string name="quick_settings_hearing_devices_dialog_title" msgid="9004774017688484981">"Protesi uditive"</string>
     <string name="quick_settings_pair_hearing_devices" msgid="5987105102207447322">"Accoppia nuovo dispositivo"</string>
@@ -804,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Appare in cima alle notifiche delle conversazioni, come immagine del profilo nella schermata di blocco e sotto forma di bolla, inoltre interrompe la modalità Non disturbare"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Priorità"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> non supporta le funzionalità delle conversazioni"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Feedback"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Ignora"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Non mostrare più"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Impossibile modificare queste notifiche."</string>
@@ -1395,6 +1394,7 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Dispositivo pieghevole che viene aperto"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Dispositivo pieghevole che viene capovolto"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Schermo frontale attivato"</string>
+    <string name="rear_display_unfolded_front_screen_on_slide_to_cancel" msgid="1455192420423012859">"Scorri per usare lo schermo interno"</string>
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"Piegato"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"Non piegato"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index fe5d6f3..5000885 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -114,7 +114,7 @@
     <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="4882406311415082016">"הקלטת המסך שמוצג עכשיו"</string>
     <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="4169494703993148253">"‏הקלטה של %s"</string>
     <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"כשמקליטים את כל המסך, כל מה שמופיע במסך מוקלט. מומלץ להיזהר עם סיסמאות, פרטי תשלום, הודעות, תמונות, אודיו וסרטונים."</string>
-    <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"כשמקליטים אפליקציה, כל מה שרואים או מפעילים בה מוקלט. מומלץ להיזהר עם סיסמאות, פרטי תשלום, הודעות, תמונות, אודיו וסרטונים."</string>
+    <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"כשמקליטים אפליקציה, כל מה שרואים או מפעילים בה מוקלט. מומלץ להיזהר ולא לחשוף פרטים אישיים כמו סיסמאות, פרטי תשלום, הודעות, תמונות, אודיו וסרטונים."</string>
     <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"הקלטת המסך"</string>
     <string name="screenrecord_app_selector_title" msgid="3854492366333954736">"בחירת אפליקציה להקלטה"</string>
     <string name="screenrecord_audio_label" msgid="6183558856175159629">"הקלטת אודיו"</string>
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"אחוז טעינת הסוללה לא ידוע."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"התבצע חיבור אל <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"מחובר אל <xliff:g id="CAST">%s</xliff:g>."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"הרחבת הקבוצה."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"פתיחת האפליקציה."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"אין חיבור."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"נדידה"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"כבוי"</string>
@@ -460,7 +458,7 @@
     <string name="zen_modes_dialog_title" msgid="8854640808100096934">"מצבים"</string>
     <string name="zen_modes_dialog_done" msgid="6654130880256438950">"סיום"</string>
     <string name="zen_modes_dialog_settings" msgid="2310248023728936697">"הגדרות"</string>
-    <string name="zen_mode_on" msgid="9085304934016242591">"מצב מופעל"</string>
+    <string name="zen_mode_on" msgid="9085304934016242591">"מצב פעיל"</string>
     <string name="zen_mode_on_with_details" msgid="7416143430557895497">"פועל • <xliff:g id="TRIGGER_DESCRIPTION">%1$s</xliff:g>"</string>
     <string name="zen_mode_off" msgid="1736604456618147306">"מצב מושבת"</string>
     <string name="zen_mode_set_up" msgid="8231201163894922821">"לא הוגדר"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"‏האפשרויות במצב Hub"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"אפשר לגשת לווידג\'טים ולשומרי המסך בזמן הטעינה."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"שנתחיל?"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"בחירת שומרי המסך שיוצגו בזמן הטעינה"</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>
@@ -573,10 +570,10 @@
     <!-- no translation found for media_projection_entry_app_permission_dialog_option_text_entire_screen (5100078808078139706) -->
     <skip />
     <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="5504288438067851086">"כשמשתפים את כל המסך, כל מה שמופיע בו יהיה גלוי ל-<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>. מומלץ להיזהר עם סיסמאות, פרטי תשלום, הודעות, תמונות, אודיו וסרטונים."</string>
-    <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="7094417930857938876">"כשמשתפים אפליקציה, כל מה שרואים או מפעילים בה יהיה גלוי ל-<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>. מומלץ להיזהר עם סיסמאות, פרטי תשלום, הודעות, תמונות, אודיו וסרטונים."</string>
+    <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="7094417930857938876">"כשמשתפים אפליקציה, כל מה שרואים או מפעילים בה מופיע גם ב-<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>. מומלץ להיזהר ולא לחשוף פרטים אישיים כמו סיסמאות, פרטי תשלום, הודעות, תמונות, אודיו וסרטונים."</string>
     <string name="media_projection_entry_app_permission_dialog_continue_entire_screen" msgid="1850848182344377579">"שיתוף המסך"</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_share_app_selector_title" msgid="1419515119767501822">"בחירת האפליקציה לשיתוף"</string>
+    <string name="media_projection_entry_share_app_selector_title" msgid="1419515119767501822">"בחירת אפליקציה לשיתוף"</string>
     <string name="media_projection_entry_cast_permission_dialog_title" msgid="752756942658159416">"‏להפעיל Cast של המסך?"</string>
     <string name="media_projection_entry_cast_permission_dialog_option_text_single_app" msgid="6073353940838561981">"‏הפעלת Cast של אפליקציה אחת"</string>
     <string name="media_projection_entry_cast_permission_dialog_option_text_entire_screen" msgid="8389508187954155307">"‏הפעלת Cast של כל המסך"</string>
@@ -593,7 +590,7 @@
     <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"שיתוף של האפליקציה הזו במקום"</string>
     <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"חזרה למשימה הקודמת"</string>
     <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"החלפת אפליקציה"</string>
-    <string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"‏האפשרות נחסמה על ידי אדמין ב-IT"</string>
+    <string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"‏האפשרות נחסמה על ידי אדמין ממחלקת IT"</string>
     <string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"צילום המסך מושבת בגלל מדיניות המכשיר"</string>
     <string name="clear_all_notifications_text" msgid="348312370303046130">"ניקוי הכול"</string>
     <string name="manage_notifications_text" msgid="6885645344647733116">"ניהול"</string>
@@ -936,7 +933,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">"‏חוסך הנתונים (Data Saver)"</string>
+    <string name="data_saver" msgid="3484013368530820763">"חוסך הנתונים"</string>
     <string name="accessibility_data_saver_on" msgid="5394743820189757731">"‏חוסך הנתונים (Data Saver) פועל"</string>
     <string name="switch_bar_on" msgid="1770868129120096114">"פועל"</string>
     <string name="switch_bar_off" msgid="5669805115416379556">"כבוי"</string>
@@ -1087,7 +1084,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>
@@ -1308,8 +1305,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"שימוש בטביעת אצבע כדי לפתוח"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"נדרש אימות. יש לגעת בחיישן טביעות האצבע כדי לבצע אימות."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"שיחה פעילה"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"בתהליך"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"חבילת גלישה"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"מחובר"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"מחובר באופן זמני"</string>
@@ -1399,6 +1395,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"מכשיר מתקפל עובר למצב לא מקופל"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"מכשיר מתקפל עובר למצב מהופך"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"המסך הקדמי מופעל"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"מצב מקופל"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"מצב לא מקופל"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"‏%1$s‏ / %2$s"</string>
@@ -1422,7 +1420,7 @@
     <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>
-    <string name="dismissible_keyguard_swipe" msgid="8377597870094949432">"מחליקים למעלה כדי להמשיך"</string>
+    <string name="dismissible_keyguard_swipe" msgid="8377597870094949432">"צריך להחליק למעלה כדי להמשיך"</string>
     <string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"לשקף למסך חיצוני?"</string>
     <string name="connected_display_dialog_dual_display_stop_warning" msgid="4174707498892447947">"המסך הפנימי שלך ישוכפל. המסך החיצוני שלך יכובה."</string>
     <string name="mirror_display" msgid="2515262008898122928">"תצוגת מראה"</string>
@@ -1460,7 +1458,7 @@
     <string name="shortcut_helper_customize_mode_title" msgid="8327297960035006036">"התאמה אישית של מקשי הקיצור"</string>
     <string name="shortcut_customize_mode_remove_shortcut_dialog_title" msgid="7106420484940737208">"להסיר את קיצור הדרך?"</string>
     <string name="shortcut_customize_mode_reset_shortcut_dialog_title" msgid="8131184731313717780">"לאפס לברירת המחדל?"</string>
-    <string name="shortcut_customize_mode_add_shortcut_description" msgid="7636040209946696120">"כדי ליצור את קיצור הדרך הזה, מקישים על מקש הפעולה ועל עוד מקש אחד או יותר ביחד"</string>
+    <string name="shortcut_customize_mode_add_shortcut_description" msgid="7636040209946696120">"כדי לבחור את צירוף המקשים הרצוי, מקישים בו-זמנית על מקש הפעולה ועל עוד מקש אחד או יותר"</string>
     <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"קיצור הדרך יימחק לתמיד."</string>
     <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"הפעולה הזו תמחק לתמיד את כל קיצורי הדרך שמותאמים אישית."</string>
     <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"חיפוש מקשי קיצור"</string>
@@ -1477,7 +1475,7 @@
     <string name="shortcut_helper_key_combinations_forward_slash" msgid="1238652537199346970">"קו נטוי"</string>
     <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"נקודת האחיזה לגרירה"</string>
     <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"הגדרות המקלדת"</string>
-    <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"הגדרת מקש קיצור"</string>
+    <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"הגדרת מקשי הקיצור"</string>
     <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"הסרה"</string>
     <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"כן, לאפס"</string>
     <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"ביטול"</string>
diff --git a/packages/SystemUI/res/values-iw/tiles_states_strings.xml b/packages/SystemUI/res/values-iw/tiles_states_strings.xml
index d6b9bc8..1a5b8fb 100644
--- a/packages/SystemUI/res/values-iw/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-iw/tiles_states_strings.xml
@@ -194,6 +194,6 @@
   <string-array name="tile_states_notes">
     <item msgid="5894333929299989301">"לא זמין"</item>
     <item msgid="6419996398343291862">"מושבת"</item>
-    <item msgid="5908720590832378783">"מופעל"</item>
+    <item msgid="5908720590832378783">"מצב פעיל"</item>
   </string-array>
 </resources>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 810fef9c..fd98fe8 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -113,8 +113,8 @@
     <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"1 つのアプリを録画"</string>
     <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="4882406311415082016">"この画面の録画"</string>
     <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="4169494703993148253">"%s の録画"</string>
-    <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"画面全体を録画すると、画面に表示されるものがすべて録画されます。パスワード、お支払いの詳細、メッセージ、写真、音声、動画などの情報にご注意ください。"</string>
-    <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"アプリを録画すると、そのアプリで表示または再生される内容がすべて録画されます。パスワード、お支払いの詳細、メッセージ、写真、音声、動画などの情報にご注意ください。"</string>
+    <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"画面全体を録画すると、画面に表示されるものがすべて録画されます。パスワード、お支払い情報、メッセージ、写真、音声、動画などの情報にご注意ください。"</string>
+    <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"アプリを録画すると、そのアプリで表示または実行される内容がすべて録画されます。パスワード、お支払い情報、メッセージ、写真、音声、動画などの情報にご注意ください。"</string>
     <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"画面を録画"</string>
     <string name="screenrecord_app_selector_title" msgid="3854492366333954736">"録画するアプリを選択"</string>
     <string name="screenrecord_audio_label" msgid="6183558856175159629">"録音"</string>
@@ -558,9 +558,9 @@
     <string name="user_remove_user_message" msgid="6702834122128031833">"このユーザーのアプリとデータがすべて削除されます。"</string>
     <string name="user_remove_user_remove" msgid="8387386066949061256">"削除"</string>
     <string name="media_projection_dialog_title" msgid="3316063622495360646">"<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> は、録画中またはキャスト中に画面上に表示または再生される情報のすべてにアクセスできるようになります。これには、パスワード、お支払いの詳細、写真、メッセージ、音声などが含まれます。"</string>
+    <string name="media_projection_dialog_warning" msgid="1303664408388363598">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> は、録画中またはキャスト中に画面上に表示または再生される情報のすべてにアクセスできるようになります。これには、パスワード、お支払い情報、写真、メッセージ、音声などが含まれます。"</string>
     <string name="media_projection_sys_service_dialog_title" msgid="3751133258891897878">"録画やキャストを開始しますか?"</string>
-    <string name="media_projection_sys_service_dialog_warning" msgid="2443872865267330320">"この機能を提供するサービスは、録画中またはキャスト中に画面上に表示または再生される情報のすべてにアクセスできるようになります。これには、パスワード、お支払いの詳細、写真、メッセージ、音声などが含まれます。"</string>
+    <string name="media_projection_sys_service_dialog_warning" msgid="2443872865267330320">"この機能を提供するサービスは、録画中またはキャスト中に画面上に表示または再生される情報のすべてにアクセスできるようになります。これには、パスワード、お支払い情報、写真、メッセージ、音声などが含まれます。"</string>
     <string name="screen_share_generic_app_selector_title" msgid="8331515850599218288">"アプリの共有または録画"</string>
     <string name="media_projection_entry_app_permission_dialog_title" msgid="4613857256721708062">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> と画面を共有しますか?"</string>
     <string name="screen_share_permission_dialog_option_single_app" msgid="2974054871681567314">"1 個のアプリを共有"</string>
@@ -569,21 +569,21 @@
     <string name="screen_share_permission_dialog_option_entire_screen" msgid="4493174362775038997">"画面全体を共有"</string>
     <!-- no translation found for media_projection_entry_app_permission_dialog_option_text_entire_screen (5100078808078139706) -->
     <skip />
-    <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="5504288438067851086">"画面全体を共有すると、画面に表示される内容が <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> にすべて公開されます。パスワード、お支払いの詳細、メッセージ、写真、音声、動画などの情報にご注意ください。"</string>
-    <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="7094417930857938876">"アプリを共有すると、そのアプリで表示または再生される内容が <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> にすべて公開されます。パスワード、お支払いの詳細、メッセージ、写真、音声、動画などの情報にご注意ください。"</string>
+    <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="5504288438067851086">"画面全体を共有すると、画面に表示される内容が <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> にすべて公開されます。パスワード、お支払い情報、メッセージ、写真、音声、動画などの情報にご注意ください。"</string>
+    <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="7094417930857938876">"アプリを共有すると、そのアプリで表示または再生される内容が <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> にすべて公開されます。パスワード、お支払い情報、メッセージ、写真、音声、動画などの情報にご注意ください。"</string>
     <string name="media_projection_entry_app_permission_dialog_continue_entire_screen" msgid="1850848182344377579">"画面を共有"</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_share_app_selector_title" msgid="1419515119767501822">"共有するアプリを選択"</string>
     <string name="media_projection_entry_cast_permission_dialog_title" msgid="752756942658159416">"画面をキャストしますか?"</string>
     <string name="media_projection_entry_cast_permission_dialog_option_text_single_app" msgid="6073353940838561981">"1 つのアプリをキャスト"</string>
     <string name="media_projection_entry_cast_permission_dialog_option_text_entire_screen" msgid="8389508187954155307">"画面全体をキャスト"</string>
-    <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="4040447861037324017">"画面全体をキャストすると、画面に表示される内容がすべて公開されます。パスワード、お支払いの詳細、メッセージ、写真、音声、動画などの情報にご注意ください。"</string>
-    <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="7487834861348460736">"アプリをキャストすると、そのアプリで表示または再生される内容がすべて公開されます。パスワード、お支払いの詳細、メッセージ、写真、音声、動画などの情報にご注意ください。"</string>
+    <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="4040447861037324017">"画面全体をキャストすると、画面に表示される内容がすべて公開されます。パスワード、お支払い情報、メッセージ、写真、音声、動画などの情報にご注意ください。"</string>
+    <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="7487834861348460736">"アプリをキャストすると、そのアプリで表示または再生される内容がすべて公開されます。パスワード、お支払い情報、メッセージ、写真、音声、動画などの情報にご注意ください。"</string>
     <string name="media_projection_entry_cast_permission_dialog_continue_entire_screen" msgid="3261124185304676483">"画面のキャスト"</string>
     <string name="media_projection_entry_cast_app_selector_title" msgid="6323062146661922387">"キャストするアプリを選択"</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_entry_generic_permission_dialog_continue_single_app" msgid="5920814988611877051">"次へ"</string>
     <string name="media_projection_task_switcher_text" msgid="590885489897412359">"アプリを切り替えるときに共有を一時停止します"</string>
@@ -804,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"フィードバック"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"閉じる"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"次回から表示しない"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"これらの通知は変更できません。"</string>
@@ -1395,6 +1394,7 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"折りたたみ式デバイスが広げられている"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"折りたたみ式デバイスがひっくり返されている"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"フロント画面が ON になりました"</string>
+    <string name="rear_display_unfolded_front_screen_on_slide_to_cancel" msgid="1455192420423012859">"インナー ディスプレイを使用するにはスライドしてください"</string>
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"折りたたんだ状態"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"広げた状態"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index a8fd410..18522da 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"ბატარეის პროცენტული მაჩვენებელი უცნობია."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"დაკავშირებულია <xliff:g id="BLUETOOTH">%s</xliff:g>-თან."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"დაკავშირებულია მოწყობილობასთან: <xliff:g id="CAST">%s</xliff:g>."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"ჯგუფის გაფართოება."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"აპლიკაციის გახსნა."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"არ არის დაკავშირებული."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"როუმინგი"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"გამორთული"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"ჰაბის რეჟიმის დათვალიერება"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"დატენის დროს შეგიძლიათ თქვენს რჩეულ ვიჯეტებზე და ეკრანმზოგებზე წვდომა."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"დავიწყოთ"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"დატენვისას თქვენი საყვარელი ეკრანმზოგის ჩვენება"</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>
@@ -807,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"გამოხმაურება"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"დახურვა"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"აღარ მაჩვენო"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"ამ შეტყობინებების შეცვლა შეუძლებელია."</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"გასახსნელად გამოიყენეთ თითის ანაბეჭდი"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"საჭიროა ავტორიზაცია. ავტორიზაციისთვის შეეხეთ თითის ანაბეჭდის სენსორს."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"მიმდინარე ზარი"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"მიმდინარე"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"მობილური ინტერნეტი"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"დაკავშირებული"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"დროებით დაკავშირებული"</string>
@@ -1399,6 +1394,7 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"დასაკეცი მოწყობილობა იხსნება"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"დასაკეცი მოწყობილობა ტრიალებს"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"წინა ეკრანი ჩართულია"</string>
+    <string name="rear_display_unfolded_front_screen_on_slide_to_cancel" msgid="1455192420423012859">"გაასრიალეთ შიდა ეკრანის გამოსაყენებლად"</string>
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"დაკეცილი"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"გაშლილი"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index 16569fe..83af7c8 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Батарея зарядының мөлшері белгісіз."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> қосылған."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> трансляциясына қосылды."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"Топты жайыңыз."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"Қолданбаны ашыңыз."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Жалғанбаған."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Роуминг"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Өшірулі"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Хаб режимін шолу"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Зарядтау кезінде өзіңіз ұнататын виджеттер мен скринсейверлерді пайдаланыңыз."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Бастайық"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Құрылғыны зарядтау кезінде таңдаулы скринсейверлерді көрсетуге болады."</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>
@@ -593,7 +590,7 @@
     <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Орнына осы қолданбаны бөлісу"</string>
     <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Қайта ауысу"</string>
     <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Қолданба ауыстыру"</string>
-    <string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Әкімшіңіз бөгеген"</string>
+    <string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Әкімшіңіз блоктаған"</string>
     <string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Құрылғы саясатына байланысты экранды түсіру өшірілді."</string>
     <string name="clear_all_notifications_text" msgid="348312370303046130">"Барлығын тазарту"</string>
     <string name="manage_notifications_text" msgid="6885645344647733116">"Басқару"</string>
@@ -807,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Пікір"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Жабу"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Қайта көрсетілмесін"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Бұл хабарландыруларды өзгерту мүмкін емес."</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Ашу үшін саусақ ізін пайдаланыңыз."</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Аутентификациядан өту қажет. Ол үшін саусақ ізін оқу сканерін түртіңіз."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"Ағымдағы қоңырау"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Ағымдағы"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"Мобильдік интернет"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Жалғанды"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Уақытша байланыс орнатылды."</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Бүктемелі құрылғы ашылып жатыр."</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Бүктемелі құрылғы аударылып жатыр."</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Алдыңғы экран қосылды."</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"жабық"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"ашық"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index 1cf437c..569ecd3 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -804,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"មតិកែលម្អ"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"ច្រានចោល"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"កុំបង្ហាញម្ដងទៀត"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"មិនអាច​កែប្រែ​ការជូនដំណឹង​ទាំងនេះ​បានទេ។"</string>
@@ -1395,6 +1394,7 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"ឧបករណ៍អាច​បត់បានកំពុងត្រូវបានលា"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"ឧបករណ៍អាច​បត់បានកំពុងត្រូវបានលា"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"បានបើកអេក្រង់ខាងមុខ"</string>
+    <string name="rear_display_unfolded_front_screen_on_slide_to_cancel" msgid="1455192420423012859">"រំកិលដើម្បីប្រើអេក្រង់ខាងក្នុង"</string>
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"បត់"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"លា"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index 5cfb42c..5bcd986 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -804,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"ಫೀಡ್‌ಬ್ಯಾಕ್"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"ವಜಾಗೊಳಿಸಿ"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"ಮತ್ತೊಮ್ಮೆ ತೋರಿಸಬೇಡಿ"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"ಈ ಅಧಿಸೂಚನೆಗಳನ್ನು ಮಾರ್ಪಡಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string>
@@ -1395,6 +1394,7 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"ಫೋಲ್ಡ್ ಮಾಡಬಹುದಾದ ಸಾಧನವನ್ನು ಅನ್‌ಫೋಲ್ಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"ಫೋಲ್ಡ್ ಮಾಡಬಹುದಾದ ಸಾಧನವನ್ನು ಸುತ್ತಲೂ ತಿರುಗಿಸಲಾಗುತ್ತಿದೆ"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"ಫ್ರಂಟ್ ಸ್ಕ್ರೀನ್ ಆನ್ ಆಗಿದೆ"</string>
+    <string name="rear_display_unfolded_front_screen_on_slide_to_cancel" msgid="1455192420423012859">"ಒಳಗಿನ ಸ್ಕ್ರೀನ್ ಬಳಸಲು ಸ್ಲೈಡ್ ಮಾಡಿ"</string>
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"ಫೋಲ್ಡ್ ಮಾಡಿರುವುದು"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"ಅನ್‌ಫೋಲ್ಡ್ ಮಾಡಿರುವುದು"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 78f87a2..fd2c62e 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"배터리 잔량을 알 수 없습니다."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g>에 연결되었습니다."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g>에 연결됨"</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"그룹을 펼칩니다."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"애플리케이션을 엽니다."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"연결되지 않았습니다."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"로밍"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"사용 안함"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"허브 모드 살펴보기"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"충전하는 동안 즐겨 찾는 위젯과 화면 보호기에 액세스하세요."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"시작"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"충전 중에 즐겨찾는 화면 보호기 표시"</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>
@@ -807,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"의견"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"닫기"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"다시 표시하지 않음"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"이 알림은 수정할 수 없습니다."</string>
@@ -1143,7 +1139,7 @@
     <string name="accessibility_floating_button_action_remove_menu" msgid="6730432848162552135">"삭제"</string>
     <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"전환"</string>
     <string name="accessibility_floating_button_action_edit" msgid="1688227814600463987">"수정"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"기기 컨트롤"</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"기기 제어"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"컨트롤을 추가할 앱을 선택하세요"</string>
     <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{설정이 #개 추가되었습니다.}other{설정이 #개 추가되었습니다.}}"</string>
     <string name="controls_removed" msgid="3731789252222856959">"삭제됨"</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"지문으로 열기"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"인증이 필요합니다. 지문 센서를 터치하여 인증하세요."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"진행 중인 통화"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"진행 중"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"모바일 데이터"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"연결됨"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"일시적으로 연결됨"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"폴더블 기기를 펼치는 모습"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"폴더블 기기를 뒤집는 모습"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"전면 화면 켜짐"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"접은 상태"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"펼친 상태"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index bdbbf04..1916cbc 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Батареянын деңгээли белгисиз."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> менен туташкан."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> менен туташты."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"Топту жайып көрсөтүү."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"Колдонмону ачуу."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Интернет жок."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Роуминг"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Өчүк"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Түйүн режимин колдонуп көрүңүз"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Кубатталып жатканда жактырган виджеттериңизди жана көшөгөлөрдү колдонуңуз."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Кеттик!"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Кубаттап жатканда жактырган көшөгөлөрдү көрсөтүңүз"</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>
@@ -807,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Cүйлөшүүлөр тууралуу билдирмелердин жогору жагында жана кулпуланган экранда профилдин сүрөтү, ошондой эле калкып чыкма билдирме түрүндө көрүнүп, \"Тынчымды алба\" режимин токтотот"</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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Пикир билдирүү"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Жабуу"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Экинчи көрсөтүлбөсүн"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Бул билдирмелерди өзгөртүүгө болбойт."</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Манжаңыздын изи менен ачыңыз"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Аныктыкты текшерүү талап кылынат. Аныктыгын текшерүү үчүн манжа изинин сенсоруна тийип коюңуз."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"Учурдагы чалуу"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Учурдагы"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"Мобилдик трафик"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Туташты"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Убактылуу туташып турат"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Ачылып турган бүктөлмө түзмөк"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Оодарылып жаткан бүктөлмө түзмөк"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Маңдайкы экран күйгүзүлдү"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"бүктөлгөн"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"ачылган"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index 1acb34a..f61186d 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"ບໍ່ຮູ້ເປີເຊັນແບັດເຕີຣີ."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"ເຊື່ອມ​ຕໍ່​ຫາ <xliff:g id="BLUETOOTH">%s</xliff:g> ແລ້ວ."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"ເຊື່ອມຕໍ່ຫາ <xliff:g id="CAST">%s</xliff:g> ແລ້ວ."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"ຂະຫຍາຍກຸ່ມ."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"ເປີດແອັບພລິເຄຊັນ."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"ບໍ່ໄດ້ເຊື່ອມຕໍ່."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"ໂຣມມິງ"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"ປິດ"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"ສຳຫຼວດໂໝດ Hub"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"ເຂົ້າເຖິງວິດເຈັດ ແລະ ພາບພັກໜ້າຈໍທີ່ທ່ານມັກໃນລະຫວ່າງທີ່ສາກ."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"ມາເລີ່ມກັນເລີຍ"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"ສະແດງພາບພັກໜ້າຈໍທີ່ທ່ານມັກໃນລະຫວ່າງທີ່ສາກ"</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>
@@ -807,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"ຄຳຕິຊົມ"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"ປິດໄວ້"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"ບໍ່ຕ້ອງສະແດງອີກ"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"ບໍ່ສາມາດແກ້ໄຂການແຈ້ງເຕືອນເຫຼົ່ານີ້ໄດ້."</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"ໃຊ້ລາຍນິ້ວມືເພື່ອເປີດ"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"ຕ້ອງພິສູດຢືນຢັນ. ແຕະໃສ່ເຊັນເຊີລາຍນິ້ວມືເພື່ອພິສູດຢືນຢັນ."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"ສາຍທີ່ສົນທະນາຢູ່"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"ດຳເນີນຢູ່"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"ອິນເຕີເນັດມືຖື"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"ເຊື່ອມຕໍ່ແລ້ວ"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"ເຊື່ອມຕໍ່ແລ້ວຊົ່ວຄາວ"</string>
@@ -1399,6 +1394,7 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"ອຸປະກອນທີ່ພັບໄດ້ກຳລັງກາງອອກ"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"ອຸປະກອນທີ່ພັກໄດ້ກຳລັງປີ້ນໄປມາ"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"ເປີດໜ້າຈໍດ້ານໜ້າແລ້ວ"</string>
+    <string name="rear_display_unfolded_front_screen_on_slide_to_cancel" msgid="1455192420423012859">"ເລື່ອນເພື່ອໃຊ້ໜ້າຈໍດ້ານໃນ"</string>
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"ພັບແລ້ວ"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"ກາງອອກແລ້ວ"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index dc182c7..88f9399 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -142,7 +142,7 @@
     <string name="share_to_app_stop_dialog_title_generic" msgid="9079161538135843648">"Nebebendrinti?"</string>
     <string name="share_to_app_stop_dialog_message_entire_screen_with_host_app" msgid="522823522115375414">"Šiuo metu bendrinate visą ekraną su šia programa: <xliff:g id="HOST_APP_NAME">%1$s</xliff:g>"</string>
     <string name="share_to_app_stop_dialog_message_entire_screen" msgid="5090115386271179270">"Šiuo metu bendrinate visą ekraną su programa"</string>
-    <string name="share_to_app_stop_dialog_message_single_app_specific" msgid="5923772039347985172">"Šiuo metu bendrinate šią programą: <xliff:g id="APP_BEING_SHARED_NAME">%1$s</xliff:g>"</string>
+    <string name="share_to_app_stop_dialog_message_single_app_specific" msgid="5923772039347985172">"Šiuo metu bendrinate programą „<xliff:g id="APP_BEING_SHARED_NAME">%1$s</xliff:g>“"</string>
     <string name="share_to_app_stop_dialog_message_single_app_generic" msgid="6681016774654578261">"Šiuo metu bendrinate programą"</string>
     <string name="share_to_app_stop_dialog_message_generic" msgid="7622174291691249392">"Šiuo metu bendrinate su programa"</string>
     <string name="share_to_app_stop_dialog_button" msgid="6334056916284230217">"Nebebendrinti"</string>
@@ -804,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Rodoma pokalbių pranešimų viršuje ir kaip profilio nuotrauka užrakinimo ekrane, burbule, pertraukia netrukdymo režimą"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritetiniai"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"Programa „<xliff:g id="APP_NAME">%1$s</xliff:g>“ nepalaiko pokalbių funkcijų"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Atsiliepimai"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Uždaryti"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Neberodyti"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Šių pranešimų keisti negalima."</string>
@@ -1323,7 +1322,7 @@
     <string name="see_all_networks" msgid="3773666844913168122">"Žiūrėti viską"</string>
     <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Norėdami perjungti tinklus, atjunkite eternetą"</string>
     <string name="wifi_scan_notify_message" msgid="3753839537448621794">"Kad pagerintų įrenginio funkcijas, programos ir paslaugos vis tiek gali bet kada nuskaityti ieškodamos „Wi‑Fi“ tinklų, net jei „Wi‑Fi“ išjungtas. Tai galite pakeisti „Wi-Fi“ nuskaitymo nustatymuose. "<annotation id="link">"Pakeisti"</annotation></string>
-    <string name="turn_off_airplane_mode" msgid="8425587763226548579">"Išjungti lėktuvo režimą"</string>
+    <string name="turn_off_airplane_mode" msgid="8425587763226548579">"Išj. lėk. rež."</string>
     <string name="qs_tile_request_dialog_text" msgid="3501359944139877694">"„<xliff:g id="APPNAME">%1$s</xliff:g>“ nori prie sparčiųjų nustatymų pridėti toliau pateiktą išklotinės elementą"</string>
     <string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Pridėti išklotinės elementą"</string>
     <string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Nepridėti išklotinės elemento"</string>
@@ -1395,6 +1394,7 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Lankstomasis įrenginys išlankstomas"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Lankstomasis įrenginys apverčiamas"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Priekinis ekranas įjungtas"</string>
+    <string name="rear_display_unfolded_front_screen_on_slide_to_cancel" msgid="1455192420423012859">"Slinkite, kad naudotumėte vidinį ekraną"</string>
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"sulenkta"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"nesulenkta"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
@@ -1486,7 +1486,7 @@
     <string name="launch_keyboard_tutorial_notification_title" msgid="8849933155160522519">"Naršykite naudodamiesi klaviatūra"</string>
     <string name="launch_keyboard_tutorial_notification_content" msgid="2880339951512757918">"Sužinokite apie sparčiuosius klavišus"</string>
     <string name="launch_touchpad_tutorial_notification_title" msgid="2243780062772196901">"Naršykite naudodamiesi jutikline dalimi"</string>
-    <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Sužinokite jutiklinės dalies gestus"</string>
+    <string name="launch_touchpad_tutorial_notification_content" msgid="7931085031240753226">"Peržvelkite jutiklinės dalies gestus"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_title" msgid="1940023776496198762">"Naršykite naudodamiesi klaviatūra ir jutikline dalimi"</string>
     <string name="launch_keyboard_touchpad_tutorial_notification_content" msgid="1780725168171929365">"Sužinokite jutiklinės dalies gestus, sparčiuosius klavišus ir kt."</string>
     <string name="touchpad_tutorial_back_gesture_button" msgid="3104716365403620315">"Grįžti"</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 5d7d87a..e0e38a1 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Akumulatora uzlādes līmenis procentos nav zināms."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Ir izveidots savienojum ar <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Savienots ar ierīci <xliff:g id="CAST">%s</xliff:g>."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"Izvērst grupu."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"Atvērt lietojumprogrammu."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Savienojums nav izveidots."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Viesabonēšana"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Izslēgti"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Izpētiet centra režīmu"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Piekļūstiet iecienītajiem logrīkiem un ekrānsaudzētājiem uzlādes laikā."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Aiziet!"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Uzlādes laikā rādīt izlases ekrānsaudzētājus"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Mainīt lietotāju"</string>
     <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"novelkamā izvēlne"</string>
     <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Tiks dzēstas visas šīs sesijas lietotnes un dati."</string>
@@ -807,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Parādās sarunu paziņojumu augšdaļā un kā profila attēls bloķēšanas ekrānā, arī kā burbulis, pārtrauc režīmu “Netraucēt”."</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritārs"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"Lietotnē <xliff:g id="APP_NAME">%1$s</xliff:g> netiek atbalstītas sarunu funkcijas."</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Atsauksmes"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Nerādīt"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Vairs nerādīt"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Šos paziņojumus nevar modificēt."</string>
@@ -966,7 +962,7 @@
     <string name="right_keycode" msgid="2480715509844798438">"Taustiņu kods labajā pusē"</string>
     <string name="left_icon" msgid="5036278531966897006">"Ikona kreisajā pusē"</string>
     <string name="right_icon" msgid="1103955040645237425">"Ikona labajā pusē"</string>
-    <string name="drag_to_add_tiles" msgid="8933270127508303672">"Lai pievienotu elementus, pieturiet tos un velciet"</string>
+    <string name="drag_to_add_tiles" msgid="8933270127508303672">"Lai pievienotu elementus, turiet un velciet tos"</string>
     <string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"Lai pārkārtotu elementus, turiet un velciet tos"</string>
     <string name="drag_to_remove_tiles" msgid="4682194717573850385">"Lai noņemtu vienumus, velciet tos šeit."</string>
     <string name="drag_to_remove_disabled" msgid="933046987838658850">"Nepieciešami vismaz <xliff:g id="MIN_NUM_TILES">%1$d</xliff:g> elementi"</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Atvēršanai izmantojiet pirksta nospiedumu"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Nepieciešama autentifikācija. Pieskarieties pirksta nospieduma sensoram, lai veiktu autentificēšanu."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"Notiekošs zvans"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Aktīva darbība"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobilie dati"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Ir izveidots savienojums"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Īslaicīgi izveidots savienojums"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Salokāma ierīce tiek atlocīta"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Salokāma ierīce tiek apgriezta"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Priekšējais ekrāns ir ieslēgts"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"aizvērta"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"atvērta"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index 22b5ff4..0a9ca89 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Процентот на батеријата е непознат."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Поврзано со <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Поврзано со <xliff:g id="CAST">%s</xliff:g>."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"Проширете ја групата."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"Отворете ја апликацијата."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Не е поврзана"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Роаминг"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Исклучено"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Истражете го режимот Hub"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Пристапувајте до омилените виџети и штедачи на екран при полнење."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Ајде"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Прикажувајте ги омилените штедачи на екран при полнење"</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>
@@ -807,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Повратни информации"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Отфрли"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Не прикажувај повторно"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Овие известувања не може да се изменат"</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Користете отпечаток за да се отвори"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Потребна е проверка. Допрете го сензорот за отпечаток за да автентицирате."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"Тековен повик"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Во тек"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"Мобилен интернет"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Поврзано"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Привремено поврзано"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Преклопувачки уред се отклопува"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Преклопувачки уред се врти"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Предниот екран е вклучен"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"затворен"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"отворен"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index 753b325..8ef9b79 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -804,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"ഫീഡ്ബാക്ക്"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"ഡിസ്‌മിസ് ചെയ്യുക"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"വീണ്ടും കാണിക്കരുത്"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"ഈ അറിയിപ്പുകൾ പരിഷ്ക്കരിക്കാനാവില്ല."</string>
@@ -1395,6 +1394,7 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"ഫോൾഡ് ചെയ്യാവുന്ന ഉപകരണം അൺഫോൾഡ് ആകുന്നു"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"ഫോൾഡ് ചെയ്യാവുന്ന ഉപകരണം, കറങ്ങുന്ന വിധത്തിൽ ഫ്ലിപ്പ് ആകുന്നു"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"ഫ്രണ്ട് സ്ക്രീൻ ഓണാക്കി"</string>
+    <string name="rear_display_unfolded_front_screen_on_slide_to_cancel" msgid="1455192420423012859">"ഉള്ളിലുള്ള സ്‌ക്രീൻ ഉപയോഗിക്കുന്നതിന് സ്ലൈഡുചെയ്യുക"</string>
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"ഫോൾഡ് ചെയ്തത്"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"അൺഫോൾഡ് ചെയ്തത്"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index 9ef7ebd..feca241 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Батарейн хувь тодорхойгүй байна."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g>-тай холбогдсон."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g>-д холбогдсон."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"Бүлгийг дэлгэнэ үү."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"Аппликейшныг нээнэ үү."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Холбогдоогүй."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Роуминг"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Идэвхгүй"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Hub горимыг судлах"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Цэнэглэж байхад дуртай виджет, дэлгэц амраагчдаа хандана уу."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"За эхэлцгээе"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Цэнэглэж байхдаа дуртай дэлгэц амраагчаа харуулна уу"</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>
@@ -807,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Санал хүсэлт"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Хаах"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Дахиж бүү харуул"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Эдгээр мэдэгдлийг өөрчлөх боломжгүй."</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Нээхийн тулд хурууны хээг ашиглана уу"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Баталгаажуулалт шаардлагатай. Баталгаажуулахын тулд хурууны хээ мэдрэгчид хүрнэ үү."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"Үргэлжилж буй дуудлага"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Үргэлжилж байгаа"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"Мобайл дата"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Холбогдсон"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Түр зуур холбогдсон"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Эвхэгддэг төхөөрөмжийг дэлгэж байна"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Эвхэгддэг төхөөрөмжийг хөнтөрч байна"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Нүүрэн талын дэлгэцийг асаасан"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"эвхсэн"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"дэлгэсэн"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index 1327a48..a3c45f3 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"बॅटरीच्या चार्जिंगची टक्केवारी माहित नाही."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> शी कनेक्‍ट केले."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> शी कनेक्ट केले."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"गटाचा विस्तार करा."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"अ‍ॅप उघडा."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"कनेक्ट केले नाही."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"रोमिंग"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"बंद"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"हब मोड एक्सप्लोर करा"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"चार्ज करत असताना तुमचे आवडते विजेट आणि स्क्रीन सेव्हर अ‍ॅक्सेस करा."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"चला सुरू करू या"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"चार्ज करत असताना तुमचे आवडते स्क्रीनसेव्हर दाखवा"</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>
@@ -807,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"फीडबॅक"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"डिसमिस करा"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"पुन्हा दाखवू नका"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"या सूचनांमध्ये सुधारणा केली जाऊ शकत नाही."</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"उघडण्यासाठी फिंगरप्रिंट वापरा"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"ऑथेंटिकेशन आवश्यक आहे. ऑथेंटिकेट करण्यासाठी फिंगरप्रिंट सेन्सरला स्पर्श करा."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"सुरू असलेला कॉल"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"सुरू असलेले"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"मोबाइल डेटा"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"कनेक्ट केले आहे"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"तात्पुरते कनेक्ट केलेले"</string>
@@ -1399,6 +1394,7 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"फोल्ड करता येण्यासारखे डिव्हाइस अनफोल्ड केले जात आहे"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"फोल्ड करता येण्यासारखे डिव्हाइस आजूबाजूला फ्लिप केले जात आहे"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"पुढील स्क्रीन सुरू केलेली आहे"</string>
+    <string name="rear_display_unfolded_front_screen_on_slide_to_cancel" msgid="1455192420423012859">"आतील स्क्रीन वापरण्यासाठी स्लाइड करा"</string>
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"फोल्ड केलेले"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"फोल्ड न केलेले"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index 9190114..bb7dcb8 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -570,7 +570,7 @@
     <!-- no translation found for media_projection_entry_app_permission_dialog_option_text_entire_screen (5100078808078139706) -->
     <skip />
     <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="5504288438067851086">"Apabila anda berkongsi seluruh skrin anda, apa-apa sahaja kandungan pada skrin anda boleh dilihat oleh <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>. 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_app_permission_dialog_warning_single_app" msgid="7094417930857938876">"Apabila anda berkongsi apl, apa-apa sahaja kandungan yang dipaparkan atau dimainkan pada apl boleh dilihat oleh <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>. 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_app_permission_dialog_warning_single_app" msgid="7094417930857938876">"Apabila anda berkongsi apl, apa-apa sahaja kandungan yang dipaparkan atau dimainkan dalam apl tersebut boleh dilihat oleh <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>. 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_app_permission_dialog_continue_entire_screen" msgid="1850848182344377579">"Kongsi skrin"</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_share_app_selector_title" msgid="1419515119767501822">"Pilih apl untuk dikongsi"</string>
@@ -804,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Ditunjukkan di bahagian atas pemberitahuan perbualan dan sebagai gambar profil pada skrin kunci, muncul sebagai gelembung, mengganggu Jangan Ganggu"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Keutamaan"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak menyokong ciri perbualan"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Maklum balas"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Ketepikan"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Jangan tunjukkan lagi"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Pemberitahuan ini tidak boleh diubah suai."</string>
@@ -1395,6 +1394,7 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Peranti boleh lipat dibuka"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Peranti boleh lipat diterbalikkan"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Skrin hadapan dihidupkan"</string>
+    <string name="rear_display_unfolded_front_screen_on_slide_to_cancel" msgid="1455192420423012859">"Luncurkan bar untuk menggunakan skrin dalaman"</string>
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"terlipat"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"tidak terlipat"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index 43f545d..0219f69 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"ဘက်ထရီရာခိုင်နှုန်းကို မသိပါ။"</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g>သို့ ချိတ်ဆက်ထား"</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> သို့ချိတ်ဆက်ထားပါသည်။"</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"အုပ်စုကို ပိုပြသည်။"</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"အပလီကေးရှင်းကို ဖွင့်သည်။"</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"ချိတ်ဆက်မထားပါ"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"ပြင်ပကွန်ရက်သုံးခြင်း"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"ပိတ်"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"ထိန်းချုပ်စင်တာမုဒ် လေ့လာခြင်း"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"အားသွင်းနေစဉ် အကြိုက်ဆုံးဝိဂျက်များ၊ စခရင်နားချိန်ပုံများ ကြည့်နိုင်သည်။"</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"စကြစို့"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"အားသွင်းနေစဉ် သင့်အကြိုက်ဆုံး စခရင်နားချိန်ပုံများကို ပြသည်"</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>
@@ -807,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"အကြံပြုချက်"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"ပယ်ရန်"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"ထပ်မပြပါနှင့်"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"ဤအကြောင်းကြားချက်များကို ပြုပြင်၍ မရပါ။"</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"ဖွင့်ရန် လက်ဗွေကို သုံးပါ"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"အထောက်အထားစိစစ်ခြင်း လိုအပ်သည်။ အထောက်အထားစိစစ်ရန် လက်ဗွေ အာရုံခံကိရိယာကို ထိပါ။"</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"လက်ရှိခေါ်ဆိုမှု"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"လုပ်ဆောင်နေဆဲ"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"မိုဘိုင်းဒေတာ"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"ချိတ်ဆက်ထားသည်"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"ယာယီချိတ်ဆက်ထားသည်"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"ခေါက်နိုင်သောစက်ကို ဖြန့်လိုက်သည်"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"ခေါက်နိုင်သောစက်ကို တစ်ဘက်သို့ လှန်လိုက်သည်"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"ရှေ့စခရင် ဖွင့်ထားသည်"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"ခေါက်ထားသည်"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"ဖြန့်ထားသည်"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index cc0574c..15e568b 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -133,7 +133,7 @@
     <string name="screenrecord_save_error" msgid="5862648532560118815">"Feil ved lagring av skjermopptaket"</string>
     <string name="screenrecord_start_error" msgid="2200660692479682368">"Feil ved start av skjermopptaket"</string>
     <string name="screenrecord_stop_dialog_title" msgid="8716193661764511095">"Vil du stoppe opptaket?"</string>
-    <string name="screenrecord_stop_dialog_message" msgid="6262768207331626817">"Du tar nå opp hele skjermen"</string>
+    <string name="screenrecord_stop_dialog_message" msgid="6262768207331626817">"Nå tar du opptak av hele skjermen"</string>
     <string name="screenrecord_stop_dialog_message_specific_app" msgid="5995770227684523244">"Du tar nå opp <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="screenrecord_stop_dialog_button" msgid="2883812564938194350">"Stopp opptaket"</string>
     <string name="share_to_app_chip_accessibility_label" msgid="4210256229976947065">"Deler skjermen"</string>
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Batteriprosenten er ukjent."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Koblet til <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Koblet til <xliff:g id="CAST">%s</xliff:g>."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"Utvid gruppen."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"Åpne appen."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Ikke tilkoblet."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Av"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Utforsk Hub-modus"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Bruk moduler og skjermsparere mens du lader."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Sett i gang"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Vis skjermsparere du liker, under lading"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Bytt bruker"</string>
     <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"rullegardinmeny"</string>
     <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Alle apper og data i denne økten blir slettet."</string>
@@ -807,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Vises øverst på samtalevarsler og som et profilbilde på låseskjermen, vises som en boble, avbryter «Ikke forstyrr»"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> støtter ikke samtalefunksjoner"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Tilbakemelding"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Lukk"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Ikke vis igjen"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Disse varslene kan ikke endres."</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Bruk fingeravtrykk for å åpne"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Autentisering kreves. Trykk på fingeravtrykkssensoren for å autentisere."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"Aktiv samtale"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Kontinuerlig"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobildata"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Tilkoblet"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Koblet til midlertidig"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"En foldbar enhet blir brettet ut"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"En foldbar enhet blir snudd"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Frontskjermen er slått på"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"lagt sammen"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"åpen"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index cb0db8d..02285f2 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -169,7 +169,7 @@
     <string name="immersive_cling_description" msgid="2717426731830851921">"यहाँबाट बाहिरिन स्क्रिनको सिरानबाट तलतिर स्वाइप गर्नुहोस्"</string>
     <string name="immersive_cling_positive" msgid="3076681691468978568">"बुझेँ"</string>
     <string name="accessibility_back" msgid="6530104400086152611">"पछाडि"</string>
-    <string name="accessibility_home" msgid="5430449841237966217">"गृह"</string>
+    <string name="accessibility_home" msgid="5430449841237966217">"होम"</string>
     <string name="accessibility_menu" msgid="2701163794470513040">"मेनु"</string>
     <string name="accessibility_accessibility_button" msgid="4089042473497107709">"पहुँच"</string>
     <string name="accessibility_rotate_button" msgid="1238584767612362586">"स्क्रिन घुमाउनुहोस्"</string>
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"ब्याट्रीमा कति प्रतिशत चार्ज छ भन्ने कुराको जानाकरी छैन।"</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> मा जडित।"</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> मा कनेक्ट गरियो।"</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"समूह एक्स्पान्ड गर्नुहोस्।"</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"एप खोल्नुहोस्।"</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"जडान नगरिएको।"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"रोमिङ"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"निष्क्रिय पार्नु"</string>
@@ -352,7 +350,7 @@
     <string name="quick_settings_cast_device_default_name" msgid="6988469571141331700">"बेनाम उपकरण"</string>
     <string name="quick_settings_cast_detail_empty_text" msgid="2846282280014617785">"कुनै उपकरणहरू उपलब्ध छैन"</string>
     <string name="quick_settings_cast_no_network" msgid="3863016850468559522">"Wi-Fi वा इन्टरनेट कनेक्सन छैन"</string>
-    <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"उज्यालपन"</string>
+    <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"ब्राइटनेस"</string>
     <string name="quick_settings_inversion_label" msgid="3501527749494755688">"कलर इन्भर्सन"</string>
     <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"कलर करेक्सन"</string>
     <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"फन्टको आकार"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"हब मोडको अन्वेषण गर्नुहोस्"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"चार्ज गर्दै गर्दा आफूलाई मन पर्ने विजेट तथा स्क्रिन सेभर एक्सेस गर्नुहोस्।"</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"सुरु गरौँ"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"चार्ज भइरहेका बेला आफूलाई मन पर्ने स्क्रिनसेभरहरू देखाउनुहोस्"</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>
@@ -565,7 +562,7 @@
     <string name="media_projection_sys_service_dialog_title" msgid="3751133258891897878">"रेकर्ड वा कास्ट गर्न थाल्ने हो?"</string>
     <string name="media_projection_sys_service_dialog_warning" msgid="2443872865267330320">"यो फङ्सन प्रदान गर्ने सेवाले रेकर्ड वा कास्ट गर्दै गर्दा तपाईंको स्क्रिनमा देखिने सबै जानकारी अथवा तपाईंको डिभाइसबाट प्ले गरिने सबै सामग्री हेर्न तथा प्रयोग गर्न सक्छ। यसअन्तर्गत पासवर्ड, भुक्तानीसम्बन्धी विवरण, फोटो, म्यासेज र तपाईंले प्ले गर्ने अडियो जस्ता कुराहरू समावेश हुन्छन्।"</string>
     <string name="screen_share_generic_app_selector_title" msgid="8331515850599218288">"कुनै एप सेयर वा रेकर्ड गर्नुहोस्"</string>
-    <string name="media_projection_entry_app_permission_dialog_title" msgid="4613857256721708062">"स्क्रिन <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> सँग सेयर गर्ने हो?"</string>
+    <string name="media_projection_entry_app_permission_dialog_title" msgid="4613857256721708062">"आफ्नो स्क्रिन <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> मा सेयर गर्ने हो?"</string>
     <string name="screen_share_permission_dialog_option_single_app" msgid="2974054871681567314">"एउटा एप सेयर गर्नुहोस्"</string>
     <!-- no translation found for media_projection_entry_app_permission_dialog_option_text_single_app (2308901434964846084) -->
     <skip />
@@ -695,7 +692,7 @@
     <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>
+    <string name="stream_notification" msgid="7930294049046243939">"नोटिफिकेसन"</string>
     <string name="stream_bluetooth_sco" msgid="6234562365528664331">"ब्लुटुथ"</string>
     <string name="stream_dtmf" msgid="7322536356554673067">"दोहोरो बहु टोनको फ्रिक्वेन्सी"</string>
     <string name="stream_accessibility" msgid="3873610336741987152">"पहुँच"</string>
@@ -807,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"प्रतिक्रिया"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"हटाउनुहोस्"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"फेरि नदेखाउनुहोस्"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"यी सूचनाहरू परिमार्जन गर्न मिल्दैन।"</string>
@@ -862,7 +858,7 @@
     <string name="keyboard_key_numpad_template" msgid="7316338238459991821">"नमप्याड <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="notif_inline_reply_remove_attachment_description" msgid="7954075334095405429">"एट्याचमेन्ट हटाउनुहोस्"</string>
     <string name="keyboard_shortcut_group_system" msgid="1583416273777875970">"प्रणाली"</string>
-    <string name="keyboard_shortcut_group_system_home" msgid="7465138628692109907">"गृह"</string>
+    <string name="keyboard_shortcut_group_system_home" msgid="7465138628692109907">"होम"</string>
     <string name="keyboard_shortcut_group_system_recents" msgid="8628108256824616927">"हालैका"</string>
     <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"पछाडि"</string>
     <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"नोटिफिकेसनहरू"</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"फिंगरप्रिन्ट प्रयोग गरी खोल्नुहोस्"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"पुष्टि गर्नु पर्ने हुन्छ। पुष्टि गर्न फिंगरप्रिन्ट सेन्सर छुनुहोस्।"</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"कल भइरहेको"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"जारी"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"मोबाइल डेटा"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"इन्टरनेटमा कनेक्ट गरिएको छ"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"यसमा केही समयका लागि कनेक्ट गरिएको हो"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"फोल्डेबल डिभाइस अनफोल्ड गरेको देखाइएको एनिमेसन"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"फोल्डेबल डिभाइस यताउता पल्टाएर देखाइएको एनिमेसन"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"अगाडिको स्क्रिन अन गरिएको छ"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"फोल्ड गरिएको"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"अनफोल्ड गरिएको"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-night/colors.xml b/packages/SystemUI/res/values-night/colors.xml
index 326be99..85182a0 100644
--- a/packages/SystemUI/res/values-night/colors.xml
+++ b/packages/SystemUI/res/values-night/colors.xml
@@ -110,12 +110,12 @@
 
     <!-- Dark theme base colors for notification shade/scrim, the alpha component is adjusted
      programmatically to match the spec -->
-    <color name="shade_panel">@android:color/system_accent1_800</color>
-    <color name="surface_effect_0">@android:color/system_accent1_800</color>
+    <color name="shade_panel_base">@android:color/system_accent1_800</color>
+    <color name="notification_scrim_base">@android:color/system_accent1_800</color>
 
-    <!-- todo(b/388891904) Remove updated color references once they are available. -->
-    <color name="shade_panel_base">@color/shade_panel</color>
-    <color name="notification_scrim_base">@color/surface_effect_0</color>
+    <!-- Dark theme fallback colors for notification shade/scrim -->
+    <color name="shade_panel_fallback">@android:color/system_accent2_800</color>
+    <color name="notification_scrim_fallback">@android:color/system_surface_dim_dark</color>
 
     <!-- Keyboard shortcut helper dialog -->
     <color name="ksh_key_item_color">@*android:color/system_on_surface_variant_dark</color>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index 26b88a9..99c8838 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -804,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Wordt getoond bovenaan gespreksmeldingen en als profielfoto op het vergrendelscherm, verschijnt als bubbel, onderbreekt Niet storen"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioriteit"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ondersteunt geen gespreksfuncties"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Feedback"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Sluiten"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Niet meer tonen"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Deze meldingen kunnen niet worden aangepast."</string>
@@ -1395,6 +1394,7 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Opvouwbaar apparaat wordt uitgevouwen"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Opvouwbaar apparaat wordt gedraaid"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Scherm aan voorzijde aangezet"</string>
+    <string name="rear_display_unfolded_front_screen_on_slide_to_cancel" msgid="1455192420423012859">"Schuiven om het binnenste scherm te gebruiken"</string>
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"dichtgevouwen"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"opengevouwen"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string>
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index 768ab7a..5847a9a 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"ବ୍ୟାଟେରୀ ଶତକଡ଼ା ଅଜଣା ଅଟେ।"</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> ସହ ସଂଯୁକ୍ତ"</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> ସହିତ ସଂଯୁକ୍ତ।"</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"ଗ୍ରୁପକୁ ବିସ୍ତାର କରନ୍ତୁ।"</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"ଆପ୍ଲିକେସନ ଖୋଲନ୍ତୁ।"</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"କନେକ୍ଟ ହୋଇନାହିଁ।"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"ରୋମିଙ୍ଗ"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"ବନ୍ଦ ଅଛି"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"ହବ ମୋଡକୁ ଏକ୍ସପ୍ଲୋର କରନ୍ତୁ"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"ଚାର୍ଜ କରିବା ସମୟରେ ଆପଣଙ୍କ ପସନ୍ଦର ୱିଜେଟ ଏବଂ ସ୍କ୍ରିନ ସେଭରଗୁଡ଼ିକୁ ଆକ୍ସେସ କରନ୍ତୁ।"</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"ଚାଲନ୍ତୁ ଆରମ୍ଭ କରିବା"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"ଚାର୍ଜ କରିବା ସମୟରେ ଆପଣଙ୍କ ପସନ୍ଦର ସ୍କ୍ରିନସେଭରଗୁଡ଼ିକ ଦେଖାନ୍ତୁ"</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>
@@ -565,7 +562,7 @@
     <string name="media_projection_sys_service_dialog_title" msgid="3751133258891897878">"ରେକର୍ଡିଂ ବା କାଷ୍ଟିଂ ଆରମ୍ଭ କରିବେ?"</string>
     <string name="media_projection_sys_service_dialog_warning" msgid="2443872865267330320">"ରେକର୍ଡ ବା କାଷ୍ଟ କରିବା ସମୟରେ ଆପଣଙ୍କ ଡିଭାଇସରୁ ପ୍ଲେ ହେଉଥିବା କିମ୍ବା ଆପଣଙ୍କ ସ୍କ୍ରିନରେ ଦେଖାଯାଉଥିବା ସମସ୍ତ ସୂଚନାକୁ ଏହି ଫଙ୍କସନ ପ୍ରଦାନ କରୁଥିବା ସେବାର ଆକ୍ସେସ ରହିବ। ଏଥିରେ ପାସୱାର୍ଡ, ପେମେଣ୍ଟ ବିବରଣୀ, ଫଟୋ, ମେସେଜ ଏବଂ ଆପଣ ପ୍ଲେ କରୁଥିବା ଅଡିଓ ପରି ସୂଚନା ଅନ୍ତର୍ଭୁକ୍ତ ଅଛି।"</string>
     <string name="screen_share_generic_app_selector_title" msgid="8331515850599218288">"ଏକ ଆପକୁ ସେୟାର କିମ୍ବା ରେକର୍ଡ କରନ୍ତୁ"</string>
-    <string name="media_projection_entry_app_permission_dialog_title" msgid="4613857256721708062">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ସହ ଆପଣଙ୍କ ସ୍କ୍ରିନକୁ ସେୟାର କରନ୍ତୁ?"</string>
+    <string name="media_projection_entry_app_permission_dialog_title" msgid="4613857256721708062">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ସହ ଆପଣଙ୍କ ସ୍କ୍ରିନକୁ ସେୟାର କରିବେ?"</string>
     <string name="screen_share_permission_dialog_option_single_app" msgid="2974054871681567314">"ଗୋଟିଏ ଆପ ସେୟାର କରନ୍ତୁ"</string>
     <!-- no translation found for media_projection_entry_app_permission_dialog_option_text_single_app (2308901434964846084) -->
     <skip />
@@ -807,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"ମତାମତ"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"ଖାରଜ କରନ୍ତୁ"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"ପୁଣି ଶୋ କରନ୍ତୁ ନାହିଁ"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ପରିବର୍ତ୍ତନ କରିହେବ ନାହିଁ।"</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"ଖୋଲିବାକୁ ଟିପଚିହ୍ନ ବ୍ୟବହାର କରନ୍ତୁ"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"ପ୍ରମାଣୀକରଣ ଆବଶ୍ୟକ। ପ୍ରମାଣୀକରଣ କରିବାକୁ ଟିପଚିହ୍ନ ସେନ୍ସରକୁ ସ୍ପର୍ଶ କରନ୍ତୁ।"</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"ଚାଲିଥିବା କଲ"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"ଚାଲୁଥିବା"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"ମୋବାଇଲ ଡାଟା"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"ସଂଯୋଗ କରାଯାଇଛି"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"ଅସ୍ଥାୟୀ ରୂପେ କନେକ୍ଟ କରାଯାଇଛି"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"ଫୋଲ୍ଡ କରାଯାଇପାରୁଥିବା ଡିଭାଇସକୁ ଅନଫୋଲ୍ଡ କରାଯାଉଛି"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"ଫୋଲ୍ଡ କରାଯାଇପାରୁଥିବା ଡିଭାଇସକୁ ଫ୍ଲିପ କରାଯାଉଛି"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"ସାମ୍ନା ସ୍କ୍ରିନ ଚାଲୁ ଅଛି"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"ଫୋଲ୍ଡେଡ"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"ଅନଫୋଲ୍ଡେଡ"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index a61ea1a..17757b8 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -804,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"ਵਿਚਾਰ"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"ਖਾਰਜ ਕਰੋ"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"ਦੁਬਾਰਾ ਨਾ ਦਿਖਾਓ"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"ਇਹਨਾਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਸੋਧਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ।"</string>
@@ -1395,6 +1394,7 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"ਮੋੜਨਯੋਗ ਡੀਵਾਈਸ ਨੂੰ ਖੋਲ੍ਹਿਆ ਜਾ ਰਿਹਾ ਹੈ"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"ਮੋੜਨਯੋਗ ਡੀਵਾਈਸ ਨੂੰ ਆਲੇ-ਦੁਆਲੇ ਫਲਿੱਪ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"ਅਗਲੀ ਸਕ੍ਰੀਨ ਚਾਲੂ ਕੀਤੀ ਗਈ"</string>
+    <string name="rear_display_unfolded_front_screen_on_slide_to_cancel" msgid="1455192420423012859">"ਅੰਦਰਲੀ ਸਕ੍ਰੀਨ ਵਰਤਣ ਲਈ ਸਲਾਈਡ ਕਰੋ"</string>
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"ਫੋਲਡਯੋਗ ਡੀਵਾਈਸ"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"ਅਣਫੋਲਡਯੋਗ ਡੀਵਾਈਸ"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 2e2a3b4..c0a2831 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Poziom naładowania baterii jest nieznany."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Połączono z <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Połączono z urządzeniem <xliff:g id="CAST">%s</xliff:g>."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"Rozwiń grupę."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"Otwórz aplikację."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Nie połączono."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Wył."</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Odkryj tryb centrali"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Podczas ładowania możesz korzystać z ulubionych widżetów i wygaszaczy ekranu."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Do dzieła"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Podczas ładowania wyświetlaj ulubione wygaszacze ekranu"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Przełącz użytkownika"</string>
     <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menu"</string>
     <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Wszystkie aplikacje i dane w tej sesji zostaną usunięte."</string>
@@ -576,7 +573,7 @@
     <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="7094417930857938876">"Kiedy udostępniasz obraz z aplikacji <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>, widoczne jest wszystko to, 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_continue_entire_screen" msgid="1850848182344377579">"Udostępnij ekran"</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_share_app_selector_title" msgid="1419515119767501822">"Wybieranie aplikacji do udostępniania"</string>
+    <string name="media_projection_entry_share_app_selector_title" msgid="1419515119767501822">"Wybierz aplikację do udostępniania"</string>
     <string name="media_projection_entry_cast_permission_dialog_title" msgid="752756942658159416">"Włączyć przesyłanie treści wyświetlanych na ekranie?"</string>
     <string name="media_projection_entry_cast_permission_dialog_option_text_single_app" msgid="6073353940838561981">"Przesyłanie obrazu z 1 aplikacji"</string>
     <string name="media_projection_entry_cast_permission_dialog_option_text_entire_screen" msgid="8389508187954155307">"Przesyłanie całego ekranu"</string>
@@ -807,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Wyświetla się u góry powiadomień w rozmowach oraz jako zdjęcie profilowe na ekranie blokady, jako dymek, przerywa działanie trybu Nie przeszkadzać"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Priorytetowe"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> nie obsługuje funkcji rozmów"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Opinia"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Zamknij"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Nie pokazuj ponownie"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Tych powiadomień nie można zmodyfikować."</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"By otworzyć, użyj odcisku palca"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Wymagane uwierzytelnienie. Dotknij czytnika liniii papilarnych, by uwierzytelnić."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"Trwa rozmowa"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"W toku"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobilna transmisja danych"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Połączono"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Tymczasowe połączenie"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Składane urządzenie jest rozkładane"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Składane urządzenie jest obracane"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Ekran przedni jest włączony"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"po zamknięciu"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"po otwarciu"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index abba688..c1a8ec4 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -123,7 +123,7 @@
     <string name="screenrecord_mic_label" msgid="2111264835791332350">"Microfone"</string>
     <string name="screenrecord_device_audio_and_mic_label" msgid="1831323771978646841">"Áudio e microfone do dispositivo"</string>
     <string name="screenrecord_continue" msgid="4055347133700593164">"Iniciar"</string>
-    <string name="screenrecord_ongoing_screen_only" msgid="4459670242451527727">"Gravando tela"</string>
+    <string name="screenrecord_ongoing_screen_only" msgid="4459670242451527727">"Gravando a tela"</string>
     <string name="screenrecord_ongoing_screen_and_audio" msgid="5351133763125180920">"Gravando tela e áudio"</string>
     <string name="screenrecord_taps_label" msgid="1595690528298857649">"Mostrar toques na tela"</string>
     <string name="screenrecord_stop_label" msgid="72699670052087989">"Parar"</string>
@@ -731,7 +731,7 @@
     <string name="volume_panel_hint_muted" msgid="1124844870181285320">"som desativado"</string>
     <string name="volume_panel_hint_vibrate" msgid="4136223145435914132">"vibrar"</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">"Áudio definido para"</string>
+    <string name="media_output_title_without_playing" msgid="3825663683169305013">"Onde vai tocar:"</string>
     <string name="media_output_title_ongoing_call" msgid="208426888064112006">"Ligando"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Sintonizador System UI"</string>
     <string name="status_bar" msgid="4357390266055077437">"Barra de status"</string>
@@ -804,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Aparecem na parte superior das notificações de conversa, como uma foto do perfil na tela de bloqueio e como um balão. Interrompem o Não perturbe."</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritárias"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> não é compatível com recursos de conversa"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Enviar feedback"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Dispensar"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Não mostrar novamente"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Não é possível modificar essas notificações."</string>
@@ -1140,7 +1139,7 @@
     <string name="accessibility_floating_button_action_remove_menu" msgid="6730432848162552135">"Remover"</string>
     <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"alternar"</string>
     <string name="accessibility_floating_button_action_edit" msgid="1688227814600463987">"Editar"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"Controles do disp."</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"Controles do dispositivo"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"Escolha um app para adicionar controles"</string>
     <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# controle adicionado.}one{# controle adicionado.}many{# de controles adicionados.}other{# controles adicionados.}}"</string>
     <string name="controls_removed" msgid="3731789252222856959">"Removido"</string>
@@ -1395,6 +1394,7 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Dispositivo dobrável sendo aberto"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Dispositivo dobrável sendo virado"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Tela frontal ativada"</string>
+    <string name="rear_display_unfolded_front_screen_on_slide_to_cancel" msgid="1455192420423012859">"Deslize para usar a tela interna"</string>
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"fechado"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"aberto"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 833714c..36384bc 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -804,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Aparece na parte superior das notificações de conversas e como uma imagem do perfil no ecrã de bloqueio, surge como um balão, interrompe o modo Não incomodar"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioridade"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> não suporta funcionalidades de conversa."</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Feedback"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Ignorar"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Não mostrar novamente"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Não é possível modificar estas notificações."</string>
@@ -1395,6 +1394,7 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Dispositivo dobrável a ser desdobrado"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Dispositivo dobrável a ser virado ao contrário"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Ecrã frontal ativado"</string>
+    <string name="rear_display_unfolded_front_screen_on_slide_to_cancel" msgid="1455192420423012859">"Deslize lentamente para usar o ecrã interior"</string>
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"fechado"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"aberto"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index abba688..c1a8ec4 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -123,7 +123,7 @@
     <string name="screenrecord_mic_label" msgid="2111264835791332350">"Microfone"</string>
     <string name="screenrecord_device_audio_and_mic_label" msgid="1831323771978646841">"Áudio e microfone do dispositivo"</string>
     <string name="screenrecord_continue" msgid="4055347133700593164">"Iniciar"</string>
-    <string name="screenrecord_ongoing_screen_only" msgid="4459670242451527727">"Gravando tela"</string>
+    <string name="screenrecord_ongoing_screen_only" msgid="4459670242451527727">"Gravando a tela"</string>
     <string name="screenrecord_ongoing_screen_and_audio" msgid="5351133763125180920">"Gravando tela e áudio"</string>
     <string name="screenrecord_taps_label" msgid="1595690528298857649">"Mostrar toques na tela"</string>
     <string name="screenrecord_stop_label" msgid="72699670052087989">"Parar"</string>
@@ -731,7 +731,7 @@
     <string name="volume_panel_hint_muted" msgid="1124844870181285320">"som desativado"</string>
     <string name="volume_panel_hint_vibrate" msgid="4136223145435914132">"vibrar"</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">"Áudio definido para"</string>
+    <string name="media_output_title_without_playing" msgid="3825663683169305013">"Onde vai tocar:"</string>
     <string name="media_output_title_ongoing_call" msgid="208426888064112006">"Ligando"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Sintonizador System UI"</string>
     <string name="status_bar" msgid="4357390266055077437">"Barra de status"</string>
@@ -804,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Aparecem na parte superior das notificações de conversa, como uma foto do perfil na tela de bloqueio e como um balão. Interrompem o Não perturbe."</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritárias"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> não é compatível com recursos de conversa"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Enviar feedback"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Dispensar"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Não mostrar novamente"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Não é possível modificar essas notificações."</string>
@@ -1140,7 +1139,7 @@
     <string name="accessibility_floating_button_action_remove_menu" msgid="6730432848162552135">"Remover"</string>
     <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"alternar"</string>
     <string name="accessibility_floating_button_action_edit" msgid="1688227814600463987">"Editar"</string>
-    <string name="quick_controls_title" msgid="6839108006171302273">"Controles do disp."</string>
+    <string name="quick_controls_title" msgid="6839108006171302273">"Controles do dispositivo"</string>
     <string name="controls_providers_title" msgid="6879775889857085056">"Escolha um app para adicionar controles"</string>
     <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# controle adicionado.}one{# controle adicionado.}many{# de controles adicionados.}other{# controles adicionados.}}"</string>
     <string name="controls_removed" msgid="3731789252222856959">"Removido"</string>
@@ -1395,6 +1394,7 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Dispositivo dobrável sendo aberto"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Dispositivo dobrável sendo virado"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Tela frontal ativada"</string>
+    <string name="rear_display_unfolded_front_screen_on_slide_to_cancel" msgid="1455192420423012859">"Deslize para usar a tela interna"</string>
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"fechado"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"aberto"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 3cfe7b83..beb3c116 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Procentajul bateriei este necunoscut."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Conectat la <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"S-a stabilit conexiunea la <xliff:g id="CAST">%s</xliff:g>."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"Extinde grupul."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"Deschide aplicația."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Neconectat."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Dezactivate"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Explorează modul hub"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Accesează widgeturile și screensaverele preferate în timpul încărcării."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Să începem"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Afișează screensaverele preferate în timpul încărcării"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Schimbă utilizatorul"</string>
     <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"meniu vertical"</string>
     <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Toate aplicațiile și datele din această sesiune vor fi șterse."</string>
@@ -807,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Se afișează în partea de sus a notificărilor pentru conversații și ca fotografie de profil pe ecranul de blocare, apare ca un balon, întrerupe funcția Nu deranja"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritate"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> nu acceptă funcții pentru conversații"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Feedback"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Închide"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Nu mai afișa"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Aceste notificări nu pot fi modificate."</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Folosește amprenta ca să deschizi"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Autentificare obligatorie. Atinge senzorul de amprentă pentru a te autentifica."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"Apel în desfășurare"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"În desfășurare"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"Date mobile"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Conectat"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Conectat temporar"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Dispozitiv pliabil care este desfăcut"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Dispozitiv pliabil care este întors"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Ecranul frontal este activat"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"închis"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"deschis"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 7ec0513..e3f852c 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -804,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Оставить отзыв"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Закрыть"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Больше не показывать"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Эти уведомления нельзя изменить."</string>
@@ -1395,6 +1394,7 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Складное устройство в разложенном виде"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Перевернутое складное устройство"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Передний экран включен"</string>
+    <string name="rear_display_unfolded_front_screen_on_slide_to_cancel" msgid="1455192420423012859">"Проведите пальцем, чтобы переключиться на внутренний экран."</string>
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"устройство сложено"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"устройство разложено"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string>
@@ -1418,7 +1418,7 @@
     <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>
-    <string name="dismissible_keyguard_swipe" msgid="8377597870094949432">"Чтобы продолжить, проведите вверх."</string>
+    <string name="dismissible_keyguard_swipe" msgid="8377597870094949432">"Чтобы продолжить, проведите вверх"</string>
     <string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"Дублировать на внешний дисплей?"</string>
     <string name="connected_display_dialog_dual_display_stop_warning" msgid="4174707498892447947">"Для внутреннего экрана включится дублирование. Передний экран будет отключен."</string>
     <string name="mirror_display" msgid="2515262008898122928">"Дублировать"</string>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index 0a173cf..9ff6747 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -804,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"ප්‍රතිපෝෂණය"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"අස් කරන්න"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"නැවත නොපෙන්වන්න"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"මෙම දැනුම්දීම් වෙනස් කළ නොහැක."</string>
@@ -1395,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"දිග හැරෙමින් පවතින නැමිය හැකි උපාංගය"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"වටා පෙරළෙමින් තිබෙන නැමිය හැකි උපාංගය"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"ඉදිරිපස තිරය ක්‍රියාත්මකයි"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"නැවූ"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"නොනැවූ"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index fbbc48c..a42eb1e 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -804,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Zobrazuje sa ako bublina v hornej časti upozornení konverzácie a profilová fotka na uzamknutej obrazovke, preruší režim bez vyrušení"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritné"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> nepodporuje funkcie konverzácie"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Spätná väzba"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Zavrieť"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Nabudúce nezobrazovať"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Tieto upozornenia sa nedajú upraviť."</string>
@@ -1395,6 +1394,7 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Rozloženie skladacieho zariadenia"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Prevrátenie skladacieho zariadenia"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Predná obrazovka je zapnutá"</string>
+    <string name="rear_display_unfolded_front_screen_on_slide_to_cancel" msgid="1455192420423012859">"Ak chcete použiť vnútornú obrazovku, prejdite prstom"</string>
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"zložené"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"rozložené"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 4174934..c0e751b 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -804,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Prikaz v obliki oblačka na vrhu razdelka z obvestili za pogovor in kot profilna slika na zaklenjenem zaslonu, preglasitev načina Ne moti."</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prednostno"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ne podpira pogovornih funkcij."</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Povratne informacije"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Opusti"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Tega ne prikaži več"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Za ta obvestila ni mogoče spremeniti nastavitev."</string>
@@ -1395,6 +1394,7 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Razpiranje zložljive naprave"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Obračanje zložljive naprave"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Sprednji zaslon je vklopljen"</string>
+    <string name="rear_display_unfolded_front_screen_on_slide_to_cancel" msgid="1455192420423012859">"Povlecite za uporabo notranjega zaslona"</string>
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"zaprto"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"razprto"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index f2c6301..06cefd9c 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Përqindja e baterisë e panjohur."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Lidhur me <xliff:g id="BLUETOOTH">%s</xliff:g>"</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Është lidhur me <xliff:g id="CAST">%s</xliff:g>."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"Zgjero grupin."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"Hap aplikacionin."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Nuk është i lidhur."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Joaktiv"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Eksploro në modalitetin Hub"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Qasu në mbrojtësit e ekranit dhe miniaplikacionet e tua të preferuara gjatë karikimit."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Fillojmë"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Shfaq mbrojtësit e preferuar të ekranit gjatë karikimit"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Ndërro përdorues"</string>
     <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menyja me tërheqje poshtë"</string>
     <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Të gjitha aplikacionet dhe të dhënat në këtë sesion do të fshihen."</string>
@@ -807,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Shfaqet në krye të njoftimeve të bisedës dhe si fotografia e profilit në ekranin e kyçjes, shfaqet si flluskë dhe ndërpret modalitetin \"Mos shqetëso\""</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Me përparësi"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> nuk mbështet veçoritë e bisedës"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Koment"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Hiq"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Mos e shfaq më"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Këto njoftime nuk mund të modifikohen."</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Përdor gjurmën e gishtit për ta hapur"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Kërkohet vërtetimi. Prek sensorin e gjurmës së gishtit për t\'u vërtetuar."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"Telefonatë në vazhdim"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Në vazhdim"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"Të dhënat celulare"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Lidhur"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Lidhur përkohësisht"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Pajisja e palosshme duke u hapur"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Pajisja e palosshme duke u rrotulluar"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Ekrani i përparmë është aktivizuar"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"palosur"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"shpalosur"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 223242e..3977058 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -109,14 +109,14 @@
     <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="7415261783188749730">"Желите да снимите екран?"</string>
-    <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Сними једну апликацију"</string>
+    <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Желите да снимате екран?"</string>
+    <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Снимaj једну апликацију"</string>
     <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="4882406311415082016">"Сними овај екран"</string>
     <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="4169494703993148253">"Сними %s"</string>
     <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Када снимате цео екран, снима се све што је на њему. Зато пазите на лозинке, информације о плаћању, поруке, слике, аудио и видео садржај."</string>
     <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Када снимате апликацију, снима се сав садржај који се приказује или пушта у њој. Зато пазите на лозинке, информације о плаћању, поруке, слике, аудио и видео садржај."</string>
     <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Сними екран"</string>
-    <string name="screenrecord_app_selector_title" msgid="3854492366333954736">"Одаберите апликацију коју желите да снимите"</string>
+    <string name="screenrecord_app_selector_title" msgid="3854492366333954736">"Одаберите апликацију за снимање"</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>
@@ -573,7 +573,7 @@
     <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="7094417930857938876">"Када делите апликацију, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> види сав садржај који се приказује или пушта у њој. Зато пазите на лозинке, информације о плаћању, поруке, слике, аудио и видео садржај."</string>
     <string name="media_projection_entry_app_permission_dialog_continue_entire_screen" msgid="1850848182344377579">"Дели екран"</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_share_app_selector_title" msgid="1419515119767501822">"Одаберите апликацију коју желите да делите"</string>
+    <string name="media_projection_entry_share_app_selector_title" msgid="1419515119767501822">"Одаберите апликацију за дељење"</string>
     <string name="media_projection_entry_cast_permission_dialog_title" msgid="752756942658159416">"Желите да пребаците екран?"</string>
     <string name="media_projection_entry_cast_permission_dialog_option_text_single_app" msgid="6073353940838561981">"Пребаци једну апликацију"</string>
     <string name="media_projection_entry_cast_permission_dialog_option_text_entire_screen" msgid="8389508187954155307">"Пребаци цео екран"</string>
@@ -804,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Повратне информације"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Одбаци"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Не приказуј поново"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Ова обавештења не могу да се мењају."</string>
@@ -1395,6 +1394,7 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Уређај на преклоп се отвара"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Уређај на преклоп се обрће"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Предњи екран је укључен"</string>
+    <string name="rear_display_unfolded_front_screen_on_slide_to_cancel" msgid="1455192420423012859">"Превуците да бисте користили унутрашњи екран"</string>
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"затворено"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"отворено"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index b613535..7051a2a 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Okänd batterinivå."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Ansluten till <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Ansluten till <xliff:g id="CAST">%s</xliff:g>."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"Utöka gruppen."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"Öppna appen."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Inte ansluten."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Av"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Utforska hubbläget"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Få åtkomst till dina favoritwidgetar och skärmsläckare under laddning."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Då kör vi"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Visa dina favoritskärmsläckare vid laddning"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Byt användare"</string>
     <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"rullgardinsmeny"</string>
     <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Alla appar och data i denna session kommer att raderas."</string>
@@ -807,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Visas högst upp i konversationsaviseringarna och som profilbild på låsskärmen, visas som bubbla, åsidosätter Stör ej"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> har inte stöd för konversationsfunktioner"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Feedback"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Stäng"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Visa inte igen"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Det går inte att ändra de här aviseringarna."</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Öppna med fingeravtryck"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Autentisering krävs. Identifiera dig genom att trycka på fingeravtryckssensorn."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"Pågående samtal"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Pågående"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobildata"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Ansluten"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Tillfälligt ansluten"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"En vikbar enhet viks upp"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"En vikbar enhet vänds"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Den främre skärmen har aktiverats"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"hopvikt"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"uppvikt"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index cae8565..2ead01a 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Asilimia ya betri haijulikani."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Imeunganishwa kwenye <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Imeunganishwa kwenye <xliff:g id="CAST">%s</xliff:g>."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"Panua kikundi."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"Fungua programu."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Haijaunganishwa."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Mitandao ya ng\'ambo"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Zima"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Gundua hali ya kutumia ikiwa imepachikwa"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Fikia wijeti unazopenda na taswira za skrini wakati unachaji."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Anza"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Onyesha taswira za skrini uzipendazo wakati wa kuchaji"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Badili mtumiaji"</string>
     <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menyu ya kuvuta chini"</string>
     <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Data na programu zote katika kipindi hiki zitafutwa."</string>
@@ -807,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Huonyeshwa kwenye sehemu ya juu ya arifa za mazungumzo na kama picha ya wasifu kwenye skrini iliyofungwa. Huonekana kama kiputo na hukatiza kipengele cha Usinisumbue"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Kipaumbele"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> haitumii vipengele vya mazungumzo"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Maoni"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Ondoa"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Usionyeshe tena"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Arifa hizi haziwezi kubadilishwa."</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Tumia alama ya kidole kufungua"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Uthibitishaji unahitajika. Gusa kitambua alama ya kidole ili uthibitishe."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"Simu inayoendelea"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Inaendelea"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"Data ya mtandao wa simu"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Imeunganishwa"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Imeunganishwa kwa muda"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Kifaa kinachokunjwa kikikunjuliwa"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Kifaa kinachokunjwa kikigeuzwa"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Umewasha skrini ya mbele"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"kimekunjwa"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"kimefunguliwa"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index d9781b6..b37350c 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -116,14 +116,14 @@
     <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"முழுத் திரையை நீங்கள் ரெக்கார்டு செய்யும்போது அதில் காட்டப்படும் அனைத்தும் ரெக்கார்டு செய்யப்படும். எனவே கடவுச்சொற்கள், பேமெண்ட் விவரங்கள், மெசேஜ்கள், படங்கள், ஆடியோ, வீடியோ போன்றவை குறித்துக் கவனத்துடன் இருங்கள்."</string>
     <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"ஓர் ஆப்ஸை ரெக்கார்டு செய்யும்போது அதில் காட்டப்படும் அல்லது பிளே செய்யப்படும் அனைத்தும் ரெக்கார்டு செய்யப்படும். எனவே கடவுச்சொற்கள், பேமெண்ட் விவரங்கள், மெசேஜ்கள், படங்கள், ஆடியோ, வீடியோ போன்றவை குறித்துக் கவனத்துடன் இருங்கள்."</string>
     <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"திரையை ரெக்கார்டு செய்"</string>
-    <string name="screenrecord_app_selector_title" msgid="3854492366333954736">"ரெக்கார்டு செய்ய ஆப்ஸைத் தேர்வுசெய்தல்"</string>
+    <string name="screenrecord_app_selector_title" msgid="3854492366333954736">"ரெக்கார்டு செய்ய ஆப்ஸைத் தேர்வுசெய்க"</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_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_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_stop_label" msgid="72699670052087989">"நிறுத்து"</string>
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"பேட்டரி சதவீதம் தெரியவில்லை."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g>க்கு இணைக்கப்பட்டது."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> உடன் இணைக்கப்பட்டுள்ளது."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"குழுவை விரிவாக்கும்."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"ஆப்ஸைத் திறக்கும்."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"இணைக்கப்படவில்லை."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"ரோமிங்"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"ஆஃப்"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"ஹப் பயன்முறையைக் கண்டறியுங்கள்"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"சார்ஜிங்கின்போது உங்களுக்குப் பிடித்த விட்ஜெட்களையும் ஸ்கிரீன் சேவர்களையும் அணுகலாம்."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"தொடங்குக"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"சார்ஜாகும்போது உங்களுக்கு விருப்பமான ஸ்கிரீன் சேவர்களைக் காட்டும்"</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>
@@ -576,7 +573,7 @@
     <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="7094417930857938876">"ஓர் ஆப்ஸைப் பகிரும்போது, அதில் காட்டப்படும்/பிளே செய்யப்படும் அனைத்தும் <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> இல் தெரியும். எனவே கடவுச்சொற்கள், பேமெண்ட் விவரங்கள், மெசேஜ்கள், படங்கள், ஆடியோ, வீடியோ போன்றவை குறித்துக் கவனத்துடன் இருங்கள்."</string>
     <string name="media_projection_entry_app_permission_dialog_continue_entire_screen" msgid="1850848182344377579">"திரையைப் பகிர்"</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_share_app_selector_title" msgid="1419515119767501822">"பகிர ஆப்ஸைத் தேர்வுசெய்தல்"</string>
+    <string name="media_projection_entry_share_app_selector_title" msgid="1419515119767501822">"பகிர ஆப்ஸைத் தேர்வுசெய்க"</string>
     <string name="media_projection_entry_cast_permission_dialog_title" msgid="752756942658159416">"உங்கள் திரையை அலைபரப்ப வேண்டுமா?"</string>
     <string name="media_projection_entry_cast_permission_dialog_option_text_single_app" msgid="6073353940838561981">"ஓர் ஆப்ஸை அலைபரப்பு"</string>
     <string name="media_projection_entry_cast_permission_dialog_option_text_entire_screen" msgid="8389508187954155307">"முழுத்திரையையும் அலைபரப்பு"</string>
@@ -807,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"கருத்து"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"மூடுக"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"மீண்டும் காட்டாதே"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"இந்த அறிவிப்புகளை மாற்ற இயலாது."</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"கைரேகையைப் பயன்படுத்தி திறந்திடுங்கள்"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"அங்கீகாரம் தேவை. கைரேகை சென்சாரைத் தொட்டு அங்கீகரியுங்கள்."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"செயலில் உள்ள அழைப்பு"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"செயலிலுள்ளது"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"மொபைல் டேட்டா"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"இணைக்கப்பட்டது"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"தற்காலிகமாக இணைக்கப்பட்டுள்ளது"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"மடக்கத்தக்க சாதனம் திறக்கப்படுகிறது"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"மடக்கத்தக்க சாதனம் ஃபிளிப் செய்யப்பட்டு திருப்பப்படுகிறது"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"முன்பக்கத் திரை இயக்கப்பட்டுள்ளது"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"மடக்கப்பட்டது"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"விரிக்கப்பட்டது"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index e31f866..f64c737 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -123,7 +123,7 @@
     <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_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_stop_label" msgid="72699670052087989">"ఆపివేయండి"</string>
@@ -562,7 +562,7 @@
     <string name="media_projection_sys_service_dialog_title" msgid="3751133258891897878">"రికార్డ్ చేయడం లేదా ప్రసారం చేయడం ప్రారంభించాలా?"</string>
     <string name="media_projection_sys_service_dialog_warning" msgid="2443872865267330320">"రికార్డ్ చేస్తున్నప్పుడు లేదా ప్రసారం చేస్తున్నప్పుడు మీ స్క్రీన్‌పై చూపబడిన లేదా మీ పరికరం నుండి ప్లే చేయబడిన సమాచారం మొత్తాన్ని, ఈ ఫంక్షన్‌ను అందిస్తున్న సర్వీస్ యాక్సెస్ చేయగలదు. ఈ సమాచారంలో, పాస్‌వర్డ్‌లు, పేమెంట్ వివరాలు, ఫోటోలు, మెసేజ్‌లు, మీరు ప్లే చేసే ఆడియో వంటివి ఉంటాయి."</string>
     <string name="screen_share_generic_app_selector_title" msgid="8331515850599218288">"యాప్‌ను షేర్ చేయండి లేదా రికార్డ్ చేయండి"</string>
-    <string name="media_projection_entry_app_permission_dialog_title" msgid="4613857256721708062">"మీ స్క్రీన్‌ను <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>‌తో షేర్ చేయండి?"</string>
+    <string name="media_projection_entry_app_permission_dialog_title" msgid="4613857256721708062">"మీ స్క్రీన్‌ను <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>‌కు షేర్ చేయాలా?"</string>
     <string name="screen_share_permission_dialog_option_single_app" msgid="2974054871681567314">"ఒక యాప్‌ను షేర్ చేయండి"</string>
     <!-- no translation found for media_projection_entry_app_permission_dialog_option_text_single_app (2308901434964846084) -->
     <skip />
@@ -804,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"ఫీడ్‌బ్యాక్"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"విస్మరించండి"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"మళ్లీ చూపవద్దు"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"ఈ నోటిఫికేషన్‌లను ఎడిట్ చేయడం వీలుపడదు."</string>
@@ -1395,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"మడవగల పరికరం విప్పబడుతోంది"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"మడవగల పరికరం చుట్టూ తిప్పబడుతోంది"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"ముందు వైపు స్క్రీన్ ఆన్ అయింది"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"మడిచే సదుపాయం గల పరికరం"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"మడిచే సదుపాయం లేని పరికరం"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 8f34f8a..316aab0 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -804,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"ความคิดเห็น"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"ปิด"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"ไม่ต้องแสดงอีก"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"แก้ไขการแจ้งเตือนเหล่านี้ไม่ได้"</string>
@@ -1395,6 +1394,7 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"อุปกรณ์ที่พับได้กำลังกางออก"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"อุปกรณ์ที่พับได้กำลังพลิกไปมา"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"เปิดหน้าจอด้านหน้าแล้ว"</string>
+    <string name="rear_display_unfolded_front_screen_on_slide_to_cancel" msgid="1455192420423012859">"เลื่อนเพื่อใช้หน้าจอด้านใน"</string>
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"พับ"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"กางออก"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 2c72bd8..04dc6c7 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -138,7 +138,7 @@
     <string name="screenrecord_stop_dialog_button" msgid="2883812564938194350">"Huminto sa pag-record"</string>
     <string name="share_to_app_chip_accessibility_label" msgid="4210256229976947065">"Ibinabahagi ang screen"</string>
     <string name="share_to_app_chip_accessibility_label_generic" msgid="5517431657924536133">"Pagbabahagi ng content"</string>
-    <string name="share_to_app_stop_dialog_title" msgid="9212915050910250438">"Ihinto ang pagbabahagi ng screen?"</string>
+    <string name="share_to_app_stop_dialog_title" msgid="9212915050910250438">"Ihinto ang pagshe-share ng screen?"</string>
     <string name="share_to_app_stop_dialog_title_generic" msgid="9079161538135843648">"Itigil ang pagbabahagi?"</string>
     <string name="share_to_app_stop_dialog_message_entire_screen_with_host_app" msgid="522823522115375414">"Kasalukuyan mong ibinabahagi ang iyong buong screen sa <xliff:g id="HOST_APP_NAME">%1$s</xliff:g>"</string>
     <string name="share_to_app_stop_dialog_message_entire_screen" msgid="5090115386271179270">"Kasalukuyan mong ibinabahagi ang iyong buong screen sa isang app"</string>
@@ -562,7 +562,7 @@
     <string name="media_projection_sys_service_dialog_title" msgid="3751133258891897878">"Magsimulang mag-record o mag-cast?"</string>
     <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_generic_app_selector_title" msgid="8331515850599218288">"Magbahagi o mag-record ng app"</string>
-    <string name="media_projection_entry_app_permission_dialog_title" msgid="4613857256721708062">"Ibahagi ang iyong screen sa <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
+    <string name="media_projection_entry_app_permission_dialog_title" msgid="4613857256721708062">"I-share ang screen mo sa <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
     <string name="screen_share_permission_dialog_option_single_app" msgid="2974054871681567314">"Mag-share ng isang app"</string>
     <!-- no translation found for media_projection_entry_app_permission_dialog_option_text_single_app (2308901434964846084) -->
     <skip />
@@ -570,10 +570,10 @@
     <!-- no translation found for media_projection_entry_app_permission_dialog_option_text_entire_screen (5100078808078139706) -->
     <skip />
     <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="5504288438067851086">"Kapag ibinahagi mo ang iyong buong screen, makikita ng <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ang kahit anong nasa screen 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="7094417930857938876">"Kapag nagbabahagi ka ng app, makikita ng <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ang 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>
+    <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="7094417930857938876">"Kapag nagshe-share ka ng app, makikita ng <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ang 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>
     <string name="media_projection_entry_app_permission_dialog_continue_entire_screen" msgid="1850848182344377579">"Ibahagi ang screen"</string>
     <string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"Na-disable ng <xliff:g id="APP_NAME">%1$s</xliff:g> ang opsyong ito"</string>
-    <string name="media_projection_entry_share_app_selector_title" msgid="1419515119767501822">"Pumili ng app na ibabahagi"</string>
+    <string name="media_projection_entry_share_app_selector_title" msgid="1419515119767501822">"Pumili ng app na ishe-share"</string>
     <string name="media_projection_entry_cast_permission_dialog_title" msgid="752756942658159416">"I-cast ang iyong screen?"</string>
     <string name="media_projection_entry_cast_permission_dialog_option_text_single_app" msgid="6073353940838561981">"Mag-cast ng isang app"</string>
     <string name="media_projection_entry_cast_permission_dialog_option_text_entire_screen" msgid="8389508187954155307">"I-cast ang buong screen"</string>
@@ -804,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Makikita sa itaas ng mga notification ng pag-uusap at bilang larawan sa profile sa lock screen, lumalabas bilang bubble, naaabala ang Huwag Istorbohin"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Priyoridad"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"Hindi sinusuportahan ng <xliff:g id="APP_NAME">%1$s</xliff:g> ang mga feature ng pag-uusap"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Feedback"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"I-dismiss"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Huwag nang ipakita ulit"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Hindi puwedeng baguhin ang mga notification na ito."</string>
@@ -1395,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Ina-unfold na foldable na device"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Fini-flip na foldable na device"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Na-on ang screen sa harap"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"naka-fold"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"hindi naka-fold"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 4ca7315..f4a2c92 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -231,7 +231,7 @@
     <string name="fingerprint_reenroll_failure_dialog_content" msgid="4733768492747300666">"Parmak izi kilidi kurulamadı. Tekrar denemek için Ayarlar\'a gidin."</string>
     <string name="face_re_enroll_notification_title" msgid="1850838867718410520">"Yüz Tanıma Kilidi\'ni tekrar kurun"</string>
     <string name="face_re_enroll_notification_name" msgid="7384545252206120659">"Yüz Tanıma Kilidi"</string>
-    <string name="face_re_enroll_dialog_title" msgid="6392173708176069994">"Yüz Tanıma Kilidi\'ni kurun"</string>
+    <string name="face_re_enroll_dialog_title" msgid="6392173708176069994">"Yüz Tanıma Kilidi\'ni ayarla"</string>
     <string name="face_re_enroll_dialog_content" msgid="7353502359464038511">"Yüz Tanıma Kilidi\'ni tekrar kurmak için mevcut yüz modeliniz silinir.\n\nYüzünüzü kullanarak telefonunuzun kilidini açmak için bu özelliği yeniden kurmanız gerekir."</string>
     <string name="face_reenroll_failure_dialog_content" msgid="7073947334397236935">"Yüz tanıma kilidi kurulamadı. Tekrar denemek için Ayarlar\'a gidin."</string>
     <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Parmak izi sensörüne dokunun"</string>
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Pil yüzdesi bilinmiyor."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> ile bağlı."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> bağlantısı kuruldu."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"Grubu genişlet."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"Uygulama aç."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Bağlanmadı."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Dolaşım"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Kapalı"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Hub Modu\'nu keşfedin"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Cihazınız şarj olurken en sevdiğiniz widget\'lara ve ekran koruyuculara erişin."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Başlayalım"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Cihazınız şarj olurken en sevdiğiniz ekran koruyucuları gösterin"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Kullanıcı değiştirme"</string>
     <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"açılır menü"</string>
     <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Bu oturumdaki tüm uygulamalar ve veriler silinecek."</string>
@@ -807,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Görüşme bildirimlerinin üstünde ve kilit ekranında profil resmi olarak gösterilir, baloncuk olarak görünür, Rahatsız Etmeyin\'i kesintiye uğratır"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Öncelikli"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g>, sohbet özelliklerini desteklemiyor"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Geri bildirim"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Kapat"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Tekrar gösterme"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Bu bildirimler değiştirilemez."</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Açmak için parmak izi kullanın"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Kimlik doğrulaması gerekiyor. Kimlik doğrulaması için parmak izi sensörüne dokunun."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"Devam eden arama"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Devam ediyor"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobil veri"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Bağlı"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Geçici olarak bağlandı"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Katlanabilir cihaz açılıyor"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Katlanabilir cihaz döndürülüyor"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Ön ekran açıldı"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"katlanmış"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"katlanmamış"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index bf4444e..7dab3db 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Відсоток заряду акумулятора невідомий."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Підключено до <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Під’єднано до пристрою <xliff:g id="CAST">%s</xliff:g>."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"Розгорнути групу"</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"Відкрити додаток"</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Не з’єднано."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Роумінг"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Вимкнено"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Представляємо режим центру керування"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Використовуйте улюблені віджети й заставки, поки пристрій заряджається."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Почати"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Показувати улюблені заставки під час заряджання"</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>
@@ -565,7 +562,7 @@
     <string name="media_projection_sys_service_dialog_title" msgid="3751133258891897878">"Почати запис або трансляцію?"</string>
     <string name="media_projection_sys_service_dialog_warning" msgid="2443872865267330320">"Сервіс, що надає цю функцію, матиме доступ до всієї інформації, яка з’являється на екрані або відтворюється на пристрої під час запису чи трансляції, зокрема до паролів, платіжної інформації, фотографій, повідомлень і аудіофайлів."</string>
     <string name="screen_share_generic_app_selector_title" msgid="8331515850599218288">"Показувати або записувати додаток"</string>
-    <string name="media_projection_entry_app_permission_dialog_title" msgid="4613857256721708062">"Показати екран для додатка <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
+    <string name="media_projection_entry_app_permission_dialog_title" msgid="4613857256721708062">"Показати екран у додатку <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
     <string name="screen_share_permission_dialog_option_single_app" msgid="2974054871681567314">"Показати один додаток"</string>
     <!-- no translation found for media_projection_entry_app_permission_dialog_option_text_single_app (2308901434964846084) -->
     <skip />
@@ -573,10 +570,10 @@
     <!-- no translation found for media_projection_entry_app_permission_dialog_option_text_entire_screen (5100078808078139706) -->
     <skip />
     <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="5504288438067851086">"Коли ви показуєте весь екран, для додатка <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> стає видимим увесь контент на ньому. Тому будьте обережні з паролями, повідомленнями, фотографіями, аудіо, відео, платіжною інформацією тощо."</string>
-    <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="7094417930857938876">"Коли ви показуєте додаток, для додатка <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> стає видимим увесь контент, що відображається або відтворюється в ньому. Тому будьте обережні з паролями, повідомленнями, фотографіями, аудіо, відео, платіжною інформацією тощо."</string>
+    <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="7094417930857938876">"Коли ви показуєте вікно додатка, увесь контент, що відображається або відтворюється в ньому, стає видимим у додатку <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>. Тому будьте обережні з паролями, повідомленнями, фотографіями, аудіо, відео, платіжною інформацією тощо."</string>
     <string name="media_projection_entry_app_permission_dialog_continue_entire_screen" msgid="1850848182344377579">"Показати екран"</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_share_app_selector_title" msgid="1419515119767501822">"Виберіть додаток, яким хочете поділитися"</string>
+    <string name="media_projection_entry_share_app_selector_title" msgid="1419515119767501822">"Виберіть додаток для показу"</string>
     <string name="media_projection_entry_cast_permission_dialog_title" msgid="752756942658159416">"Транслювати екран?"</string>
     <string name="media_projection_entry_cast_permission_dialog_option_text_single_app" msgid="6073353940838561981">"Транслювати один додаток"</string>
     <string name="media_projection_entry_cast_permission_dialog_option_text_entire_screen" msgid="8389508187954155307">"Транслювати весь екран"</string>
@@ -807,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Надіслати відгук"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Закрити"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Більше не показувати"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Ці сповіщення не можна змінити."</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Щоб відкрити, використайте відбиток пальця"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Пройдіть автентифікацію. Для цього торкніться сканера відбитків пальців."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"Поточний дзвінок"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Поточна активність"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"Мобільний трафік"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Підключено"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Тимчасово з’єднано"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Розкладний пристрій у розкладеному стані"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Розкладний пристрій обертається"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Передній екран увімкнено"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"складений"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"розкладений"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index 584375f..6460721 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -123,7 +123,7 @@
     <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_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_stop_label" msgid="72699670052087989">"روکیں"</string>
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"بیٹری کی فیصد نامعلوم ہے۔"</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> سے منسلک ہیں۔"</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> سے منسلک ہے۔"</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"گروپ کو پھیلائیں۔"</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"ایپلیکیشن کھولیں۔"</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"مربوط نہیں ہے۔"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"رومنگ"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"آف ہے"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"ہب موڈ دریافت کریں"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"چارج کرتے وقت اپنے پسندیدہ ویجیٹس اور اسکرین سیورز تک رسائی حاصل کریں۔"</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"آئیے شروع کریں"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"چارج کرتے وقت اپنے پسندیدہ اسکرین سیورز دکھائیں"</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>
@@ -807,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"تاثرات"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"برخاست کریں"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"دوبارہ نہ دکھائیں"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"ان اطلاعات کی ترمیم نہیں کی جا سکتی۔"</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"کھولنے کے لیے فنگر پرنٹ کا استعمال کریں"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"توثیق مطلوب ہے۔ توثیق کرنے کے لیے فنگر پرنٹ سینسر کو ٹچ کریں۔"</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"جاری کال"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"جاری ہے"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"موبائل ڈیٹا"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"منسلک ہے"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"عارضی طور پر منسلک ہے"</string>
@@ -1399,6 +1394,7 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"فولڈ ہونے والے آلے کو کھولا جا رہا ہے"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"فولڈ ہونے والے آلے کو گھمایا جا رہا ہے"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"فرنٹ اسکرین آن ہے"</string>
+    <string name="rear_display_unfolded_front_screen_on_slide_to_cancel" msgid="1455192420423012859">"اندرونی اسکرین کا استعمال کرنے کے لیے سلائیڈ کریں"</string>
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"فولڈ کردہ"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"اَن فولڈ کردہ"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index c69346f..6bcd9d6 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -804,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Suhbat bildirishnomalari tepasida va ekran qulfida profil rasmi sifatida chiqariladi, bulutcha sifatida chiqadi, Bezovta qilinmasin rejimini bekor qiladi"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Muhim"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasida suhbat funksiyalari ishlamaydi"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Fikr-mulohaza"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Yopish"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Boshqa chiqmasin"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Bu bildirishnomalarni tahrirlash imkonsiz."</string>
@@ -1395,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Buklanadigan qurilma ochilmoqda"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Buklanadigan qurilma aylantirilmoqda"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Old ekran yoqildi"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"buklangan"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"buklanmagan"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index eee9583..a9f24ed 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Tỷ lệ phần trăm pin không xác định."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Đã kết nối với <xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Đã kết nối với <xliff:g id="CAST">%s</xliff:g>."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"Mở rộng nhóm."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"Mở ứng dụng."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Chưa được kết nối."</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Chuyển vùng"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Tắt"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Khám phá chế độ thiết bị trung tâm"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Truy cập vào các tiện ích và trình bảo vệ màn hình mà bạn yêu thích trong khi sạc."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Bắt đầu"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Hiện trình bảo vệ màn hình bạn yêu thích trong khi sạc"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Chuyển đổi người dùng"</string>
     <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"trình đơn kéo xuống"</string>
     <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Tất cả ứng dụng và dữ liệu trong phiên này sẽ bị xóa."</string>
@@ -807,8 +804,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Hiện ở đầu phần thông báo cuộc trò chuyện và ở dạng ảnh hồ sơ trên màn hình khóa, xuất hiện ở dạng bong bóng, làm gián đoạn chế độ Không làm phiền"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Mức độ ưu tiên"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> không hỗ trợ các tính năng trò chuyện"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Phản hồi"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Đóng"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Không hiện lại"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Không thể sửa đổi các thông báo này."</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Dùng vân tay để mở"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Bạn cần phải xác thực. Hãy chạm vào cảm biến vân tay để xác thực."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"Cuộc gọi đang diễn ra"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Đang diễn ra"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"Dữ liệu di động"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Đã kết nối"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Tạm thời có kết nối"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Thiết bị có thể gập lại đang được mở ra"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Thiết bị có thể gập lại đang được lật ngược"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Đã bật màn hình trước"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"gập"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"mở"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 81f1bff..0f28d92 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"电池电量百分比未知。"</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"已连接到<xliff:g id="BLUETOOTH">%s</xliff:g>。"</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"已连接到 <xliff:g id="CAST">%s</xliff:g>。"</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"展开群组。"</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"打开应用。"</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"未连接。"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"漫游"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"已关闭"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"探索基座接入模式"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"充电时访问您喜爱的微件和屏保。"</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"现在就试试吧"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"在充电时显示您喜爱的屏保"</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>
@@ -807,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"反馈"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"关闭"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"不再显示"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"无法修改这些通知。"</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"使用指纹即可打开"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"需要进行身份验证。请轻触指纹传感器以验证身份。"</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"正在通话"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"正在进行"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"移动数据网络"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"已连接"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"已暂时连接"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"正在展开可折叠设备"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"正在翻转可折叠设备"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"前屏已开启"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"折叠状态"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"展开状态"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index b21f13f..6a29d86 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"電量百分比不明。"</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"已連線至<xliff:g id="BLUETOOTH">%s</xliff:g>。"</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"已連接至 <xliff:g id="CAST">%s</xliff:g>。"</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"展開群組。"</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"開啟應用程式。"</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"未連線。"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"漫遊"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"關閉"</string>
@@ -377,7 +375,7 @@
     <string name="quick_settings_cellular_detail_data_warning" msgid="7957253810481086455">"<xliff:g id="DATA_LIMIT">%s</xliff:g> 警告"</string>
     <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_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_until_sunrise" msgid="4063448287758262485">"在日出時關閉"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="3584738542293528235">"<xliff:g id="TIME">%s</xliff:g> 開啟"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"探索插座模式"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"在充電時存取你喜愛的小工具和螢幕保護程式。"</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"立即開始"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"充電時顯示常用螢幕保護程式"</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>
@@ -807,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"意見反映"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"關閉"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"不要再顯示"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"無法修改這些通知。"</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"使用指紋即可開啟"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"需要驗證。掂一下指紋感應器就可以驗證。"</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"通話中"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"進行中"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"流動數據"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"已連線"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"已暫時連線"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"正在展開折疊式裝置"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"正在翻轉折疊式裝置"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"正面螢幕已開啟"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"已摺疊"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"已打開"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index f2b0b86..a931304 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -250,10 +250,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"電池電量不明。"</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"已連線至<xliff:g id="BLUETOOTH">%s</xliff:g>。"</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"已連線至 <xliff:g id="CAST">%s</xliff:g>。"</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"展開群組。"</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"開啟應用程式。"</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"尚未連線。"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"漫遊"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"關閉"</string>
@@ -543,8 +541,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"瞭解 Hub 模式"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"在充電時使用喜愛的小工具和螢幕保護程式。"</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"開始使用"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"在充電時顯示你最愛的螢幕保護程式"</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>
@@ -807,8 +804,7 @@
     <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>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"意見回饋"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"關閉"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"不要再顯示"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"無法修改這些通知。"</string>
@@ -1308,8 +1304,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"使用指紋即可開啟"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"需要驗證。輕觸指紋感應器即可進行驗證。"</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"通話中"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"進行中"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"行動數據"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"已連線"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"已暫時建立連線"</string>
@@ -1399,6 +1394,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"正在展開的折疊式裝置"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"正在翻轉折疊式裝置"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"正面螢幕已開啟"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"已摺疊"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"已展開"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 445bdc0..08e6852 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -252,10 +252,8 @@
     <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Iphesenti lebhethri alaziwa."</string>
     <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Xhuma ku-<xliff:g id="BLUETOOTH">%s</xliff:g>."</string>
     <string name="accessibility_cast_name" msgid="7344437925388773685">"Ixhumeke ku-<xliff:g id="CAST">%s</xliff:g>."</string>
-    <!-- no translation found for accessibility_expand_group (521237935987978624) -->
-    <skip />
-    <!-- no translation found for accessibility_open_application (1749126077501259712) -->
-    <skip />
+    <string name="accessibility_expand_group" msgid="521237935987978624">"Nweba iqembu."</string>
+    <string name="accessibility_open_application" msgid="1749126077501259712">"Vula i-application."</string>
     <string name="accessibility_not_connected" msgid="4061305616351042142">"Akuxhunyiwe"</string>
     <string name="data_connection_roaming" msgid="375650836665414797">"Iyazulazula"</string>
     <string name="cell_data_off" msgid="4886198950247099526">"Valiwe"</string>
@@ -545,8 +543,7 @@
     <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Hlola imodi yehabhu"</string>
     <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Finyelela amawijethi akho ayintandokazi nezigcinisikrini ngenkathi ushaja."</string>
     <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Asihambe"</string>
-    <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) -->
-    <skip />
+    <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Bonisa izigcini zesikrini zakho eziyintandokazi ngenkathi ishaja"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Shintsha umsebenzisi"</string>
     <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"imenyu yokudonsela phansi"</string>
     <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Wonke ama-app nedatha kulesi sikhathi azosuswa."</string>
@@ -809,8 +806,7 @@
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Ivela phezu kwezaziso zengxoxo futhi njengesithombe sephrofayela esikrinini sokukhiya, ivela njengebhamuza, ukuphazamisa okuthi Ungaphazamisi"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Okubalulekile"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> ayisekeli izici zengxoxo"</string>
-    <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) -->
-    <skip />
+    <string name="notification_guts_bundle_feedback" msgid="7581587973879656500">"Impendulo"</string>
     <string name="notification_inline_dismiss" msgid="88423586921134258">"Chitha"</string>
     <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Ungabonisi futhi"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Lezi zaziso azikwazi ukushintshwa."</string>
@@ -1310,8 +1306,7 @@
     <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Sebenzisa izigxivizo zeminwe ukuvula"</string>
     <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Ukufakazela ubuqiniso budingekile. Thinta inzwa yezigxivizo zeminwe ukuze uqinisekise."</string>
     <string name="ongoing_call_content_description" msgid="6394763878322348560">"Ikholi eqhubekayo"</string>
-    <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) -->
-    <skip />
+    <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Okuqhubekayo"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"Idatha yeselula"</string>
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Ixhunyiwe"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Ixhume okwesikhashana"</string>
@@ -1401,6 +1396,8 @@
     <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Idivayisi egoqekayo iyembulwa"</string>
     <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Idivayisi egoqekayo iphendulwa nxazonke"</string>
     <string name="rear_display_unfolded_front_screen_on" msgid="5946436677205643170">"Isikrini sangaphambili sivuliwe"</string>
+    <!-- no translation found for rear_display_unfolded_front_screen_on_slide_to_cancel (1455192420423012859) -->
+    <skip />
     <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"kugoqiwe"</string>
     <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"kuvuliwe"</string>
     <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string>
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index 5f8f779..8665fd6 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -34,12 +34,12 @@
 
     <!-- Base colors for notification shade/scrim, the alpha component is adjusted programmatically
     to match the spec -->
-    <color name="shade_panel">@android:color/system_accent1_900</color>
-    <color name="surface_effect_0">@android:color/system_accent1_100</color>
+    <color name="shade_panel_base">@android:color/system_accent1_900</color>
+    <color name="notification_scrim_base">@android:color/system_accent1_100</color>
 
-    <!-- todo(b/388891904) Remove updated color references once they are available. -->
-    <color name="shade_panel_base">@color/shade_panel</color>
-    <color name="notification_scrim_base">@color/surface_effect_0</color>
+    <!-- Fallback colors for notification shade/scrim -->
+    <color name="shade_panel_fallback">@android:color/system_accent2_200</color>
+    <color name="notification_scrim_fallback">@android:color/system_surface_dim_light</color>
 
     <!-- The color of the background in the separated list of the Global Actions menu -->
     <color name="global_actions_separated_background">#F5F5F5</color>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 9b8926e..09aa224 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -1110,4 +1110,7 @@
     <!-- Configuration for wallpaper focal area -->
     <bool name="center_align_focal_area_shape">false</bool>
     <string name="focal_area_target" translatable="false" />
+
+    <!-- Configuration to swipe to open glanceable hub -->
+    <bool name="config_swipeToOpenGlanceableHub">false</bool>
 </resources>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 2d3c07b..8cd4c1b 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -203,7 +203,7 @@
     <!-- Size of the view displaying the mobile signal icon in the status bar. This value should
         match the core/status_bar_system_icon_size and change to sp unit -->
     <dimen name="status_bar_mobile_signal_size">15sp</dimen>
-    <dimen name="status_bar_mobile_signal_size_updated">14sp</dimen>
+    <dimen name="status_bar_mobile_signal_size_updated">12sp</dimen>
     <!-- Size of the view displaying the mobile signal icon in the status bar. This value should
         match the viewport height of mobile signal drawables such as ic_lte_mobiledata -->
     <dimen name="status_bar_mobile_type_size">16sp</dimen>
@@ -1242,8 +1242,11 @@
     <dimen name="min_window_blur_radius">1px</dimen>
     <dimen name="max_window_blur_radius">23px</dimen>
 
+    <!-- Blur radius of the Notification Shade content (notifications, footer, shelf) -->
+    <dimen name="max_shade_content_blur_radius">@dimen/max_window_blur_radius</dimen>
+
     <!-- Blur radius behind Notification Shade -->
-    <dimen name="max_shade_window_blur_radius">60dp</dimen>
+    <dimen name="max_shade_window_blur_radius">34dp</dimen>
 
     <!-- How much into a DisplayCutout's bounds we can go, on each side -->
     <dimen name="display_cutout_margin_consumption">0px</dimen>
@@ -1254,6 +1257,8 @@
     <dimen name="ongoing_appops_chip_side_padding">8dp</dimen>
     <!-- Margin between icons of Ongoing App Ops chip -->
     <dimen name="ongoing_appops_chip_icon_margin">4dp</dimen>
+    <!-- Side margins for the content of an appops chip -->
+    <dimen name="ongoing_appops_chip_content_horizontal_margin">10dp</dimen>
     <!-- Icon size of Ongoing App Ops chip -->
     <dimen name="ongoing_appops_chip_icon_size">16sp</dimen>
     <!-- Radius of Ongoing App Ops chip corners -->
@@ -1305,7 +1310,8 @@
     <dimen name="qs_media_seekbar_progress_amplitude">1.5dp</dimen>
     <dimen name="qs_media_seekbar_progress_phase">8dp</dimen>
     <dimen name="qs_media_seekbar_progress_stroke_width">2dp</dimen>
-    <dimen name="qs_media_session_collapsed_guideline">144dp</dimen>
+    <dimen name="qs_media_session_collapsed_legacy_guideline">144dp</dimen>
+    <dimen name="qs_media_session_collapsed_guideline">168dp</dimen>
 
     <!-- Size of Smartspace media recommendations cards in the QSPanel carousel -->
     <dimen name="qs_media_rec_default_width">380dp</dimen>
@@ -1811,6 +1817,7 @@
     <dimen name="ongoing_activity_chip_text_end_padding_for_embedded_padding_icon">6dp</dimen>
     <dimen name="ongoing_activity_chip_text_fading_edge_length">12dp</dimen>
     <dimen name="ongoing_activity_chip_corner_radius">28dp</dimen>
+    <dimen name="ongoing_activity_chip_outline_width">2px</dimen>
 
     <!-- Status bar user chip -->
     <dimen name="status_bar_user_chip_avatar_size">16dp</dimen>
@@ -2135,18 +2142,25 @@
     <dimen name="volume_dialog_width">60dp</dimen>
 
     <dimen name="volume_dialog_background_corner_radius">30dp</dimen>
-    <dimen name="volume_dialog_background_vertical_margin">-10dp</dimen>
+    <dimen name="volume_dialog_background_vertical_margin">
+        @dimen/volume_dialog_buttons_margin_negative
+    </dimen>
     <!-- top margin covers half the ringer button + components spacing -->
     <dimen name="volume_dialog_background_top_margin">-28dp</dimen>
 
+    <dimen name="volume_dialog_window_margin">14dp</dimen>
     <dimen name="volume_dialog_components_spacing">8dp</dimen>
     <dimen name="volume_dialog_floating_sliders_spacing">8dp</dimen>
     <dimen name="volume_dialog_floating_sliders_vertical_padding">10dp</dimen>
-    <dimen name="volume_dialog_floating_sliders_vertical_padding_negative">-10dp</dimen>
+    <dimen name="volume_dialog_floating_sliders_vertical_padding_negative">
+        @dimen/volume_dialog_buttons_margin_negative
+    </dimen>
     <dimen name="volume_dialog_floating_sliders_horizontal_padding">4dp</dimen>
     <dimen name="volume_dialog_button_size">40dp</dimen>
     <dimen name="volume_dialog_slider_width">52dp</dimen>
     <dimen name="volume_dialog_slider_height">254dp</dimen>
+    <dimen name="volume_dialog_buttons_margin">10dp</dimen>
+    <dimen name="volume_dialog_buttons_margin_negative">-10dp</dimen>
     <!--
         A primary goal of this margin is to vertically constraint slider height in the landscape
         orientation when the vertical space is limited
@@ -2159,7 +2173,11 @@
 
     <dimen name="volume_dialog_background_square_corner_radius">12dp</dimen>
 
-    <dimen name="volume_dialog_ringer_drawer_margin">10dp</dimen>
+    <dimen name="volume_dialog_ringer_drawer_margin">@dimen/volume_dialog_buttons_margin</dimen>
+    <!--
+     (volume_dialog_slider_width - volume_dialog_button_size) / 2
+     This centers ringer drawer against the volume slider
+    -->
     <dimen name="volume_dialog_ringer_drawer_diff_end_margin">6dp</dimen>
     <dimen name="volume_dialog_ringer_drawer_button_size">@dimen/volume_dialog_button_size</dimen>
     <dimen name="volume_dialog_ringer_drawer_button_icon_radius">10dp</dimen>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index d18a90a..e077b41 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -1351,6 +1351,10 @@
     <string name="accessibility_action_label_shrink_widget">Decrease height</string>
     <!-- Label for accessibility action to expand a widget in edit mode. [CHAR LIMIT=NONE] -->
     <string name="accessibility_action_label_expand_widget">Increase height</string>
+    <!-- Label for accessibility action to show the next media player. [CHAR LIMIT=NONE] -->
+    <string name="accessibility_action_label_umo_show_next">Show next</string>
+    <!-- Label for accessibility action to show the previous media player. [CHAR LIMIT=NONE] -->
+    <string name="accessibility_action_label_umo_show_previous">Show previous</string>
     <!-- Title shown above information regarding lock screen widgets. [CHAR LIMIT=50] -->
     <string name="communal_widgets_disclaimer_title">Lock screen widgets</string>
     <!-- Information about lock screen widgets presented to the user. [CHAR LIMIT=NONE] -->
@@ -2094,7 +2098,13 @@
     <string name="notification_inline_dismiss">Dismiss</string>
 
     <!-- [CHAR LIMIT=30] Text shown in button used to prevent app from showing Live Updates, for this notification and all future ones -->
-    <string name="notification_inline_disable_promotion">Don\'t show again</string>
+    <string name="notification_inline_disable_promotion">Don\'t show as pinned</string>
+
+    <!-- Text accompanying the "Show live updates" switch explaining the purpose of the setting -->
+    <string name="live_notifications_title">Showing Live Updates</string>
+
+    <!-- Text accompanying the "Show live updates" switch explaining the purpose of the setting -->
+    <string name="live_notifications_desc">Pinned notifications display live info from apps, and always appear on the status bar and lock screen</string>
 
     <!-- Notification: Control panel: Label that displays when the app's notifications cannot be blocked. -->
     <string name="notification_unblockable_desc">These notifications can\'t be modified.</string>
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index 7f2c893..8f808d3 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -93,13 +93,17 @@
         <item name="android:textColor">?android:attr/colorPrimary</item>
     </style>
 
-    <!-- Style for a status bar chip text that has a maximum width. Since there's so little room in
-         the status bar chip area, don't ellipsize the text and instead just fade it out a bit at
-         the end. -->
-    <style name="StatusBar.Chip.Text.LimitedWidth">
-        <item name="android:ellipsize">none</item>
-        <item name="android:requiresFadingEdge">horizontal</item>
-        <item name="android:fadingEdgeLength">@dimen/ongoing_activity_chip_text_fading_edge_length</item>
+    <style name="StatusBar.EventChip">
+        <item name="android:orientation">horizontal</item>
+        <item name="android:layout_width">wrap_content</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:layout_gravity">center</item>
+        <item name="android:gravity">center</item>
+        <item name="android:clipToOutline">true</item>
+        <item name="android:background">@drawable/statusbar_chip_bg</item>
+        <item name="android:minHeight">@dimen/ongoing_appops_chip_height</item>
+        <item name="android:maxWidth">@dimen/ongoing_appops_chip_max_width</item>
+        <item name="android:minWidth">@dimen/ongoing_appops_chip_min_width</item>
     </style>
 
     <style name="Chipbar" />
diff --git a/packages/SystemUI/res/xml/media_session_collapsed.xml b/packages/SystemUI/res/xml/media_session_collapsed.xml
index 66c54a3..b5efd04 100644
--- a/packages/SystemUI/res/xml/media_session_collapsed.xml
+++ b/packages/SystemUI/res/xml/media_session_collapsed.xml
@@ -64,6 +64,13 @@
         app:layout_constraintBottom_toBottomOf="@+id/album_art" />
 
     <Constraint
+        android:id="@+id/action_button_guideline"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        android:orientation="vertical"
+        app:layout_constraintGuide_end="@dimen/qs_media_session_collapsed_legacy_guideline" />
+
+    <Constraint
         android:id="@+id/header_title"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
diff --git a/packages/SystemUI/res/xml/volume_dialog_constraint_set.xml b/packages/SystemUI/res/xml/volume_dialog_constraint_set.xml
index a8f616c..dcc5d4f 100644
--- a/packages/SystemUI/res/xml/volume_dialog_constraint_set.xml
+++ b/packages/SystemUI/res/xml/volume_dialog_constraint_set.xml
@@ -8,7 +8,7 @@
         android:layout_width="@dimen/volume_dialog_slider_width"
         android:layout_height="0dp"
         android:layout_marginTop="@dimen/volume_dialog_slider_vertical_margin"
-        android:layout_marginEnd="@dimen/volume_dialog_components_spacing"
+        android:layout_marginEnd="@dimen/volume_dialog_window_margin"
         android:layout_marginBottom="@dimen/volume_dialog_slider_vertical_margin"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
diff --git a/packages/SystemUI/res/xml/volume_dialog_half_folded_constraint_set.xml b/packages/SystemUI/res/xml/volume_dialog_half_folded_constraint_set.xml
index b4d8ae7..3a5e41d 100644
--- a/packages/SystemUI/res/xml/volume_dialog_half_folded_constraint_set.xml
+++ b/packages/SystemUI/res/xml/volume_dialog_half_folded_constraint_set.xml
@@ -8,7 +8,7 @@
         android:layout_width="@dimen/volume_dialog_slider_width"
         android:layout_height="0dp"
         android:layout_marginTop="@dimen/volume_dialog_slider_vertical_margin"
-        android:layout_marginEnd="@dimen/volume_dialog_components_spacing"
+        android:layout_marginEnd="@dimen/volume_dialog_window_margin"
         android:layout_marginBottom="@dimen/volume_dialog_slider_vertical_margin"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
diff --git a/packages/SystemUI/res/xml/volume_dialog_ringer_drawer_motion_scene.xml b/packages/SystemUI/res/xml/volume_dialog_ringer_drawer_motion_scene.xml
index 1607121..4c3dbd7 100644
--- a/packages/SystemUI/res/xml/volume_dialog_ringer_drawer_motion_scene.xml
+++ b/packages/SystemUI/res/xml/volume_dialog_ringer_drawer_motion_scene.xml
@@ -20,30 +20,9 @@
         android:id="@+id/close_to_open_transition"
         app:constraintSetEnd="@+id/volume_dialog_ringer_drawer_open"
         app:constraintSetStart="@+id/volume_dialog_ringer_drawer_close"
-        app:transitionEasing="cubic(0.05, 0.7, 0.1, 1.0)"
-        app:duration="400">
-    </Transition>
+        app:duration="400"
+        app:transitionEasing="cubic(0.05, 0.7, 0.1, 1.0)" />
 
-    <ConstraintSet android:id="@+id/volume_dialog_ringer_drawer_close">
-        <Constraint
-            android:id="@+id/volume_ringer_drawer"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            app:layout_constraintTop_toTopOf="parent"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintEnd_toEndOf="parent"/>
-    </ConstraintSet>
-
-    <ConstraintSet android:id="@+id/volume_dialog_ringer_drawer_open">
-        <Constraint
-            android:id="@+id/volume_ringer_drawer"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            app:layout_constraintTop_toTopOf="parent"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintEnd_toEndOf="parent"/>
-    </ConstraintSet>
-
+    <ConstraintSet android:id="@+id/volume_dialog_ringer_drawer_close" />
+    <ConstraintSet android:id="@+id/volume_dialog_ringer_drawer_open" />
 </MotionScene>
\ No newline at end of file
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java
index 82ac78c..0372a6c6 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java
@@ -20,7 +20,6 @@
 import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON;
 import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL;
 
-import static com.android.systemui.Flags.glanceableHubBackAction;
 import static com.android.systemui.shared.Flags.shadeAllowBackGesture;
 
 import android.annotation.LongDef;
@@ -361,10 +360,6 @@
         }
         // Disable back gesture on the hub, but not when the shade is showing.
         if ((sysuiStateFlags & SYSUI_STATE_COMMUNAL_HUB_SHOWING) != 0) {
-            // Allow back gesture on Glanceable Hub with back action support.
-            if (glanceableHubBackAction()) {
-                return false;
-            }
             // Use QS expanded signal as the notification panel is always considered visible
             // expanded when on the lock screen and when opening hub over lock screen. This does
             // mean that back gesture is disabled when opening shade over hub while in portrait
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationListener.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationListener.java
index ff6bcdb..fcde508 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationListener.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationListener.java
@@ -16,6 +16,7 @@
 
 package com.android.systemui.shared.system;
 
+import android.annotation.Nullable;
 import android.graphics.Rect;
 import android.os.Bundle;
 import android.view.RemoteAnimationTarget;
@@ -42,5 +43,5 @@
      * Called when the task of an activity that has been started while the recents animation
      * was running becomes ready for control.
      */
-    void onTasksAppeared(RemoteAnimationTarget[] app);
+    void onTasksAppeared(RemoteAnimationTarget[] app, @Nullable TransitionInfo transitionInfo);
 }
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java
index fbe9edf..245283d 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java
@@ -41,6 +41,7 @@
 
 import com.android.app.animation.Interpolators;
 import com.android.internal.widget.LockscreenCredential;
+import com.android.systemui.Flags;
 import com.android.systemui.res.R;
 
 import java.util.ArrayList;
@@ -178,7 +179,13 @@
 
         mOkButton = findViewById(R.id.key_enter);
 
+        if (Flags.bouncerUiRevamp2()) {
+            mOkButton.setImageResource(R.drawable.pin_bouncer_confirm);
+        }
         mDeleteButton = findViewById(R.id.delete_button);
+        if (Flags.bouncerUiRevamp2()) {
+            mDeleteButton.setImageResource(R.drawable.pin_bouncer_delete);
+        }
         mDeleteButton.setVisibility(View.VISIBLE);
 
         mButtons[0] = findViewById(R.id.key0);
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
index 335a910..73dc282 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
@@ -98,7 +98,6 @@
 import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
 import com.android.settingslib.Utils;
 import com.android.settingslib.drawable.CircleFramedDrawable;
-import com.android.systemui.Flags;
 import com.android.systemui.FontStyles;
 import com.android.systemui.Gefingerpoken;
 import com.android.systemui.classifier.FalsingA11yDelegate;
@@ -121,6 +120,7 @@
     static final int USER_TYPE_PRIMARY = 1;
     static final int USER_TYPE_WORK_PROFILE = 2;
     static final int USER_TYPE_SECONDARY_USER = 3;
+    private boolean mTransparentModeEnabled = false;
 
     @IntDef({MODE_UNINITIALIZED, MODE_DEFAULT, MODE_ONE_HANDED, MODE_USER_SWITCHER})
     public @interface Mode {}
@@ -814,15 +814,30 @@
         mDisappearAnimRunning = false;
     }
 
+    /**
+     * Make the bouncer background transparent
+     */
+    public void enableTransparentMode() {
+        mTransparentModeEnabled = true;
+        reloadBackgroundColor();
+    }
+
+    /**
+     * Make the bouncer background opaque
+     */
+    public void disableTransparentMode() {
+        mTransparentModeEnabled = false;
+        reloadBackgroundColor();
+    }
+
     private void reloadBackgroundColor() {
-        if (Flags.bouncerUiRevamp()) {
-            // Keep the background transparent, otherwise the background color looks like a box
-            // while scaling the bouncer for back animation or while transitioning to the bouncer.
+        if (mTransparentModeEnabled) {
             setBackgroundColor(Color.TRANSPARENT);
         } else {
             setBackgroundColor(
                     getContext().getColor(com.android.internal.R.color.materialColorSurfaceDim));
         }
+        invalidate();
     }
 
     void reloadColors() {
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
index ff7b2b0..d10fce4 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
@@ -70,6 +70,7 @@
 import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
 import com.android.keyguard.dagger.KeyguardBouncerScope;
 import com.android.settingslib.utils.ThreadUtils;
+import com.android.systemui.Flags;
 import com.android.systemui.Gefingerpoken;
 import com.android.systemui.biometrics.FaceAuthAccessibilityDelegate;
 import com.android.systemui.bouncer.domain.interactor.BouncerMessageInteractor;
@@ -96,6 +97,8 @@
 import com.android.systemui.util.ViewController;
 import com.android.systemui.util.kotlin.JavaAdapter;
 import com.android.systemui.util.settings.GlobalSettings;
+import com.android.systemui.window.data.repository.WindowRootViewBlurRepository;
+import com.android.systemui.window.domain.interactor.WindowRootViewBlurInteractor;
 
 import dagger.Lazy;
 
@@ -134,6 +137,7 @@
     private final FalsingA11yDelegate mFalsingA11yDelegate;
     private final DeviceEntryFaceAuthInteractor mDeviceEntryFaceAuthInteractor;
     private final BouncerMessageInteractor mBouncerMessageInteractor;
+    private final Lazy<WindowRootViewBlurInteractor> mRootViewBlurInteractor;
     private int mTranslationY;
     private final KeyguardDismissTransitionInteractor mKeyguardDismissTransitionInteractor;
     private final DevicePolicyManager mDevicePolicyManager;
@@ -431,6 +435,7 @@
     private final Executor mBgExecutor;
     @Nullable
     private Job mSceneTransitionCollectionJob;
+    private Job mBlurEnabledCollectionJob;
 
     @Inject
     public KeyguardSecurityContainerController(KeyguardSecurityContainer view,
@@ -463,9 +468,11 @@
             KeyguardDismissTransitionInteractor keyguardDismissTransitionInteractor,
             Lazy<PrimaryBouncerInteractor> primaryBouncerInteractor,
             @Background Executor bgExecutor,
-            Provider<DeviceEntryInteractor> deviceEntryInteractor
+            Provider<DeviceEntryInteractor> deviceEntryInteractor,
+            Lazy<WindowRootViewBlurInteractor> rootViewBlurInteractorProvider
     ) {
         super(view);
+        mRootViewBlurInteractor = rootViewBlurInteractorProvider;
         view.setAccessibilityDelegate(faceAuthAccessibilityDelegate);
         mLockPatternUtils = lockPatternUtils;
         mUpdateMonitor = keyguardUpdateMonitor;
@@ -539,6 +546,32 @@
                 }
             );
         }
+
+        if (Flags.bouncerUiRevamp()) {
+            mBlurEnabledCollectionJob = mJavaAdapter.get().alwaysCollectFlow(
+                    mRootViewBlurInteractor.get().isBlurCurrentlySupported(),
+                    this::handleBlurSupportedChanged);
+        }
+    }
+
+    private void handleBlurSupportedChanged(boolean isWindowBlurSupported) {
+        if (isWindowBlurSupported) {
+            mView.enableTransparentMode();
+        } else {
+            mView.disableTransparentMode();
+        }
+    }
+
+    private void refreshBouncerBackground() {
+        // This is present solely for screenshot tests that disable blur by invoking setprop to
+        // disable blurs, however the mRootViewBlurInteractor#isBlurCurrentlySupported doesn't emit
+        // an updated value because sysui doesn't have a way to register for changes to setprop.
+        // KeyguardSecurityContainer view is inflated only once and doesn't re-inflate so it has to
+        // check the sysprop every time bouncer is about to be shown.
+        if (Flags.bouncerUiRevamp() && (ActivityManager.isRunningInUserTestHarness()
+                || ActivityManager.isRunningInTestHarness())) {
+            handleBlurSupportedChanged(!WindowRootViewBlurRepository.isDisableBlurSysPropSet());
+        }
     }
 
     @Override
@@ -552,6 +585,11 @@
             mSceneTransitionCollectionJob.cancel(null);
             mSceneTransitionCollectionJob = null;
         }
+
+        if (mBlurEnabledCollectionJob != null) {
+            mBlurEnabledCollectionJob.cancel(null);
+            mBlurEnabledCollectionJob = null;
+        }
     }
 
     /**  */
@@ -718,6 +756,8 @@
         if (bouncerUserSwitcher != null) {
             bouncerUserSwitcher.setAlpha(0f);
         }
+
+        refreshBouncerBackground();
     }
 
     @Override
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardViewController.java
index 5a9cbce..892851c 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardViewController.java
@@ -173,6 +173,11 @@
     boolean isBouncerShowing();
 
     /**
+     * Report when the UI is ready for dismissing the whole Keyguard.
+     */
+    void readyForKeyguardDone();
+
+    /**
      * Stop showing the alternate bouncer, if showing.
      *
      * <p>Should be like calling {@link #hideAlternateBouncer(boolean, boolean)} with a {@code true}
diff --git a/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java b/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java
index 2f74158..69e4fd7 100644
--- a/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java
+++ b/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java
@@ -15,6 +15,7 @@
  */
 package com.android.keyguard;
 
+import android.animation.Animator;
 import android.animation.AnimatorSet;
 import android.animation.ArgbEvaluator;
 import android.animation.ValueAnimator;
@@ -33,6 +34,9 @@
 import com.android.systemui.bouncer.shared.constants.PinBouncerConstants.Animation;
 import com.android.systemui.bouncer.shared.constants.PinBouncerConstants.Color;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * Provides background color and radius animations for key pad buttons.
  */
@@ -141,6 +145,7 @@
         mExpandAnimator.addUpdateListener(
                 anim -> mBackground.setCornerRadius((float) anim.getAnimatedValue()));
 
+        List<Animator> expandAnimators = new ArrayList<>();
         ValueAnimator expandBackgroundColorAnimator = ValueAnimator.ofObject(new ArgbEvaluator(),
                 mNormalBackgroundColor, mPressedBackgroundColor);
         expandBackgroundColorAnimator.setDuration(Animation.expansionColorDuration);
@@ -162,10 +167,27 @@
             }
         });
 
-        mExpandAnimatorSet = new AnimatorSet();
-        mExpandAnimatorSet.playTogether(mExpandAnimator,
-                expandBackgroundColorAnimator, expandTextColorAnimator);
+        expandAnimators.add(mExpandAnimator);
+        expandAnimators.add(expandBackgroundColorAnimator);
+        expandAnimators.add(expandTextColorAnimator);
 
+        if (Flags.bouncerUiRevamp2()) {
+            ValueAnimator expandTextScaleAnimator = ValueAnimator.ofFloat(
+                    Animation.normalTextScaleX, Animation.pressedTextScaleX);
+            expandTextScaleAnimator.setInterpolator(Animation.expansionInterpolator);
+            expandTextScaleAnimator.setDuration(Animation.expansionDuration);
+            expandTextScaleAnimator.addUpdateListener(valueAnimator -> {
+                if (mDigitTextView != null) {
+                    mDigitTextView.setTextScaleX((Float) valueAnimator.getAnimatedValue());
+                }
+            });
+            expandAnimators.add(expandTextScaleAnimator);
+        }
+
+        mExpandAnimatorSet = new AnimatorSet();
+        mExpandAnimatorSet.playTogether(expandAnimators);
+
+        List<Animator> contractAnimators = new ArrayList<>();
         mContractAnimator = ValueAnimator.ofFloat(1f, 0f);
         mContractAnimator.setStartDelay(Animation.contractionStartDelay);
         mContractAnimator.setDuration(Animation.contractionDuration);
@@ -195,9 +217,24 @@
             }
         });
 
+        contractAnimators.add(mContractAnimator);
+        contractAnimators.add(contractBackgroundColorAnimator);
+        contractAnimators.add(contractTextColorAnimator);
+
+        if (Flags.bouncerUiRevamp2()) {
+            ValueAnimator contractTextScaleAnimator = ValueAnimator.ofFloat(
+                    Animation.pressedTextScaleX, Animation.normalTextScaleX);
+            contractTextScaleAnimator.setInterpolator(Animation.contractionRadiusInterpolator);
+            contractTextScaleAnimator.setDuration(Animation.contractionDuration);
+            contractTextScaleAnimator.addUpdateListener(valueAnimator -> {
+                if (mDigitTextView != null) {
+                    mDigitTextView.setTextScaleX((Float) valueAnimator.getAnimatedValue());
+                }
+            });
+            contractAnimators.add(contractTextScaleAnimator);
+        }
         mContractAnimatorSet = new AnimatorSet();
-        mContractAnimatorSet.playTogether(mContractAnimator,
-                contractBackgroundColorAnimator, contractTextColorAnimator);
+        mContractAnimatorSet.playTogether(contractAnimators);
     }
 }
 
diff --git a/packages/SystemUI/src/com/android/keyguard/NumPadKey.java b/packages/SystemUI/src/com/android/keyguard/NumPadKey.java
index b152ff3..56aadc3 100644
--- a/packages/SystemUI/src/com/android/keyguard/NumPadKey.java
+++ b/packages/SystemUI/src/com/android/keyguard/NumPadKey.java
@@ -148,7 +148,7 @@
 
         if (bouncerUiRevamp2()) {
             mDigitText.setTypeface(
-                    Typeface.create(FontStyles.GSF_LABEL_LARGE_EMPHASIZED, Typeface.NORMAL));
+                    Typeface.create(FontStyles.GSF_LABEL_SMALL_EMPHASIZED, Typeface.NORMAL));
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/CameraAvailabilityListener.kt b/packages/SystemUI/src/com/android/systemui/CameraAvailabilityListener.kt
index ca83724..7af37bd 100644
--- a/packages/SystemUI/src/com/android/systemui/CameraAvailabilityListener.kt
+++ b/packages/SystemUI/src/com/android/systemui/CameraAvailabilityListener.kt
@@ -129,6 +129,11 @@
         listeners.remove(callback)
     }
 
+    fun debugFaceAuth(id: Int) {
+        val info = cameraProtectionInfoList?.getOrNull(id)
+        if (info != null) notifyCameraActive(info)
+    }
+
     private fun isExcluded(packageId: String): Boolean {
         return excludedPackageIds.contains(packageId)
     }
diff --git a/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt b/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt
index dbdf93d..8bb236b 100644
--- a/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt
+++ b/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt
@@ -87,7 +87,7 @@
 
     override fun enableShowProtection(isCameraActive: Boolean) {
         val scanningAnimationRequiredWhenCameraActive =
-                keyguardUpdateMonitor.isFaceDetectionRunning || authController.isShowing
+                keyguardUpdateMonitor.isFaceDetectionRunning || authController.isShowing || mDebug
         val faceAuthSucceeded = keyguardUpdateMonitor.isFaceAuthenticated
         val showScanningAnimationNow = scanningAnimationRequiredWhenCameraActive && isCameraActive
         if (showScanningAnimationNow == showScanningAnim) {
diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
index da206fa..e725353 100644
--- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
+++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
@@ -189,7 +189,7 @@
 
     @VisibleForTesting
     protected void showCameraProtection(@NonNull Path protectionPath, @NonNull Rect bounds) {
-        if (mFaceScanningFactory.shouldShowFaceScanningAnim()) {
+        if (mDebug || mFaceScanningFactory.shouldShowFaceScanningAnim()) {
             DisplayCutoutView overlay = (DisplayCutoutView) getOverlayView(
                     mFaceScanningViewId);
             if (overlay != null) {
@@ -395,6 +395,12 @@
                 setupDecorations();
             });
         }
+
+        if (cmd.getFaceAuthScreen() != null) {
+            mExecutor.execute(() -> {
+                debugTriggerFaceAuth(cmd.getFaceAuthScreen());
+            });
+        }
     };
 
     @Override
@@ -630,6 +636,15 @@
         }
     }
 
+    private void debugTriggerFaceAuth(int screen) {
+        DisplayCutoutView overlay = (DisplayCutoutView) getOverlayView(
+                mFaceScanningViewId);
+        if (overlay != null) {
+            overlay.setDebug(true);
+            mCameraListener.debugFaceAuth(screen);
+        }
+    }
+
     private void setupDecorations() {
         Trace.beginSection("ScreenDecorations#setupDecorations");
         setupDecorationsInner();
@@ -1360,6 +1375,7 @@
         final List<Rect> mBounds = new ArrayList();
         final Rect mBoundingRect = new Rect();
         Rect mTotalBounds = new Rect();
+        boolean mDebug = false;
 
         private int mColor = Color.BLACK;
         private int mRotation;
@@ -1378,6 +1394,10 @@
             }
         }
 
+        public void setDebug(boolean debug) {
+            mDebug = debug;
+        }
+
         public void setColor(int color) {
             if (color == mColor) {
                 return;
diff --git a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
index e2065f1..85f1880 100644
--- a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
@@ -126,7 +126,7 @@
         }
     };
 
-    private final int mFalsingThreshold;
+    private int mFalsingThreshold;
     private boolean mTouchAboveFalsingThreshold;
     private boolean mDisableHwLayers;
     private final boolean mFadeDependingOnAmountSwiped;
@@ -149,8 +149,7 @@
         // Extra long-press!
         mLongPressTimeout = (long) (ViewConfiguration.getLongPressTimeout() * 1.5f);
 
-        mDensityScale =  resources.getDisplayMetrics().density;
-        mFalsingThreshold = resources.getDimensionPixelSize(R.dimen.swipe_helper_falsing_threshold);
+        updateResourceProperties(resources);
         mFadeDependingOnAmountSwiped = resources.getBoolean(
                 R.bool.config_fadeDependingOnAmountSwiped);
         mFalsingManager = falsingManager;
@@ -165,6 +164,14 @@
                 getMaxEscapeAnimDuration() / 1000f);
     }
 
+    /** Update ane properties that depend on Resources */
+    public void updateResourceProperties(Resources resources) {
+        float density = resources.getDisplayMetrics().density;
+        setDensityScale(density);
+        mCallback.onDensityScaleChange(density);
+        mFalsingThreshold = resources.getDimensionPixelSize(R.dimen.swipe_helper_falsing_threshold);
+    }
+
     public void setDensityScale(float densityScale) {
         mDensityScale = densityScale;
     }
@@ -1001,5 +1008,8 @@
          * @return If true, the given view is draggable.
          */
         default boolean canChildBeDragged(@NonNull View animView) { return true; }
+
+        /** The density scale has changed */
+        void onDensityScaleChange(float density);
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/FullscreenMagnificationController.java b/packages/SystemUI/src/com/android/systemui/accessibility/FullscreenMagnificationController.java
index b2f3df6..d7bb667 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/FullscreenMagnificationController.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/FullscreenMagnificationController.java
@@ -352,7 +352,13 @@
         mTransaction
                 .addTransactionCommittedListener(
                         mExecutor,
-                        this::showBorder)
+                        () -> {
+                            if (getState() == ENABLING) {
+                                // Ensure that we are in the ENABLING process to avoid performing
+                                // animation on a null view.
+                                mShowBorderRunnable.run();
+                            }
+                        })
                 .setPosition(mBorderSurfaceControl, -mBorderOffset, -mBorderOffset)
                 .setLayer(mBorderSurfaceControl, Integer.MAX_VALUE)
                 .show(mBorderSurfaceControl)
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java
index a67ec65..8734d05 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java
@@ -296,6 +296,7 @@
         mGestureDetector =
                 new MagnificationGestureDetector(mContext, handler, this);
         mWindowInsetChangeRunnable = this::onWindowInsetChanged;
+        mWindowInsetChangeRunnable.run();
 
         // Initialize listeners.
         mMirrorViewRunnable = new Runnable() {
@@ -367,8 +368,12 @@
     private boolean updateSystemGestureInsetsTop() {
         final WindowMetrics windowMetrics = mWm.getCurrentWindowMetrics();
         final Insets insets = windowMetrics.getWindowInsets().getInsets(systemGestures());
-        final int gestureTop =
-                insets.bottom != 0 ? windowMetrics.getBounds().bottom - insets.bottom : -1;
+        final int gestureTop;
+        if (Flags.updateWindowMagnifierBottomBoundary()) {
+            gestureTop = windowMetrics.getBounds().bottom - insets.bottom;
+        } else {
+            gestureTop = insets.bottom != 0 ? windowMetrics.getBounds().bottom - insets.bottom : -1;
+        }
         if (gestureTop != mSystemGestureTop) {
             mSystemGestureTop = gestureTop;
             return true;
@@ -953,7 +958,6 @@
                 ? mSystemGestureTop - height + mOuterBorderSize
                 : mWindowBounds.bottom - height + mOuterBorderSize;
         final int y = MathUtils.clamp(mMagnificationFrame.top - mMirrorSurfaceMargin, minY, maxY);
-
         if (computeWindowSize) {
             LayoutParams params = (LayoutParams) mMirrorView.getLayoutParams();
             params.width = width;
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSettings.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSettings.java
index c14d28d..3b6f8f8 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSettings.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSettings.java
@@ -174,13 +174,14 @@
         @Override
         public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
             // Notify the service to update the magnifier scale only when the progress changed is
-            // triggered by user interaction on seekbar
-            if (fromUser) {
-                final float scale = transformProgressToScale(progress);
-                // We don't need to update the persisted scale when the seekbar progress is
-                // changing. The update should be triggered when the changing is ended.
-                mCallback.onMagnifierScale(scale, /* updatePersistence= */ false);
+            // triggered by user interaction on seekbar.
+            if (!fromUser) {
+                return;
             }
+            final float scale = transformProgressToScale(progress);
+            // We don't need to update the persisted scale when the seekbar progress is
+            // changing. The update should be triggered when the changing is ended.
+            mCallback.onMagnifierScale(scale, /* updatePersistence= */ false);
         }
 
         @Override
@@ -195,7 +196,7 @@
 
         @Override
         public void onUserInteractionFinalized(SeekBar seekBar, @ControlUnitType int control) {
-            // Update the Settings persisted scale only when user interaction with seekbar ends
+            // Update the Settings persisted scale only when user interaction with seekbar ends.
             final int progress = seekBar.getProgress();
             final float scale = transformProgressToScale(progress);
             mCallback.onMagnifierScale(scale, /* updatePersistence= */ true);
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/extradim/ExtraDimDialogManager.kt b/packages/SystemUI/src/com/android/systemui/accessibility/extradim/ExtraDimDialogManager.kt
index 3f717e2..f24c3be 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/extradim/ExtraDimDialogManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/extradim/ExtraDimDialogManager.kt
@@ -20,6 +20,7 @@
 import com.android.systemui.animation.DialogTransitionAnimator
 import com.android.systemui.animation.Expandable
 import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Main
 import com.android.systemui.plugins.ActivityStarter
 import com.android.systemui.statusbar.phone.SystemUIDialog
 import javax.inject.Inject
@@ -33,7 +34,7 @@
     private val extraDimDialogDelegateProvider: Provider<ExtraDimDialogDelegate>,
     private val mActivityStarter: ActivityStarter,
     private val dialogTransitionAnimator: DialogTransitionAnimator,
-    private val mainHandler: Handler,
+    @Main private val mainHandler: Handler,
 ) {
     private var dialog: SystemUIDialog? = null
 
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuController.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuController.java
index 67aa4ff..f8e4bda 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuController.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuController.java
@@ -40,6 +40,7 @@
 import com.android.systemui.accessibility.AccessibilityButtonModeObserver.AccessibilityButtonMode;
 import com.android.systemui.accessibility.AccessibilityButtonTargetsObserver;
 import com.android.systemui.dagger.SysUISingleton;
+import com.android.systemui.dagger.qualifiers.Main;
 import com.android.systemui.navigationbar.NavigationModeController;
 import com.android.systemui.settings.DisplayTracker;
 import com.android.systemui.util.settings.SecureSettings;
@@ -114,7 +115,7 @@
             SecureSettings secureSettings,
             DisplayTracker displayTracker,
             NavigationModeController navigationModeController,
-            Handler handler) {
+            @Main Handler handler) {
         mContext = context;
         mWindowManager = windowManager;
         mViewCaptureAwareWindowManager = viewCaptureAwareWindowManager;
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/fontscaling/FontScalingDialogDelegate.kt b/packages/SystemUI/src/com/android/systemui/accessibility/fontscaling/FontScalingDialogDelegate.kt
index eaf541d..76b5d82 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/fontscaling/FontScalingDialogDelegate.kt
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/fontscaling/FontScalingDialogDelegate.kt
@@ -88,7 +88,7 @@
         dialog.setPositiveButton(
             R.string.quick_settings_done,
             /* onClick = */ null,
-            /* dismissOnClick = */ true
+            /* dismissOnClick = */ true,
         )
     }
 
@@ -102,7 +102,7 @@
             labelArray[i] =
                 context.resources.getString(
                     com.android.settingslib.R.string.font_scale_percentage,
-                    (strEntryValues[i].toFloat() * 100).roundToInt()
+                    (strEntryValues[i].toFloat() * 100).roundToInt(),
                 )
         }
         seekBarWithIconButtonsView.setProgressStateLabels(labelArray)
@@ -132,7 +132,7 @@
 
                 override fun onUserInteractionFinalized(
                     seekBar: SeekBar,
-                    @ControlUnitType control: Int
+                    @ControlUnitType control: Int,
                 ) {
                     if (control == ControlUnitType.BUTTON) {
                         // The seekbar progress is changed by icon buttons
@@ -216,7 +216,7 @@
             !systemSettings.putStringForUser(
                 Settings.System.FONT_SCALE,
                 strEntryValues[lastProgress.get()],
-                userTracker.userId
+                userTracker.userId,
             )
         ) {
             title.post { doneButton.isEnabled = true }
@@ -228,13 +228,13 @@
         if (
             secureSettings.getStringForUser(
                 Settings.Secure.ACCESSIBILITY_FONT_SCALING_HAS_BEEN_CHANGED,
-                userTracker.userId
+                userTracker.userId,
             ) != ON
         ) {
             secureSettings.putStringForUser(
                 Settings.Secure.ACCESSIBILITY_FONT_SCALING_HAS_BEEN_CHANGED,
                 ON,
-                userTracker.userId
+                userTracker.userId,
             )
         }
     }
@@ -249,7 +249,7 @@
 
         title.setTextSize(
             TypedValue.COMPLEX_UNIT_PX,
-            previewConfigContext.resources.getDimension(R.dimen.dialog_title_text_size)
+            previewConfigContext.resources.getDimension(R.dimen.dialog_title_text_size),
         )
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/activity/data/model/AppVisibilityModel.kt b/packages/SystemUI/src/com/android/systemui/activity/data/model/AppVisibilityModel.kt
new file mode 100644
index 0000000..2d21d65
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/activity/data/model/AppVisibilityModel.kt
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.activity.data.model
+
+/** Describes an app's previous and current visibility to the user. */
+data class AppVisibilityModel(
+    /** True if the app is currently visible to the user and false otherwise. */
+    val isAppCurrentlyVisible: Boolean = false,
+    /**
+     * The last time this app became visible to the user, in
+     * [com.android.systemui.util.time.SystemClock.currentTimeMillis] units. Null if the app hasn't
+     * become visible since the flow started collection.
+     */
+    val lastAppVisibleTime: Long? = null,
+)
diff --git a/packages/SystemUI/src/com/android/systemui/activity/data/repository/ActivityManagerRepository.kt b/packages/SystemUI/src/com/android/systemui/activity/data/repository/ActivityManagerRepository.kt
index 94614b7..11831ea 100644
--- a/packages/SystemUI/src/com/android/systemui/activity/data/repository/ActivityManagerRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/activity/data/repository/ActivityManagerRepository.kt
@@ -18,9 +18,11 @@
 
 import android.app.ActivityManager
 import android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND
+import com.android.systemui.activity.data.model.AppVisibilityModel
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Background
 import com.android.systemui.log.core.Logger
+import com.android.systemui.util.time.SystemClock
 import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow
 import javax.inject.Inject
 import kotlin.coroutines.CoroutineContext
@@ -29,9 +31,23 @@
 import kotlinx.coroutines.flow.distinctUntilChanged
 import kotlinx.coroutines.flow.flowOn
 import kotlinx.coroutines.flow.onStart
+import kotlinx.coroutines.flow.scan
 
 /** Repository for interfacing with [ActivityManager]. */
 interface ActivityManagerRepository {
+
+    /**
+     * Given a UID, creates a flow that emits details about when the process with the given UID was
+     * and is visible to the user.
+     *
+     * @param identifyingLogTag a tag identifying who created this flow, used for logging.
+     */
+    fun createAppVisibilityFlow(
+        creationUid: Int,
+        logger: Logger,
+        identifyingLogTag: String,
+    ): Flow<AppVisibilityModel>
+
     /**
      * Given a UID, creates a flow that emits true when the process with the given UID is visible to
      * the user and false otherwise.
@@ -50,8 +66,38 @@
 @Inject
 constructor(
     @Background private val backgroundContext: CoroutineContext,
+    private val systemClock: SystemClock,
     private val activityManager: ActivityManager,
 ) : ActivityManagerRepository {
+
+    override fun createAppVisibilityFlow(
+        creationUid: Int,
+        logger: Logger,
+        identifyingLogTag: String,
+    ): Flow<AppVisibilityModel> {
+        return createIsAppVisibleFlow(creationUid, logger, identifyingLogTag)
+            .distinctUntilChanged()
+            .scan(initial = AppVisibilityModel()) {
+                oldState: AppVisibilityModel,
+                newIsVisible: Boolean ->
+                if (newIsVisible) {
+                    val lastAppVisibleTime = systemClock.currentTimeMillis()
+                    logger.d({ "$str1: Setting lastAppVisibleTime=$long1" }) {
+                        str1 = identifyingLogTag
+                        long1 = lastAppVisibleTime
+                    }
+                    AppVisibilityModel(
+                        isAppCurrentlyVisible = true,
+                        lastAppVisibleTime = lastAppVisibleTime,
+                    )
+                } else {
+                    // Reset the current status while maintaining the lastAppVisibleTime
+                    oldState.copy(isAppCurrentlyVisible = false)
+                }
+            }
+            .distinctUntilChanged()
+    }
+
     override fun createIsAppVisibleFlow(
         creationUid: Int,
         logger: Logger,
diff --git a/packages/SystemUI/src/com/android/systemui/back/domain/interactor/BackActionInteractor.kt b/packages/SystemUI/src/com/android/systemui/back/domain/interactor/BackActionInteractor.kt
index 11a6cb9..0b578c6 100644
--- a/packages/SystemUI/src/com/android/systemui/back/domain/interactor/BackActionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/back/domain/interactor/BackActionInteractor.kt
@@ -23,9 +23,7 @@
 import android.window.WindowOnBackInvokedDispatcher
 import com.android.app.tracing.coroutines.launchTraced as launch
 import com.android.systemui.CoreStartable
-import com.android.systemui.Flags.glanceableHubBackAction
 import com.android.systemui.Flags.predictiveBackAnimateShade
-import com.android.systemui.communal.domain.interactor.CommunalBackActionInteractor
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Application
 import com.android.systemui.plugins.statusbar.StatusBarStateController
@@ -52,7 +50,6 @@
     private val windowRootViewVisibilityInteractor: WindowRootViewVisibilityInteractor,
     private val shadeBackActionInteractor: ShadeBackActionInteractor,
     private val qsController: QuickSettingsController,
-    private val communalBackActionInteractor: CommunalBackActionInteractor,
 ) : CoreStartable {
 
     private var isCallbackRegistered = false
@@ -114,12 +111,6 @@
             shadeBackActionInteractor.animateCollapseQs(false)
             return true
         }
-        if (glanceableHubBackAction()) {
-            if (communalBackActionInteractor.canBeDismissed()) {
-                communalBackActionInteractor.onBackPressed()
-                return true
-            }
-        }
         if (shouldBackBeHandled()) {
             if (shadeBackActionInteractor.canBeCollapsed()) {
                 // this is the Shade dismiss animation, so make sure QQS closes when it ends.
diff --git a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterViewController.java b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterViewController.java
index 9a30c21..fcf5105 100644
--- a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterViewController.java
@@ -46,7 +46,10 @@
 
 import javax.inject.Inject;
 
-/** Controller for {@link BatteryMeterView}. **/
+/**
+ * Controller for {@link BatteryMeterView}.
+ * @deprecated once [NewStatusBarIcons] is rolled out, this class is no longer needed
+ */
 public class BatteryMeterViewController extends ViewController<BatteryMeterView> {
     private final ConfigurationController mConfigurationController;
     private final TunerService mTunerService;
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationService.java b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationService.java
index e5c2267..1ec7799 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationService.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationService.java
@@ -149,7 +149,7 @@
     public BiometricNotificationService(@NonNull @Main Context context,
             @NonNull KeyguardUpdateMonitor keyguardUpdateMonitor,
             @NonNull KeyguardStateController keyguardStateController,
-            @NonNull Handler handler, @NonNull NotificationManager notificationManager,
+            @NonNull @Main Handler handler, @NonNull NotificationManager notificationManager,
             @NonNull BiometricNotificationBroadcastReceiver biometricNotificationBroadcastReceiver,
             @NonNull Optional<FingerprintReEnrollNotification> fingerprintReEnrollNotification,
             @Nullable FingerprintManager fingerprintManager,
diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothDetailsContent.kt b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothDetailsContent.kt
index 710fde5..c664456 100644
--- a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothDetailsContent.kt
+++ b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothDetailsContent.kt
@@ -24,7 +24,7 @@
 import com.android.systemui.res.R
 
 @Composable
-fun BluetoothDetailsContent(detailsContentViewModel: BluetoothTileDialogViewModel) {
+fun BluetoothDetailsContent(detailsContentViewModel: BluetoothDetailsContentViewModel) {
     AndroidView(
         modifier = Modifier.fillMaxSize(),
         factory = { context ->
diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothDetailsContentManager.kt b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothDetailsContentManager.kt
index d873f41..eebcf0b 100644
--- a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothDetailsContentManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothDetailsContentManager.kt
@@ -62,7 +62,7 @@
 class BluetoothDetailsContentManager
 @AssistedInject
 constructor(
-    @Assisted private val initialUiProperties: BluetoothTileDialogViewModel.UiProperties,
+    @Assisted private val initialUiProperties: BluetoothDetailsContentViewModel.UiProperties,
     @Assisted private val cachedContentHeight: Int,
     @Assisted private val bluetoothTileDialogCallback: BluetoothTileDialogCallback,
     @Assisted private val isInDialog: Boolean,
@@ -114,7 +114,7 @@
     @AssistedFactory
     interface Factory {
         fun create(
-            initialUiProperties: BluetoothTileDialogViewModel.UiProperties,
+            initialUiProperties: BluetoothDetailsContentViewModel.UiProperties,
             cachedContentHeight: Int,
             dialogCallback: BluetoothTileDialogCallback,
             isInDialog: Boolean,
@@ -226,7 +226,7 @@
 
     internal fun onBluetoothStateUpdated(
         isEnabled: Boolean,
-        uiProperties: BluetoothTileDialogViewModel.UiProperties,
+        uiProperties: BluetoothDetailsContentViewModel.UiProperties,
     ) {
         bluetoothToggle.apply {
             isChecked = isEnabled
diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogViewModel.kt b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothDetailsContentViewModel.kt
similarity index 98%
rename from packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogViewModel.kt
rename to packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothDetailsContentViewModel.kt
index 308c9d1..ff2d9ef 100644
--- a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothDetailsContentViewModel.kt
@@ -61,12 +61,9 @@
 
 /**
  * ViewModel for Bluetooth Dialog or Bluetooth Details View after clicking on the Bluetooth QS tile.
- *
- * TODO: b/378513956 Rename this class to BluetoothDetailsContentViewModel, since it's not only used
- *   by the dialog view.
  */
 @SysUISingleton
-class BluetoothTileDialogViewModel
+class BluetoothDetailsContentViewModel
 @Inject
 constructor(
     private val deviceItemInteractor: DeviceItemInteractor,
@@ -312,7 +309,7 @@
         return bluetoothDialogDelegateFactory.create(
             getUiProperties(),
             getCachedContentHeight(),
-            this@BluetoothTileDialogViewModel,
+            this@BluetoothDetailsContentViewModel,
             { cancelJob() },
         )
     }
@@ -321,7 +318,7 @@
         return bluetoothDetailsContentManagerFactory.create(
             getUiProperties(),
             getCachedContentHeight(),
-            this@BluetoothTileDialogViewModel,
+            this@BluetoothDetailsContentViewModel,
             /* isInDialog= */ false,
             /* doneButtonCallback= */ fun() {},
         )
diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothDetailsViewModel.kt b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothDetailsViewModel.kt
index 4447531..5863a93 100644
--- a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothDetailsViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothDetailsViewModel.kt
@@ -20,7 +20,7 @@
 
 class BluetoothDetailsViewModel(
     private val onSettingsClick: () -> Unit,
-    val detailsContentViewModel: BluetoothTileDialogViewModel,
+    val detailsContentViewModel: BluetoothDetailsContentViewModel,
 ) : TileDetailsViewModel() {
     override fun clickOnSettingsButton() {
         onSettingsClick()
diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogDelegate.kt b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogDelegate.kt
index 01be820..c55f605 100644
--- a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogDelegate.kt
+++ b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogDelegate.kt
@@ -32,7 +32,7 @@
 class BluetoothTileDialogDelegate
 @AssistedInject
 constructor(
-    @Assisted private val initialUiProperties: BluetoothTileDialogViewModel.UiProperties,
+    @Assisted private val initialUiProperties: BluetoothDetailsContentViewModel.UiProperties,
     @Assisted private val cachedContentHeight: Int,
     @Assisted private val bluetoothTileDialogCallback: BluetoothTileDialogCallback,
     @Assisted private val dismissListener: Runnable,
@@ -48,7 +48,7 @@
     @AssistedFactory
     interface Factory {
         fun create(
-            initialUiProperties: BluetoothTileDialogViewModel.UiProperties,
+            initialUiProperties: BluetoothDetailsContentViewModel.UiProperties,
             cachedContentHeight: Int,
             dialogCallback: BluetoothTileDialogCallback,
             dimissListener: Runnable,
diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/shared/constants/KeyguardBouncerConstants.kt b/packages/SystemUI/src/com/android/systemui/bouncer/shared/constants/KeyguardBouncerConstants.kt
index e949dc6..149efcd 100644
--- a/packages/SystemUI/src/com/android/systemui/bouncer/shared/constants/KeyguardBouncerConstants.kt
+++ b/packages/SystemUI/src/com/android/systemui/bouncer/shared/constants/KeyguardBouncerConstants.kt
@@ -126,5 +126,8 @@
         @JvmField
         val contractionColorInterpolator =
             c(old = Interpolators.LINEAR, new = Interpolators.STANDARD)!!
+
+        const val pressedTextScaleX = 1.35f
+        const val normalTextScaleX = 1.0f
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/common/shared/colors/ShadeColors.kt b/packages/SystemUI/src/com/android/systemui/common/shared/colors/ShadeColors.kt
deleted file mode 100644
index 70ace6a..0000000
--- a/packages/SystemUI/src/com/android/systemui/common/shared/colors/ShadeColors.kt
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.common.shared.colors
-
-import android.content.res.Resources
-import android.graphics.Color
-import com.android.internal.graphics.ColorUtils
-import com.android.systemui.res.R
-
-object ShadeColors {
-    @JvmStatic
-    fun Resources.shadeBasePanel(): Int {
-        val layerAbove =
-            ColorUtils.setAlphaComponent(getColor(R.color.shade_panel), (0.4f * 255).toInt())
-        val layerBelow = ColorUtils.setAlphaComponent(Color.WHITE, (0.1f * 255).toInt())
-        return ColorUtils.compositeColors(layerAbove, layerBelow)
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/common/shared/colors/SurfaceEffectColors.kt b/packages/SystemUI/src/com/android/systemui/common/shared/colors/SurfaceEffectColors.kt
index d4027c0..7c2fc7f 100644
--- a/packages/SystemUI/src/com/android/systemui/common/shared/colors/SurfaceEffectColors.kt
+++ b/packages/SystemUI/src/com/android/systemui/common/shared/colors/SurfaceEffectColors.kt
@@ -17,9 +17,6 @@
 package com.android.systemui.common.shared.colors
 
 import android.content.res.Resources
-import android.graphics.Color
-import com.android.internal.graphics.ColorUtils
-import com.android.systemui.res.R
 
 object SurfaceEffectColors {
     @JvmStatic
diff --git a/packages/SystemUI/src/com/android/systemui/common/ui/view/SeekBarWithIconButtonsView.java b/packages/SystemUI/src/com/android/systemui/common/ui/view/SeekBarWithIconButtonsView.java
index 82bce0b..257a5a4 100644
--- a/packages/SystemUI/src/com/android/systemui/common/ui/view/SeekBarWithIconButtonsView.java
+++ b/packages/SystemUI/src/com/android/systemui/common/ui/view/SeekBarWithIconButtonsView.java
@@ -286,7 +286,8 @@
 
         /**
          * Notification that the user interaction with SeekBarWithIconButtonsView is finalized. This
-         * would be triggered after user ends dragging on the slider or clicks icon buttons.
+         * would be triggered after user ends dragging on the slider or clicks icon buttons. This is
+         * not called if the progress change was not initiated by the user.
          *
          * @param seekBar The SeekBar in which the user ends interaction with
          * @param control The last user interacted control unit. It would be
@@ -318,10 +319,14 @@
                             seekBar, OnSeekBarWithIconButtonsChangeListener.ControlUnitType.BUTTON);
                 } else {
                     mOnSeekBarChangeListener.onProgressChanged(seekBar, progress, fromUser);
-                    if (!mSeekByTouch) {
+                    if (!mSeekByTouch && fromUser) {
                         // Accessibility users could change the progress of the seekbar without
-                        // touching the seekbar or clicking the buttons. We will consider the
-                        // interaction has finished in this case.
+                        // touching the seekbar or clicking the buttons. In this, {@code fromUser}
+                        // will be true, and we will consider the interaction to be finished.
+                        // The seekbar progress could be changed when {@code fromUser} is false
+                        // when magnification scale is set by pinch-to-zoom, keyboard control, or
+                        // other services. In this case, we don't need to take finalized actions
+                        // for the progress change.
                         mOnSeekBarChangeListener.onUserInteractionFinalized(
                                 seekBar,
                                 OnSeekBarWithIconButtonsChangeListener.ControlUnitType.SLIDER);
diff --git a/packages/SystemUI/src/com/android/systemui/communal/CommunalBackupRestoreStartable.kt b/packages/SystemUI/src/com/android/systemui/communal/CommunalBackupRestoreStartable.kt
index 7abad14..18d461a 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/CommunalBackupRestoreStartable.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/CommunalBackupRestoreStartable.kt
@@ -29,6 +29,7 @@
 import com.android.systemui.communal.domain.interactor.CommunalInteractor
 import com.android.systemui.communal.widgets.CommunalWidgetModule
 import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Main
 import com.android.systemui.log.LogBuffer
 import com.android.systemui.log.core.Logger
 import com.android.systemui.log.dagger.CommunalLog
@@ -43,7 +44,7 @@
     private val communalInteractor: CommunalInteractor,
     @CommunalLog logBuffer: LogBuffer,
     private val secureSettings: SecureSettings,
-    handler: Handler,
+    @Main handler: Handler,
 ) : CoreStartable, BroadcastReceiver() {
 
     private val logger = Logger(logBuffer, TAG)
diff --git a/packages/SystemUI/src/com/android/systemui/communal/CommunalSceneStartable.kt b/packages/SystemUI/src/com/android/systemui/communal/CommunalSceneStartable.kt
index fc589b2..e36e855 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/CommunalSceneStartable.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/CommunalSceneStartable.kt
@@ -19,11 +19,8 @@
 import android.os.UserHandle
 import android.provider.Settings
 import com.android.app.tracing.coroutines.launchTraced as launch
-import com.android.compose.animation.scene.SceneKey
-import com.android.compose.animation.scene.TransitionKey
 import com.android.internal.logging.UiEventLogger
 import com.android.systemui.CoreStartable
-import com.android.systemui.Flags.communalSceneKtfRefactor
 import com.android.systemui.communal.domain.interactor.CommunalInteractor
 import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor
 import com.android.systemui.communal.domain.interactor.CommunalSettingsInteractor
@@ -31,36 +28,24 @@
 import com.android.systemui.communal.shared.model.CommunalScenes
 import com.android.systemui.communal.shared.model.CommunalScenes.isCommunal
 import com.android.systemui.communal.shared.model.CommunalTransitionKeys
-import com.android.systemui.communal.shared.model.EditModeState
 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.dock.DockManager
 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.TransitionStep
 import com.android.systemui.statusbar.NotificationShadeWindowController
-import com.android.systemui.statusbar.phone.CentralSurfaces
 import com.android.systemui.util.kotlin.emitOnStart
-import com.android.systemui.util.kotlin.getValue
 import com.android.systemui.util.kotlin.sample
 import com.android.systemui.util.settings.SettingsProxyExt.observerFlow
 import com.android.systemui.util.settings.SystemSettings
-import java.util.Optional
 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.Job
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.flow.collectLatest
 import kotlinx.coroutines.flow.combine
-import kotlinx.coroutines.flow.filterNotNull
 import kotlinx.coroutines.flow.launchIn
-import kotlinx.coroutines.flow.mapLatest
 import kotlinx.coroutines.flow.onEach
 import kotlinx.coroutines.withContext
 
@@ -72,16 +57,12 @@
 class CommunalSceneStartable
 @Inject
 constructor(
-    private val dockManager: DockManager,
     private val communalInteractor: CommunalInteractor,
     private val communalSettingsInteractor: CommunalSettingsInteractor,
     private val communalSceneInteractor: CommunalSceneInteractor,
-    private val keyguardTransitionInteractor: KeyguardTransitionInteractor,
     private val keyguardInteractor: KeyguardInteractor,
     private val systemSettings: SystemSettings,
-    centralSurfacesOpt: Optional<CentralSurfaces>,
     private val notificationShadeWindowController: NotificationShadeWindowController,
-    @Application private val applicationScope: CoroutineScope,
     @Background private val bgScope: CoroutineScope,
     @Main private val mainDispatcher: CoroutineDispatcher,
     private val uiEventLogger: UiEventLogger,
@@ -92,110 +73,11 @@
 
     private var isDreaming: Boolean = false
 
-    private val centralSurfaces: CentralSurfaces? by centralSurfacesOpt
-
     override fun start() {
         if (!communalSettingsInteractor.isCommunalFlagEnabled()) {
             return
         }
 
-        if (!communalSceneKtfRefactor()) {
-            // Handle automatically switching based on keyguard state.
-            keyguardTransitionInteractor.startedKeyguardTransitionStep
-                .mapLatest(::determineSceneAfterTransition)
-                .filterNotNull()
-                .onEach { (nextScene, nextTransition) ->
-                    // When launching a widget, we don't want to animate the scene change or the
-                    // Communal Hub will reveal the wallpaper even though it shouldn't. Instead we
-                    // snap to the new scene as part of the launch animation, once the activity
-                    // launch is done, so we don't change scene here.
-                    val delaySceneTransition =
-                        communalSceneInteractor.editModeState.value == EditModeState.STARTING ||
-                            communalSceneInteractor.isLaunchingWidget.value
-                    if (!delaySceneTransition) {
-                        communalSceneInteractor.changeScene(
-                            newScene = nextScene,
-                            loggingReason = "KTF syncing",
-                            transitionKey = nextTransition,
-                        )
-                    }
-                }
-                .launchIn(applicationScope)
-        }
-
-        // TODO(b/322787129): re-enable once custom animations are in place
-        // Handle automatically switching to communal when docked.
-        //        dockManager
-        //            .retrieveIsDocked()
-        //            // Allow some time after docking to ensure the dream doesn't start. If the
-        // dream
-        //            // starts, then we don't want to automatically transition to glanceable hub.
-        //            .debounce(DOCK_DEBOUNCE_DELAY)
-        //            .sample(keyguardTransitionInteractor.startedKeyguardState, ::Pair)
-        //            .onEach { (docked, lastStartedState) ->
-        //                if (docked && lastStartedState == KeyguardState.LOCKSCREEN) {
-        //                    communalInteractor.onSceneChanged(CommunalScenes.Communal)
-        //                }
-        //            }
-        //            .launchIn(bgScope)
-
-        systemSettings
-            .observerFlow(Settings.System.SCREEN_OFF_TIMEOUT)
-            // Read the setting value on start.
-            .emitOnStart()
-            .onEach {
-                screenTimeout =
-                    systemSettings.getIntForUser(
-                        Settings.System.SCREEN_OFF_TIMEOUT,
-                        DEFAULT_SCREEN_TIMEOUT,
-                        UserHandle.USER_CURRENT,
-                    )
-            }
-            .launchIn(bgScope)
-
-        // The hub mode timeout should start as soon as the user enters hub mode. At the end of the
-        // timer, if the device is dreaming, hub mode should closed and reveal the dream. If the
-        // dream is not running, nothing will happen. However if the dream starts again underneath
-        // hub mode after the initial timeout expires, such as if the device is docked or the dream
-        // app is updated by the Play store, a new timeout should be started.
-        bgScope.launch {
-            combine(
-                    communalSceneInteractor.currentScene,
-                    // Emit a value on start so the combine starts.
-                    communalInteractor.userActivity.emitOnStart(),
-                ) { scene, _ ->
-                    // Only timeout if we're on the hub is open.
-                    scene.isCommunal()
-                }
-                .collectLatest { shouldTimeout ->
-                    cancelHubTimeout()
-                    if (shouldTimeout) {
-                        startHubTimeout()
-                    }
-                }
-        }
-        bgScope.launch {
-            keyguardInteractor.isDreaming
-                .sample(communalSceneInteractor.currentScene, ::Pair)
-                .collectLatest { (isDreaming, scene) ->
-                    this@CommunalSceneStartable.isDreaming = isDreaming
-                    if (scene.isCommunal() && isDreaming && timeoutJob == null) {
-                        // If dreaming starts after timeout has expired, ex. if dream restarts under
-                        // the hub, wait for IS_ABLE_TO_DREAM_DELAY_MS and then close the hub. The
-                        // delay is necessary so the KeyguardInteractor.isAbleToDream flow passes
-                        // through that same amount of delay and publishes a new value which is then
-                        // picked up by the HomeSceneFamilyResolver such that the next call to
-                        // SceneInteractor.changeScene(Home) will resolve "Home" to "Dream".
-                        delay(KeyguardInteractor.IS_ABLE_TO_DREAM_DELAY_MS)
-                        communalSceneInteractor.changeScene(
-                            CommunalScenes.Blank,
-                            "dream started after timeout",
-                        )
-                        uiEventLogger.log(CommunalUiEvent.COMMUNAL_HUB_TIMEOUT)
-                    }
-                }
-        }
-
         bgScope.launch {
             communalSceneInteractor.isIdleOnCommunal.collectLatest {
                 withContext(mainDispatcher) {
@@ -203,6 +85,75 @@
                 }
             }
         }
+
+        // In V2, the timeout is handled by PowerManagerService since we no longer keep the dream
+        // active underneath the hub.
+        if (!communalSettingsInteractor.isV2FlagEnabled()) {
+            systemSettings
+                .observerFlow(Settings.System.SCREEN_OFF_TIMEOUT)
+                // Read the setting value on start.
+                .emitOnStart()
+                .onEach {
+                    screenTimeout =
+                        systemSettings.getIntForUser(
+                            Settings.System.SCREEN_OFF_TIMEOUT,
+                            DEFAULT_SCREEN_TIMEOUT,
+                            UserHandle.USER_CURRENT,
+                        )
+                }
+                .launchIn(bgScope)
+
+            // The hub mode timeout should start as soon as the user enters hub mode. At the end of
+            // the
+            // timer, if the device is dreaming, hub mode should closed and reveal the dream. If the
+            // dream is not running, nothing will happen. However if the dream starts again
+            // underneath
+            // hub mode after the initial timeout expires, such as if the device is docked or the
+            // dream
+            // app is updated by the Play store, a new timeout should be started.
+            bgScope.launch {
+                combine(
+                        communalSceneInteractor.currentScene,
+                        // Emit a value on start so the combine starts.
+                        communalInteractor.userActivity.emitOnStart(),
+                    ) { scene, _ ->
+                        // Only timeout if we're on the hub is open.
+                        scene.isCommunal()
+                    }
+                    .collectLatest { shouldTimeout ->
+                        cancelHubTimeout()
+                        if (shouldTimeout) {
+                            startHubTimeout()
+                        }
+                    }
+            }
+
+            bgScope.launch {
+                keyguardInteractor.isDreaming
+                    .sample(communalSceneInteractor.currentScene, ::Pair)
+                    .collectLatest { (isDreaming, scene) ->
+                        this@CommunalSceneStartable.isDreaming = isDreaming
+                        if (scene.isCommunal() && isDreaming && timeoutJob == null) {
+                            // If dreaming starts after timeout has expired, ex. if dream restarts
+                            // under
+                            // the hub, wait for IS_ABLE_TO_DREAM_DELAY_MS and then close the hub.
+                            // The
+                            // delay is necessary so the KeyguardInteractor.isAbleToDream flow
+                            // passes
+                            // through that same amount of delay and publishes a new value which is
+                            // then
+                            // picked up by the HomeSceneFamilyResolver such that the next call to
+                            // SceneInteractor.changeScene(Home) will resolve "Home" to "Dream".
+                            delay(KeyguardInteractor.IS_ABLE_TO_DREAM_DELAY_MS)
+                            communalSceneInteractor.changeScene(
+                                CommunalScenes.Blank,
+                                "dream started after timeout",
+                            )
+                            uiEventLogger.log(CommunalUiEvent.COMMUNAL_HUB_TIMEOUT)
+                        }
+                    }
+            }
+        }
     }
 
     private fun cancelHubTimeout() {
@@ -231,49 +182,7 @@
         }
     }
 
-    private suspend fun determineSceneAfterTransition(
-        lastStartedTransition: TransitionStep
-    ): Pair<SceneKey, TransitionKey>? {
-        val to = lastStartedTransition.to
-        val from = lastStartedTransition.from
-        val docked = dockManager.isDocked
-        val launchingActivityOverLockscreen =
-            centralSurfaces?.isLaunchingActivityOverLockscreen ?: false
-
-        return when {
-            to == KeyguardState.OCCLUDED && !launchingActivityOverLockscreen -> {
-                // Hide communal when an activity is started on keyguard, to ensure the activity
-                // underneath the hub is shown. When launching activities over lockscreen, we only
-                // change scenes once the activity launch animation is finished, so avoid
-                // changing the scene here.
-                Pair(CommunalScenes.Blank, CommunalTransitionKeys.SimpleFade)
-            }
-            to == KeyguardState.GLANCEABLE_HUB && from == KeyguardState.OCCLUDED -> {
-                // When transitioning to the hub from an occluded state, fade out the hub without
-                // doing any translation.
-                Pair(CommunalScenes.Communal, CommunalTransitionKeys.SimpleFade)
-            }
-            // Transitioning to Blank scene when entering the edit mode will be handled separately
-            // with custom animations.
-            to == KeyguardState.GONE && !communalInteractor.editModeOpen.value ->
-                Pair(CommunalScenes.Blank, CommunalTransitionKeys.SimpleFade)
-            !docked && !KeyguardState.deviceIsAwakeInState(to) -> {
-                // If the user taps the screen and wakes the device within this timeout, we don't
-                // want to dismiss the hub
-                delay(AWAKE_DEBOUNCE_DELAY)
-                Pair(CommunalScenes.Blank, CommunalTransitionKeys.SimpleFade)
-            }
-            from == KeyguardState.DOZING && to == KeyguardState.GLANCEABLE_HUB -> {
-                // Make sure the communal hub is showing when transitioning from dozing to hub.
-                Pair(CommunalScenes.Communal, CommunalTransitionKeys.SimpleFade)
-            }
-            else -> null
-        }
-    }
-
     companion object {
-        val AWAKE_DEBOUNCE_DELAY = 5.seconds
-        val DOCK_DEBOUNCE_DELAY = 1.seconds
         val DEFAULT_SCREEN_TIMEOUT = 15000
     }
 }
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 f01a6db..ff74162 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/dagger/CommunalModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/dagger/CommunalModule.kt
@@ -104,6 +104,7 @@
     companion object {
         const val LOGGABLE_PREFIXES = "loggable_prefixes"
         const val LAUNCHER_PACKAGE = "launcher_package"
+        const val SWIPE_TO_HUB = "swipe_to_hub"
 
         @Provides
         @Communal
@@ -143,5 +144,11 @@
         fun provideLauncherPackage(@Main resources: Resources): String {
             return resources.getString(R.string.launcher_overlayable_package)
         }
+
+        @Provides
+        @Named(SWIPE_TO_HUB)
+        fun provideSwipeToHub(@Main resources: Resources): Boolean {
+            return resources.getBoolean(R.bool.config_swipeToOpenGlanceableHub)
+        }
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalBackActionInteractor.kt b/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalBackActionInteractor.kt
deleted file mode 100644
index 2ccf96a..0000000
--- a/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalBackActionInteractor.kt
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.communal.domain.interactor
-
-import com.android.systemui.communal.shared.model.CommunalScenes
-import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.scene.domain.interactor.SceneInteractor
-import com.android.systemui.scene.shared.flag.SceneContainerFlag
-import com.android.systemui.scene.shared.model.Scenes
-import javax.inject.Inject
-
-/**
- * {@link CommunalBackActionInteractor} is responsible for handling back gestures on the glanceable
- * hub. When invoked SystemUI should navigate back to the lockscreen.
- */
-@SysUISingleton
-class CommunalBackActionInteractor
-@Inject
-constructor(
-    private val communalInteractor: CommunalInteractor,
-    private val communalSceneInteractor: CommunalSceneInteractor,
-    private val sceneInteractor: SceneInteractor,
-) {
-    fun canBeDismissed(): Boolean {
-        return communalInteractor.isCommunalShowing.value
-    }
-
-    fun onBackPressed() {
-        if (SceneContainerFlag.isEnabled) {
-            // TODO(b/384610333): Properly determine whether to go to dream or lockscreen on back.
-            sceneInteractor.changeScene(
-                toScene = Scenes.Lockscreen,
-                loggingReason = "CommunalBackActionInteractor",
-            )
-        } else {
-            communalSceneInteractor.changeScene(
-                newScene = CommunalScenes.Blank,
-                loggingReason = "CommunalBackActionInteractor",
-            )
-        }
-    }
-}
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 6dab32a..564628d 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
@@ -327,7 +327,7 @@
      * use [isIdleOnCommunal].
      */
     // TODO(b/323215860): rename to something more appropriate after cleaning up usages
-    val isCommunalShowing: StateFlow<Boolean> =
+    val isCommunalShowing: Flow<Boolean> =
         flow { emit(SceneContainerFlag.isEnabled) }
             .flatMapLatest { sceneContainerEnabled ->
                 if (sceneContainerEnabled) {
@@ -345,10 +345,10 @@
                 columnName = "isCommunalShowing",
                 initialValue = false,
             )
-            .stateIn(
+            .shareIn(
                 scope = applicationScope,
-                started = SharingStarted.Eagerly,
-                initialValue = false,
+                started = SharingStarted.WhileSubscribed(),
+                replay = 1,
             )
 
     /**
diff --git a/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalSceneTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalSceneTransitionInteractor.kt
index ec55401..477b871 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalSceneTransitionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalSceneTransitionInteractor.kt
@@ -16,11 +16,11 @@
 
 package com.android.systemui.communal.domain.interactor
 
+import com.android.app.tracing.coroutines.launchTraced as launch
 import com.android.compose.animation.scene.ObservableTransitionState
 import com.android.compose.animation.scene.SceneKey
 import com.android.compose.animation.scene.SceneTransitionLayout
 import com.android.systemui.CoreStartable
-import com.android.systemui.Flags.communalSceneKtfRefactor
 import com.android.systemui.communal.data.repository.CommunalSceneTransitionRepository
 import com.android.systemui.communal.shared.model.CommunalScenes
 import com.android.systemui.dagger.SysUISingleton
@@ -32,6 +32,7 @@
 import com.android.systemui.keyguard.shared.model.TransitionInfo
 import com.android.systemui.keyguard.shared.model.TransitionModeOnCanceled
 import com.android.systemui.keyguard.shared.model.TransitionState
+import com.android.systemui.power.domain.interactor.PowerInteractor
 import com.android.systemui.scene.shared.flag.SceneContainerFlag
 import com.android.systemui.util.kotlin.pairwise
 import java.util.UUID
@@ -44,7 +45,6 @@
 import kotlinx.coroutines.flow.filterNotNull
 import kotlinx.coroutines.flow.onStart
 import kotlinx.coroutines.flow.stateIn
-import com.android.app.tracing.coroutines.launchTraced as launch
 
 /**
  * This class listens to [SceneTransitionLayout] transitions and manages keyguard transition
@@ -66,6 +66,7 @@
     @Application private val applicationScope: CoroutineScope,
     private val sceneInteractor: CommunalSceneInteractor,
     private val repository: CommunalSceneTransitionRepository,
+    private val powerInteractor: PowerInteractor,
     keyguardInteractor: KeyguardInteractor,
 ) : CoreStartable, CommunalSceneInteractor.OnSceneAboutToChangeListener {
 
@@ -89,12 +90,15 @@
         combine(
                 // Don't use delayed dreaming signal as otherwise we might go to occluded or lock
                 // screen when closing hub if dream just started under the hub.
+                powerInteractor.isAsleep,
                 keyguardInteractor.isDreamingWithOverlay,
                 keyguardInteractor.isKeyguardOccluded,
                 keyguardInteractor.isKeyguardGoingAway,
                 keyguardInteractor.isKeyguardShowing,
-            ) { dreaming, occluded, keyguardGoingAway, keyguardShowing ->
-                if (keyguardGoingAway) {
+            ) { asleep, dreaming, occluded, keyguardGoingAway, keyguardShowing ->
+                if (asleep) {
+                    KeyguardState.DOZING
+                } else if (keyguardGoingAway) {
                     KeyguardState.GONE
                 } else if (occluded && !dreaming) {
                     KeyguardState.OCCLUDED
@@ -122,11 +126,7 @@
             )
 
     override fun start() {
-        if (
-            communalSceneKtfRefactor() &&
-                settingsInteractor.isCommunalFlagEnabled() &&
-                !SceneContainerFlag.isEnabled
-        ) {
+        if (settingsInteractor.isCommunalFlagEnabled() && !SceneContainerFlag.isEnabled) {
             sceneInteractor.registerSceneStateProcessor(this)
             listenForSceneTransitionProgress()
         }
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 49003a7..d061a33 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
@@ -153,7 +153,7 @@
     ) {}
 
     /** Called as the UI requests deleting a widget. */
-    open fun onDeleteWidget(id: Int, componentName: ComponentName, rank: Int) {}
+    open fun onDeleteWidget(id: Int, key: String, componentName: ComponentName, rank: Int) {}
 
     /** Called as the UI detects a tap event on the widget. */
     open fun onTapWidget(componentName: ComponentName, rank: Int) {}
@@ -202,6 +202,12 @@
     /** Called as the user request to show the customize widget button. */
     open fun onLongClick() {}
 
+    /** Called as the user requests to switch to the previous player in UMO. */
+    open fun onShowPreviousMedia() {}
+
+    /** Called as the user requests to switch to the next player in UMO. */
+    open fun onShowNextMedia() {}
+
     /** Called as the UI determines that a new widget has been added to the grid. */
     open fun onNewWidgetAdded(provider: AppWidgetProviderInfo) {}
 
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 8aba111..59beb1e 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
@@ -141,7 +141,10 @@
         metricsLogger.logAddWidget(componentName.flattenToString(), rank)
     }
 
-    override fun onDeleteWidget(id: Int, componentName: ComponentName, rank: Int) {
+    override fun onDeleteWidget(id: Int, key: String, componentName: ComponentName, rank: Int) {
+        if (selectedKey.value == key) {
+            setSelectedKey(null)
+        }
         communalInteractor.deleteWidget(id)
         metricsLogger.logRemoveWidget(componentName.flattenToString(), rank)
     }
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 4bc4400..2169881 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
@@ -19,6 +19,7 @@
 import android.content.ComponentName
 import com.android.app.tracing.coroutines.launchTraced as launch
 import com.android.systemui.Flags
+import com.android.systemui.communal.dagger.CommunalModule.Companion.SWIPE_TO_HUB
 import com.android.systemui.communal.domain.interactor.CommunalInteractor
 import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor
 import com.android.systemui.communal.domain.interactor.CommunalSettingsInteractor
@@ -92,6 +93,7 @@
     private val metricsLogger: CommunalMetricsLogger,
     mediaCarouselController: MediaCarouselController,
     blurConfig: BlurConfig,
+    @Named(SWIPE_TO_HUB) private val swipeToHub: Boolean,
 ) :
     BaseCommunalViewModel(
         communalSceneInteractor,
@@ -254,6 +256,14 @@
         }
     }
 
+    override fun onShowPreviousMedia() {
+        mediaCarouselController.mediaCarouselScrollHandler.scrollByStep(-1)
+    }
+
+    override fun onShowNextMedia() {
+        mediaCarouselController.mediaCarouselScrollHandler.scrollByStep(1)
+    }
+
     override fun onTapWidget(componentName: ComponentName, rank: Int) {
         metricsLogger.logTapWidget(componentName.flattenToString(), rank)
     }
@@ -349,6 +359,8 @@
     /** See [CommunalSettingsInteractor.isV2FlagEnabled] */
     fun v2FlagEnabled(): Boolean = communalSettingsInteractor.isV2FlagEnabled()
 
+    fun swipeToHubEnabled(): Boolean = swipeToHub
+
     companion object {
         const val POPUP_AUTO_HIDE_TIMEOUT_MS = 12000L
     }
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java b/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java
index 8e0beda..7354f40 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java
@@ -212,13 +212,6 @@
         return new UserScopedServiceImpl<>(context, CaptioningManager.class);
     }
 
-    /** */
-    @Provides
-    @Singleton
-    public Choreographer providesChoreographer() {
-        return Choreographer.getInstance();
-    }
-
     @Provides
     @Singleton
     static ColorDisplayManager provideColorDisplayManager(Context context) {
diff --git a/packages/SystemUI/src/com/android/systemui/decor/ScreenDecorCommand.kt b/packages/SystemUI/src/com/android/systemui/decor/ScreenDecorCommand.kt
index fa1d898..c5d5ca2 100644
--- a/packages/SystemUI/src/com/android/systemui/decor/ScreenDecorCommand.kt
+++ b/packages/SystemUI/src/com/android/systemui/decor/ScreenDecorCommand.kt
@@ -53,6 +53,14 @@
     val roundedBottom: RoundedCornerSubCommand? by
         subCommand(RoundedCornerSubCommand("rounded-bottom"))
 
+    val faceAuthScreen: Int? by
+        param(
+            longName = "faceAuthScreen",
+            description =
+                "Specify a screen to show face auth animation. 0:outer(default screen), 1:inner",
+            valueParser = Type.Int,
+        )
+
     override fun execute(pw: PrintWriter) {
         callback.onExecute(this, pw)
     }
@@ -61,6 +69,7 @@
         return "ScreenDecorCommand(" +
             "debug=$debug, " +
             "color=$color, " +
+            "faceAuthScreen=$faceAuthScreen, " +
             "roundedTop=$roundedTop, " +
             "roundedBottom=$roundedBottom)"
     }
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java
index abc810a..6b762ba 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java
@@ -40,6 +40,7 @@
 import android.view.Display;
 
 import com.android.internal.R;
+import com.android.systemui.dagger.qualifiers.Main;
 import com.android.systemui.doze.dagger.BrightnessSensor;
 import com.android.systemui.doze.dagger.DozeScope;
 import com.android.systemui.doze.dagger.WrappedService;
@@ -118,7 +119,7 @@
             @WrappedService DozeMachine.Service service,
             AsyncSensorManager sensorManager,
             @BrightnessSensor Optional<Sensor>[] lightSensorOptional,
-            DozeHost host, Handler handler,
+            DozeHost host, @Main Handler handler,
             AlwaysOnDisplayPolicy alwaysOnDisplayPolicy,
             WakefulnessLifecycle wakefulnessLifecycle,
             DozeParameters dozeParameters,
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java
index a56a63c..3132ec2 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java
@@ -53,7 +53,6 @@
 import com.android.internal.policy.PhoneWindow;
 import com.android.keyguard.KeyguardUpdateMonitor;
 import com.android.keyguard.KeyguardUpdateMonitorCallback;
-import com.android.systemui.Flags;
 import com.android.systemui.ambient.touch.TouchHandler;
 import com.android.systemui.ambient.touch.TouchMonitor;
 import com.android.systemui.ambient.touch.dagger.AmbientTouchComponent;
@@ -211,7 +210,6 @@
                 mCommunalVisible = communalVisible;
 
                 updateLifecycleStateLocked();
-                updateGestureBlockingLocked();
             });
         }
     };
@@ -594,8 +592,7 @@
 
     private void updateGestureBlockingLocked() {
         final boolean shouldBlock = mStarted && !mShadeExpanded && !mBouncerShowing
-                && !isDreamInPreviewMode()
-                && !(Flags.glanceableHubBackAction() && mCommunalVisible);
+                && !isDreamInPreviewMode();
 
         if (shouldBlock) {
             mGestureInteractor.addGestureBlockedMatcher(DREAM_TYPE_MATCHER,
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/homecontrols/service/TaskFragmentComponent.kt b/packages/SystemUI/src/com/android/systemui/dreams/homecontrols/service/TaskFragmentComponent.kt
index 67de30c..c815838 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/homecontrols/service/TaskFragmentComponent.kt
+++ b/packages/SystemUI/src/com/android/systemui/dreams/homecontrols/service/TaskFragmentComponent.kt
@@ -83,7 +83,8 @@
                             resultT.addTaskFragmentOperation(
                                 fragmentToken,
                                 TaskFragmentOperation.Builder(
-                                        TaskFragmentOperation.OP_TYPE_REORDER_TO_TOP_OF_TASK
+                                        TaskFragmentOperation
+                                            .OP_TYPE_PRIVILEGED_REORDER_TO_TOP_OF_TASK
                                     )
                                     .build(),
                             )
diff --git a/packages/SystemUI/src/com/android/systemui/flags/FlagDependencies.kt b/packages/SystemUI/src/com/android/systemui/flags/FlagDependencies.kt
index ebe228d..2650159 100644
--- a/packages/SystemUI/src/com/android/systemui/flags/FlagDependencies.kt
+++ b/packages/SystemUI/src/com/android/systemui/flags/FlagDependencies.kt
@@ -45,7 +45,6 @@
         // Internal notification backend dependencies
         crossAppPoliteNotifications dependsOn politeNotifications
         vibrateWhileUnlockedToken dependsOn politeNotifications
-        modesUi dependsOn modesApi
 
         // Internal notification frontend dependencies
         NotificationAvalancheSuppression.token dependsOn VisualInterruptionRefactor.token
@@ -71,9 +70,6 @@
     private inline val modesUi
         get() = FlagToken(android.app.Flags.FLAG_MODES_UI, android.app.Flags.modesUi())
 
-    private inline val modesApi
-        get() = FlagToken(android.app.Flags.FLAG_MODES_API, android.app.Flags.modesApi())
-
     private inline val communalHub
         get() = FlagToken(FLAG_COMMUNAL_HUB, communalHub())
 }
diff --git a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/domain/interactor/TutorialSchedulerInteractor.kt b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/domain/interactor/TutorialSchedulerInteractor.kt
index 9607053..b712fde 100644
--- a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/domain/interactor/TutorialSchedulerInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/domain/interactor/TutorialSchedulerInteractor.kt
@@ -39,6 +39,8 @@
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.drop
 import kotlinx.coroutines.flow.filter
 import kotlinx.coroutines.flow.first
 import kotlinx.coroutines.flow.flow
@@ -99,6 +101,25 @@
         waitForDeviceConnection(deviceType)
     }
 
+    // This flow is used by the notification updater once an initial notification is launched. It
+    // listens to the device connection changes for both keyboard and touchpad. When either of the
+    // device is disconnected, resolve the tutorial type base on the latest connection state.
+    // Dropping the initial state because it's the existing notification. Filtering out BOTH because
+    // we only care about disconnections.
+    val tutorialTypeUpdates: Flow<TutorialType> =
+        keyboardRepository.isAnyKeyboardConnected
+            .combine(touchpadRepository.isAnyTouchpadConnected, ::Pair)
+            .map { (keyboardConnected, touchpadConnected) ->
+                when {
+                    keyboardConnected && touchpadConnected -> TutorialType.BOTH
+                    keyboardConnected -> TutorialType.KEYBOARD
+                    touchpadConnected -> TutorialType.TOUCHPAD
+                    else -> TutorialType.NONE
+                }
+            }
+            .drop(1)
+            .filter { it != TutorialType.BOTH }
+
     private suspend fun waitForDeviceConnection(deviceType: DeviceType) =
         isAnyDeviceConnected[deviceType]!!.filter { it }.first()
 
@@ -172,6 +193,7 @@
                         pw.println(
                             "         launch time = ${repo.getScheduledTutorialLaunchTime(TOUCHPAD)}"
                         )
+                        pw.println("Delay time = ${LAUNCH_DELAY.seconds} sec")
                     }
                 "notify" -> {
                     if (args.size != 2) help(pw)
diff --git a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/TutorialNotificationCoordinator.kt b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/TutorialNotificationCoordinator.kt
index 3cba70e..a90c7ad 100644
--- a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/TutorialNotificationCoordinator.kt
+++ b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/TutorialNotificationCoordinator.kt
@@ -42,6 +42,9 @@
 import com.android.systemui.settings.UserTracker
 import javax.inject.Inject
 import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.flow.collectLatest
+import kotlinx.coroutines.flow.filter
 import kotlinx.coroutines.flow.merge
 
 /** When the scheduler is due, show a notification to launch tutorial */
@@ -55,19 +58,43 @@
     private val notificationManager: NotificationManager,
     private val userTracker: UserTracker,
 ) {
+    private var updaterJob: Job? = null
+
     fun start() {
         backgroundScope.launch {
             merge(
                     tutorialSchedulerInteractor.tutorials,
                     tutorialSchedulerInteractor.commandTutorials,
                 )
-                .collect { showNotification(it) }
+                .filter { it != TutorialType.NONE }
+                .collectLatest {
+                    showNotification(it)
+                    updaterJob?.cancel()
+                    updaterJob = backgroundScope.launch { updateWhenDeviceDisconnects() }
+                }
         }
     }
 
+    private suspend fun updateWhenDeviceDisconnects() {
+        // Only update the notification when there is an active one (i.e. if the notification has
+        // been dismissed by the user, or if the tutorial has been launched, there's no need to
+        // update)
+        tutorialSchedulerInteractor.tutorialTypeUpdates
+            .filter { hasNotification() }
+            .collect {
+                if (it == TutorialType.NONE)
+                    notificationManager.cancelAsUser(TAG, NOTIFICATION_ID, userTracker.userHandle)
+                else showNotification(it)
+            }
+    }
+
+    private fun hasNotification() =
+        notificationManager.activeNotifications.any { it.id == NOTIFICATION_ID }
+
     // By sharing the same tag and id, we update the content of existing notification instead of
     // creating multiple notifications
     private fun showNotification(tutorialType: TutorialType) {
+        // Safe guard - but this should never been reached
         if (tutorialType == TutorialType.NONE) return
 
         if (notificationManager.getNotificationChannel(CHANNEL_ID) == null)
diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/source/AccessibilityShortcutsSource.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/source/AccessibilityShortcutsSource.kt
index fdb80b2..978b873 100644
--- a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/source/AccessibilityShortcutsSource.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/source/AccessibilityShortcutsSource.kt
@@ -52,17 +52,15 @@
         val shortcuts = mutableListOf<KeyboardShortcutInfo>()
 
         if (keyboardA11yShortcutControl()) {
-            if (InputSettings.isAccessibilityBounceKeysFeatureEnabled()) {
-                shortcuts.add(
-                    // Toggle bounce keys:
-                    //  - Meta + Alt + 3
-                    shortcutInfo(
-                        resources.getString(R.string.group_accessibility_toggle_bounce_keys)
-                    ) {
-                        command(META_META_ON or META_ALT_ON, KEYCODE_3)
-                    }
-                )
-            }
+            shortcuts.add(
+                // Toggle bounce keys:
+                //  - Meta + Alt + 3
+                shortcutInfo(
+                    resources.getString(R.string.group_accessibility_toggle_bounce_keys)
+                ) {
+                    command(META_META_ON or META_ALT_ON, KEYCODE_3)
+                }
+            )
             if (InputSettings.isAccessibilityMouseKeysFeatureFlagEnabled()) {
                 shortcuts.add(
                     // Toggle mouse keys:
@@ -74,28 +72,24 @@
                     }
                 )
             }
-            if (InputSettings.isAccessibilityStickyKeysFeatureEnabled()) {
-                shortcuts.add(
-                    // Toggle sticky keys:
-                    //  - Meta + Alt + 5
-                    shortcutInfo(
-                        resources.getString(R.string.group_accessibility_toggle_sticky_keys)
-                    ) {
-                        command(META_META_ON or META_ALT_ON, KEYCODE_5)
-                    }
-                )
-            }
-            if (InputSettings.isAccessibilitySlowKeysFeatureFlagEnabled()) {
-                shortcuts.add(
-                    // Toggle slow keys:
-                    //  - Meta + Alt + 6
-                    shortcutInfo(
-                        resources.getString(R.string.group_accessibility_toggle_slow_keys)
-                    ) {
-                        command(META_META_ON or META_ALT_ON, KEYCODE_6)
-                    }
-                )
-            }
+            shortcuts.add(
+                // Toggle sticky keys:
+                //  - Meta + Alt + 5
+                shortcutInfo(
+                    resources.getString(R.string.group_accessibility_toggle_sticky_keys)
+                ) {
+                    command(META_META_ON or META_ALT_ON, KEYCODE_5)
+                }
+            )
+            shortcuts.add(
+                // Toggle slow keys:
+                //  - Meta + Alt + 6
+                shortcutInfo(
+                    resources.getString(R.string.group_accessibility_toggle_slow_keys)
+                ) {
+                    command(META_META_ON or META_ALT_ON, KEYCODE_6)
+                }
+            )
         }
 
         if (enableVoiceAccessKeyGestures()) {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index caf0fd4..efa9c21 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -16,6 +16,7 @@
 
 package com.android.systemui.keyguard;
 
+import static android.app.KeyguardManager.LOCK_ON_USER_SWITCH_CALLBACK;
 import static android.app.StatusBarManager.SESSION_KEYGUARD;
 import static android.provider.Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT;
 import static android.provider.Settings.System.LOCKSCREEN_SOUNDS_ENABLED;
@@ -75,6 +76,7 @@
 import android.os.DeadObjectException;
 import android.os.Handler;
 import android.os.IBinder;
+import android.os.IRemoteCallback;
 import android.os.Looper;
 import android.os.Message;
 import android.os.PowerManager;
@@ -192,6 +194,8 @@
 import java.lang.annotation.RetentionPolicy;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
 import java.util.Objects;
 import java.util.concurrent.Executor;
 import java.util.function.Consumer;
@@ -282,6 +286,9 @@
     private static final int SYSTEM_READY = 18;
     private static final int CANCEL_KEYGUARD_EXIT_ANIM = 19;
     private static final int BOOT_INTERACTOR = 20;
+    private static final int BEFORE_USER_SWITCHING = 21;
+    private static final int USER_SWITCHING = 22;
+    private static final int USER_SWITCH_COMPLETE = 23;
 
     /** Enum for reasons behind updating wakeAndUnlock state. */
     @Retention(RetentionPolicy.SOURCE)
@@ -299,6 +306,8 @@
         int WAKE_AND_UNLOCK = 3;
     }
 
+    private final List<LockNowCallback> mLockNowCallbacks = new ArrayList<>();
+
     /**
      * The default amount of time we stay awake (used for all key input)
      */
@@ -357,13 +366,18 @@
     private final Lazy<NotificationShadeDepthController> mNotificationShadeDepthController;
     private final Lazy<ShadeController> mShadeController;
     private final Lazy<CommunalSceneInteractor> mCommunalSceneInteractor;
+    /*
+     * Records the user id on request to go away, for validation when WM calls back to start the
+     * exit animation.
+     */
+    private int mGoingAwayRequestedForUserId = -1;
+
     private boolean mSystemReady;
     private boolean mBootCompleted;
     private boolean mBootSendUserPresent;
     private boolean mShuttingDown;
     private boolean mDozing;
     private boolean mAnimatingScreenOff;
-    private boolean mIgnoreDismiss;
     private final Context mContext;
     private final FalsingCollector mFalsingCollector;
 
@@ -626,6 +640,78 @@
                 }
             };
 
+    @VisibleForTesting
+    protected UserTracker.Callback mUserChangedCallback = new UserTracker.Callback() {
+
+        @Override
+        public void onBeforeUserSwitching(int newUser, @NonNull Runnable resultCallback) {
+            mHandler.sendMessage(mHandler.obtainMessage(BEFORE_USER_SWITCHING,
+                    newUser, 0, resultCallback));
+        }
+
+        @Override
+        public void onUserChanging(int newUser, @NonNull Context userContext,
+                @NonNull Runnable resultCallback) {
+            mHandler.sendMessage(mHandler.obtainMessage(USER_SWITCHING,
+                    newUser, 0, resultCallback));
+        }
+
+        @Override
+        public void onUserChanged(int newUser, Context userContext) {
+            mHandler.sendMessage(mHandler.obtainMessage(USER_SWITCH_COMPLETE,
+                    newUser, 0));
+        }
+    };
+
+    /**
+     * Handle {@link #BEFORE_USER_SWITCHING}
+     */
+    @VisibleForTesting
+    void handleBeforeUserSwitching(int userId, Runnable resultCallback) {
+        Log.d(TAG, String.format("onBeforeUserSwitching %d", userId));
+        synchronized (KeyguardViewMediator.this) {
+            mHandler.removeMessages(DISMISS);
+            notifyTrustedChangedLocked(mUpdateMonitor.getUserHasTrust(userId));
+            resetKeyguardDonePendingLocked();
+            adjustStatusBarLocked();
+            mKeyguardStateController.notifyKeyguardGoingAway(false);
+            if (mLockPatternUtils.isSecure(userId) && !mShowing) {
+                doKeyguardLocked(null);
+            } else {
+                resetStateLocked();
+            }
+            resultCallback.run();
+        }
+    }
+
+    /**
+     * Handle {@link #USER_SWITCHING}
+     */
+    @VisibleForTesting
+    void handleUserSwitching(int userId, Runnable resultCallback) {
+        Log.d(TAG, String.format("onUserSwitching %d", userId));
+        synchronized (KeyguardViewMediator.this) {
+            if (!mLockPatternUtils.isSecure(userId)) {
+                dismiss(null, null);
+            }
+            resultCallback.run();
+        }
+    }
+
+    /**
+     * Handle {@link #USER_SWITCH_COMPLETE}
+     */
+    @VisibleForTesting
+    void handleUserSwitchComplete(int userId) {
+        Log.d(TAG, String.format("onUserSwitchComplete %d", userId));
+        // Calling dismiss on a secure user will show the bouncer
+        if (mLockPatternUtils.isSecure(userId)) {
+            // We are calling dismiss with a delay as there are race conditions in some scenarios
+            // caused by async layout listeners
+            mHandler.postDelayed(() -> dismiss(null /* callback */, null /* message */), 500);
+        }
+    }
+
     KeyguardUpdateMonitorCallback mUpdateCallback = new KeyguardUpdateMonitorCallback() {
 
         @Override
@@ -642,27 +728,6 @@
         }
 
         @Override
-        public void onUserSwitching(int userId) {
-            Log.d(TAG, String.format("onUserSwitching %d", userId));
-            synchronized (KeyguardViewMediator.this) {
-                mIgnoreDismiss = true;
-                notifyTrustedChangedLocked(mUpdateMonitor.getUserHasTrust(userId));
-                resetKeyguardDonePendingLocked();
-                resetStateLocked();
-                adjustStatusBarLocked();
-            }
-        }
-
-        @Override
-        public void onUserSwitchComplete(int userId) {
-            mIgnoreDismiss = false;
-            Log.d(TAG, String.format("onUserSwitchComplete %d", userId));
-            // We are calling dismiss with a delay as there are race conditions in some scenarios
-            // caused by async layout listeners
-            mHandler.postDelayed(() -> dismiss(null /* callback */, null /* message */), 500);
-        }
-
-        @Override
         public void onDeviceProvisioned() {
             sendUserPresentBroadcast();
         }
@@ -1671,7 +1736,13 @@
                 com.android.internal.R.anim.lock_screen_behind_enter);
 
         mWorkLockController = new WorkLockActivityController(mContext, mUserTracker);
-
+        mUserTracker.addCallback(mUserChangedCallback, mContext.getMainExecutor());
+        // start() can be invoked in the middle of user switching, so check for this state and issue
+        // the call manually as that important event was missed.
+        if (mUserTracker.isUserSwitching()) {
+            handleBeforeUserSwitching(mUserTracker.getUserId(), () -> {});
+            handleUserSwitching(mUserTracker.getUserId(), () -> {});
+        }
         mJavaAdapter.alwaysCollectFlow(
                 mWallpaperRepository.getWallpaperSupportsAmbientMode(),
                 this::setWallpaperSupportsAmbientMode);
@@ -1720,7 +1791,7 @@
             // System ready can be invoked in the middle of user switching, so check for this state
             // and issue the call manually as that important event was missed.
             if (mUserTracker.isUserSwitching()) {
-                mUpdateCallback.onUserSwitching(mUserTracker.getUserId());
+                mUserChangedCallback.onUserChanging(mUserTracker.getUserId(), mContext, () -> {});
             }
         }
         // Most services aren't available until the system reaches the ready state, so we
@@ -2361,12 +2432,23 @@
             mCommunalSceneInteractor.get().showHubFromPowerButton();
         }
 
+        int currentUserId = mSelectedUserInteractor.getSelectedUserId();
+        if (options != null && options.getBinder(LOCK_ON_USER_SWITCH_CALLBACK) != null) {
+            LockNowCallback callback = new LockNowCallback(currentUserId,
+                    IRemoteCallback.Stub.asInterface(
+                            options.getBinder(LOCK_ON_USER_SWITCH_CALLBACK)));
+            synchronized (mLockNowCallbacks) {
+                mLockNowCallbacks.add(callback);
+            }
+            Log.d(TAG, "LockNowCallback required for user: " + callback.mUserId);
+        }
+
         // if another app is disabling us, don't show
         if (!mExternallyEnabled
                 && !mLockPatternUtils.isUserInLockdown(
                         mSelectedUserInteractor.getSelectedUserId())) {
             if (DEBUG) Log.d(TAG, "doKeyguard: not showing because externally disabled");
-
+            notifyLockNowCallback();
             mNeedToReshowWhenReenabled = true;
             return;
         }
@@ -2384,6 +2466,7 @@
                     // We're removing "reset" in the refactor - "resetting" the views will happen
                     // as a reaction to the root cause of the "reset" signal.
                     if (KeyguardWmStateRefactor.isEnabled()) {
+                        notifyLockNowCallback();
                         return;
                     }
 
@@ -2396,6 +2479,7 @@
                                     + "previously hiding. It should be safe to short-circuit "
                                     + "here.");
                     resetStateLocked(/* hideBouncer= */ false);
+                    notifyLockNowCallback();
                     return;
                 }
             } else {
@@ -2422,6 +2506,7 @@
                 Log.d(TAG, "doKeyguard: not showing because device isn't provisioned and the sim is"
                         + " not locked or missing");
             }
+            notifyLockNowCallback();
             return;
         }
 
@@ -2429,6 +2514,7 @@
         if (mLockPatternUtils.isLockScreenDisabled(mSelectedUserInteractor.getSelectedUserId())
                 && !lockedOrMissing && !forceShow) {
             if (DEBUG) Log.d(TAG, "doKeyguard: not showing because lockscreen is off");
+            notifyLockNowCallback();
             return;
         }
 
@@ -2476,11 +2562,6 @@
     }
 
     public void dismiss(IKeyguardDismissCallback callback, CharSequence message) {
-        if (mIgnoreDismiss) {
-            android.util.Log.i(TAG, "Ignoring request to dismiss (user switch in progress?)");
-            return;
-        }
-
         if (mKeyguardStateController.isKeyguardGoingAway()) {
             Log.i(TAG, "Ignoring dismiss because we're already going away.");
             return;
@@ -2498,7 +2579,7 @@
     }
 
     private void resetStateLocked(boolean hideBouncer) {
-        if (DEBUG) Log.e(TAG, "resetStateLocked");
+        if (DEBUG) Log.d(TAG, "resetStateLocked");
         Message msg = mHandler.obtainMessage(RESET, hideBouncer ? 1 : 0, 0);
         mHandler.sendMessage(msg);
     }
@@ -2746,6 +2827,18 @@
                     message = "BOOT_INTERACTOR";
                     handleBootInteractor();
                     break;
+                case BEFORE_USER_SWITCHING:
+                    message = "BEFORE_USER_SWITCHING";
+                    handleBeforeUserSwitching(msg.arg1, (Runnable) msg.obj);
+                    break;
+                case USER_SWITCHING:
+                    message = "USER_SWITCHING";
+                    handleUserSwitching(msg.arg1, (Runnable) msg.obj);
+                    break;
+                case USER_SWITCH_COMPLETE:
+                    message = "USER_SWITCH_COMPLETE";
+                    handleUserSwitchComplete(msg.arg1);
+                    break;
             }
             Log.d(TAG, "KeyguardViewMediator queue processing message: " + message);
         }
@@ -2887,6 +2980,9 @@
         mUiBgExecutor.execute(() -> {
             Log.d(TAG, "updateActivityLockScreenState(" + showing + ", " + aodShowing + ", "
                     + reason + ")");
+            if (showing) {
+                notifyLockNowCallback();
+            }
 
             if (KeyguardWmStateRefactor.isEnabled()) {
                 // Handled in WmLockscreenVisibilityManager if flag is enabled.
@@ -2931,6 +3027,7 @@
         synchronized (KeyguardViewMediator.this) {
             if (!mSystemReady) {
                 if (DEBUG) Log.d(TAG, "ignoring handleShow because system is not ready.");
+                notifyLockNowCallback();
                 return;
             }
             if (DEBUG) Log.d(TAG, "handleShow");
@@ -2989,12 +3086,11 @@
         }
     }
 
-    private final Runnable mKeyguardGoingAwayRunnable = new Runnable() {
+    final Runnable mKeyguardGoingAwayRunnable = new Runnable() {
         @SuppressLint("MissingPermission")
         @Override
         public void run() {
             Trace.beginSection("KeyguardViewMediator.mKeyGuardGoingAwayRunnable");
-            Log.d(TAG, "keyguardGoingAwayRunnable");
             mKeyguardViewControllerLazy.get().keyguardGoingAway();
 
             int flags = 0;
@@ -3031,6 +3127,10 @@
 
             // Handled in WmLockscreenVisibilityManager if flag is enabled.
             if (!KeyguardWmStateRefactor.isEnabled()) {
+                mGoingAwayRequestedForUserId = mSelectedUserInteractor.getSelectedUserId();
+                Log.d(TAG, "keyguardGoingAway requested for userId: "
+                        + mGoingAwayRequestedForUserId);
+
                 // Don't actually hide the Keyguard at the moment, wait for window manager
                 // until it tells us it's safe to do so with startKeyguardExitAnimation.
                 // Posting to mUiOffloadThread to ensure that calls to ActivityTaskManager
@@ -3169,6 +3269,30 @@
             RemoteAnimationTarget[] nonApps, IRemoteAnimationFinishedCallback finishedCallback) {
         Log.d(TAG, "handleStartKeyguardExitAnimation startTime=" + startTime
                 + " fadeoutDuration=" + fadeoutDuration);
+        int currentUserId = mSelectedUserInteractor.getSelectedUserId();
+        if (!KeyguardWmStateRefactor.isEnabled() && mGoingAwayRequestedForUserId != currentUserId) {
+            Log.e(TAG, "Not executing handleStartKeyguardExitAnimationInner() due to userId "
+                    + "mismatch. Requested: " + mGoingAwayRequestedForUserId + ", current: "
+                    + currentUserId);
+            if (finishedCallback != null) {
+                // There will not execute animation, send a finish callback to ensure the remote
+                // animation won't hang there.
+                try {
+                    finishedCallback.onAnimationFinished();
+                } catch (RemoteException e) {
+                    Slog.w(TAG, "Failed to call onAnimationFinished", e);
+                }
+            }
+            mHiding = false;
+            if (mLockPatternUtils.isSecure(currentUserId)) {
+                doKeyguardLocked(null);
+            } else {
+                resetStateLocked();
+                dismiss(null, null);
+            }
+            return;
+        }
+
         synchronized (KeyguardViewMediator.this) {
             mIsKeyguardExitAnimationCanceled = false;
             // Tell ActivityManager that we canceled the keyguard animation if
@@ -3413,6 +3537,13 @@
      * app transition before finishing the current RemoteAnimation, or the keyguard being re-shown).
      */
     private void handleCancelKeyguardExitAnimation() {
+        if (!KeyguardWmStateRefactor.isEnabled()
+                && mGoingAwayRequestedForUserId != mSelectedUserInteractor.getSelectedUserId()) {
+            Log.e(TAG, "Setting pendingLock = true due to userId mismatch. Requested: "
+                    + mGoingAwayRequestedForUserId + ", current: "
+                    + mSelectedUserInteractor.getSelectedUserId());
+            setPendingLock(true);
+        }
         if (mPendingLock) {
             Log.d(TAG, "#handleCancelKeyguardExitAnimation: keyguard exit animation cancelled. "
                     + "There's a pending lock, so we were cancelled because the device was locked "
@@ -3513,6 +3644,7 @@
         mSurfaceBehindRemoteAnimationRequested = true;
 
         if (ENABLE_NEW_KEYGUARD_SHELL_TRANSITIONS && !KeyguardWmStateRefactor.isEnabled()) {
+            mGoingAwayRequestedForUserId = mSelectedUserInteractor.getSelectedUserId();
             startKeyguardTransition(false /* keyguardShowing */, false /* aodShowing */);
             return;
         }
@@ -3533,6 +3665,9 @@
 
             if (!KeyguardWmStateRefactor.isEnabled()) {
                 // Handled in WmLockscreenVisibilityManager.
+                mGoingAwayRequestedForUserId = mSelectedUserInteractor.getSelectedUserId();
+                Log.d(TAG, "keyguardGoingAway requested for userId: "
+                        + mGoingAwayRequestedForUserId);
                 mActivityTaskManagerService.keyguardGoingAway(flags);
             }
         } catch (RemoteException e) {
@@ -3988,6 +4123,29 @@
         mUiBgExecutor.execute(mTrustManager::reportKeyguardShowingChanged);
     }
 
+    private void notifyLockNowCallback() {
+        List<LockNowCallback> callbacks;
+        synchronized (mLockNowCallbacks) {
+            callbacks = new ArrayList<LockNowCallback>(mLockNowCallbacks);
+            mLockNowCallbacks.clear();
+        }
+        Iterator<LockNowCallback> iter = callbacks.listIterator();
+        while (iter.hasNext()) {
+            LockNowCallback callback = iter.next();
+            iter.remove();
+            if (callback.mUserId != mSelectedUserInteractor.getSelectedUserId()) {
+                Log.i(TAG, "Not notifying lockNowCallback due to user mismatch");
+                continue;
+            }
+            Log.i(TAG, "Notifying lockNowCallback");
+            try {
+                callback.mRemoteCallback.sendResult(null);
+            } catch (RemoteException e) {
+                Log.e(TAG, "Could not issue LockNowCallback sendResult", e);
+            }
+        }
+    }
+
     private void notifyTrustedChangedLocked(boolean trusted) {
         int size = mKeyguardStateCallbacks.size();
         for (int i = size - 1; i >= 0; i--) {
@@ -4152,4 +4310,14 @@
             }
         };
     }
+
+    private class LockNowCallback {
+        final int mUserId;
+        final IRemoteCallback mRemoteCallback;
+
+        LockNowCallback(int userId, IRemoteCallback remoteCallback) {
+            mUserId = userId;
+            mRemoteCallback = remoteCallback;
+        }
+    }
 }
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 2a1cb12..f7ed10f 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
@@ -24,6 +24,7 @@
 import android.os.Trace
 import android.util.Log
 import com.android.app.animation.Interpolators
+import com.android.app.tracing.coroutines.flow.traceAs
 import com.android.app.tracing.coroutines.withContextTraced as withContext
 import com.android.systemui.Flags.transitionRaceCondition
 import com.android.systemui.dagger.SysUISingleton
@@ -43,7 +44,6 @@
 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
@@ -143,11 +143,12 @@
     @SuppressLint("SharedFlowCreation")
     private val _transitions =
         MutableSharedFlow<TransitionStep>(
-            replay = 2,
-            extraBufferCapacity = 20,
-            onBufferOverflow = BufferOverflow.DROP_OLDEST,
-        )
-    override val transitions = _transitions.asSharedFlow().distinctUntilChanged()
+                replay = 2,
+                extraBufferCapacity = 20,
+                onBufferOverflow = BufferOverflow.DROP_OLDEST,
+            )
+            .traceAs("KTR-transitions")
+    override val transitions = _transitions.distinctUntilChanged()
     private var lastStep: TransitionStep = TransitionStep()
     private var lastAnimator: ValueAnimator? = null
     private var animatorListener: AnimatorListenerAdapter? = null
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 c755c4b..a3796ab 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
@@ -17,8 +17,12 @@
 package com.android.systemui.keyguard.domain.interactor
 
 import android.animation.ValueAnimator
+import com.android.app.tracing.coroutines.launchTraced as launch
 import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor
 import com.android.systemui.communal.domain.interactor.CommunalInteractor
+import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor
+import com.android.systemui.communal.domain.interactor.CommunalSettingsInteractor
+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.dagger.qualifiers.Main
@@ -46,7 +50,6 @@
 import kotlinx.coroutines.flow.merge
 import kotlinx.coroutines.flow.onEach
 import kotlinx.coroutines.flow.onStart
-import com.android.app.tracing.coroutines.launchTraced as launch
 
 @SysUISingleton
 class FromAlternateBouncerTransitionInteractor
@@ -60,6 +63,8 @@
     @Main mainDispatcher: CoroutineDispatcher,
     keyguardInteractor: KeyguardInteractor,
     private val communalInteractor: CommunalInteractor,
+    private val communalSettingsInteractor: CommunalSettingsInteractor,
+    private val communalSceneInteractor: CommunalSceneInteractor,
     powerInteractor: PowerInteractor,
     keyguardOcclusionInteractor: KeyguardOcclusionInteractor,
     private val primaryBouncerInteractor: PrimaryBouncerInteractor,
@@ -86,7 +91,7 @@
             .transition(
                 edge = Edge.create(from = KeyguardState.ALTERNATE_BOUNCER, to = Scenes.Gone),
                 edgeWithoutSceneContainer =
-                    Edge.create(from = KeyguardState.ALTERNATE_BOUNCER, to = KeyguardState.GONE)
+                    Edge.create(from = KeyguardState.ALTERNATE_BOUNCER, to = KeyguardState.GONE),
             )
             .map {
                 // The alt bouncer is pretty fast to hide, so start the surface behind animation
@@ -112,27 +117,21 @@
                     keyguardInteractor.primaryBouncerShowing,
                     powerInteractor.isAwake,
                     keyguardInteractor.isAodAvailable,
-                    communalInteractor.isIdleOnCommunal,
-                    communalInteractor.editModeOpen,
+                    communalSceneInteractor.isIdleOnCommunal,
+                    keyguardInteractor.isDreaming,
                     keyguardInteractor.isKeyguardOccluded,
                 )
                 .filterRelevantKeyguardStateAnd {
-                    (isAlternateBouncerShowing, isPrimaryBouncerShowing, _, _, _) ->
+                    (isAlternateBouncerShowing, isPrimaryBouncerShowing, _, _, _, _) ->
                     !isAlternateBouncerShowing && !isPrimaryBouncerShowing
                 }
-                .collect {
-                    (
-                        _,
-                        _,
-                        isAwake,
-                        isAodAvailable,
-                        isIdleOnCommunal,
-                        isCommunalEditMode,
-                        isOccluded) ->
+                .collect { (_, _, isAwake, isAodAvailable, isIdleOnCommunal, isDreaming, isOccluded)
+                    ->
                     // When unlocking over glanceable hub to enter edit mode, transitioning directly
                     // to GONE prevents the lockscreen flash. Let listenForAlternateBouncerToGone
                     // handle it.
-                    if (isCommunalEditMode) return@collect
+                    if (communalInteractor.editModeOpen.value) return@collect
+                    val hubV2 = communalSettingsInteractor.isV2FlagEnabled()
                     val to =
                         if (!isAwake) {
                             if (isAodAvailable) {
@@ -141,16 +140,32 @@
                                 KeyguardState.DOZING
                             }
                         } else {
-                            if (isIdleOnCommunal) {
+                            if (!hubV2 && isIdleOnCommunal) {
                                 if (SceneContainerFlag.isEnabled) return@collect
                                 KeyguardState.GLANCEABLE_HUB
-                            } else if (isOccluded) {
+                            } else if (isOccluded && !isDreaming) {
                                 KeyguardState.OCCLUDED
+                            } else if (hubV2 && isDreaming) {
+                                KeyguardState.DREAMING
+                            } else if (hubV2 && isIdleOnCommunal) {
+                                if (SceneContainerFlag.isEnabled) return@collect
+                                KeyguardState.GLANCEABLE_HUB
                             } else {
                                 KeyguardState.LOCKSCREEN
                             }
                         }
-                    startTransitionTo(to)
+
+                    if (hubV2 && to != KeyguardState.GLANCEABLE_HUB && isIdleOnCommunal) {
+                        // If bouncer is showing over the hub, we need to make sure we
+                        // properly dismiss the hub when transitioning away.
+                        communalSceneInteractor.changeScene(
+                            newScene = CommunalScenes.Blank,
+                            loggingReason = "alternate bouncer no longer showing over GH",
+                            keyguardState = to,
+                        )
+                    } else {
+                        startTransitionTo(to)
+                    }
                 }
         }
     }
@@ -173,7 +188,7 @@
                         } else {
                             emptyFlow()
                         }
-                    }
+                    },
                 )
                 .filterRelevantKeyguardState()
                 .collect { startTransitionTo(KeyguardState.GONE) }
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 eb96c92..0700ec6 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
@@ -21,7 +21,6 @@
 import android.app.DreamManager
 import com.android.app.animation.Interpolators
 import com.android.app.tracing.coroutines.launchTraced as launch
-import com.android.systemui.Flags.communalSceneKtfRefactor
 import com.android.systemui.communal.domain.interactor.CommunalInteractor
 import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor
 import com.android.systemui.communal.domain.interactor.CommunalSettingsInteractor
@@ -155,12 +154,12 @@
                 .sample(
                     communalInteractor.isCommunalAvailable,
                     communalInteractor.shouldShowCommunal,
-                    communalSceneInteractor.isIdleOnCommunal,
                 )
-                .collect { (_, isCommunalAvailable, shouldShowCommunal, isIdleOnCommunal) ->
+                .collect { (_, isCommunalAvailable, shouldShowCommunal) ->
                     val isKeyguardOccludedLegacy = keyguardInteractor.isKeyguardOccluded.value
                     val primaryBouncerShowing = keyguardInteractor.primaryBouncerShowing.value
                     val isKeyguardGoingAway = keyguardInteractor.isKeyguardGoingAway.value
+                    val canStartDreaming = dreamManager.canStartDreaming(false)
 
                     if (!deviceEntryInteractor.isLockscreenEnabled()) {
                         if (!SceneContainerFlag.isEnabled) {
@@ -187,16 +186,19 @@
                         }
                     } else if (isKeyguardOccludedLegacy) {
                         startTransitionTo(KeyguardState.OCCLUDED)
-                    } else if (isIdleOnCommunal && !communalSceneKtfRefactor()) {
-                        if (!SceneContainerFlag.isEnabled) {
-                            startTransitionTo(KeyguardState.GLANCEABLE_HUB)
-                        }
                     } else if (
                         shouldTransitionToCommunal(shouldShowCommunal, isCommunalAvailable)
                     ) {
                         if (!SceneContainerFlag.isEnabled) {
                             transitionToGlanceableHub()
                         }
+                    } else if (canStartDreaming) {
+                        // If we're waking up to dream, transition directly to dreaming without
+                        // showing the lockscreen.
+                        startTransitionTo(
+                            KeyguardState.DREAMING,
+                            ownerReason = "moving from doze to dream",
+                        )
                     } else {
                         startTransitionTo(KeyguardState.LOCKSCREEN)
                     }
@@ -217,7 +219,6 @@
                 .sample(
                     communalInteractor.shouldShowCommunal,
                     communalInteractor.isCommunalAvailable,
-                    communalSceneInteractor.isIdleOnCommunal,
                     keyguardInteractor.biometricUnlockState,
                     wakeToGoneInteractor.canWakeDirectlyToGone,
                     keyguardInteractor.primaryBouncerShowing,
@@ -227,7 +228,6 @@
                         _,
                         shouldShowCommunal,
                         isCommunalAvailable,
-                        isIdleOnCommunal,
                         biometricUnlockState,
                         canWakeDirectlyToGone,
                         primaryBouncerShowing) ->
@@ -252,13 +252,6 @@
                                     ownerReason = "waking from dozing",
                                 )
                             }
-                        } else if (isIdleOnCommunal && !communalSceneKtfRefactor()) {
-                            if (!SceneContainerFlag.isEnabled) {
-                                startTransitionTo(
-                                    KeyguardState.GLANCEABLE_HUB,
-                                    ownerReason = "waking from dozing",
-                                )
-                            }
                         } else if (
                             shouldTransitionToCommunal(shouldShowCommunal, isCommunalAvailable)
                         ) {
@@ -276,15 +269,11 @@
         }
     }
 
-    private suspend fun transitionToGlanceableHub() {
-        if (communalSceneKtfRefactor()) {
-            communalSceneInteractor.snapToScene(
-                newScene = CommunalScenes.Communal,
-                loggingReason = "from dozing to hub",
-            )
-        } else {
-            startTransitionTo(KeyguardState.GLANCEABLE_HUB)
-        }
+    private fun transitionToGlanceableHub() {
+        communalSceneInteractor.snapToScene(
+            newScene = CommunalScenes.Communal,
+            loggingReason = "from dozing to hub",
+        )
     }
 
     /** Dismisses keyguard from the DOZING state. */
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 c1c509b..0fb98ff 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
@@ -21,7 +21,6 @@
 import android.app.DreamManager
 import com.android.app.animation.Interpolators
 import com.android.app.tracing.coroutines.launchTraced as launch
-import com.android.systemui.Flags.communalSceneKtfRefactor
 import com.android.systemui.communal.domain.interactor.CommunalInteractor
 import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor
 import com.android.systemui.communal.domain.interactor.CommunalSettingsInteractor
@@ -59,7 +58,6 @@
     @Background bgDispatcher: CoroutineDispatcher,
     @Main mainDispatcher: CoroutineDispatcher,
     keyguardInteractor: KeyguardInteractor,
-    private val glanceableHubTransitions: GlanceableHubTransitions,
     private val communalInteractor: CommunalInteractor,
     private val communalSceneInteractor: CommunalSceneInteractor,
     private val communalSettingsInteractor: CommunalSettingsInteractor,
@@ -87,11 +85,7 @@
         listenForDreamingToLockscreenOrGone()
         listenForDreamingToAodOrDozing()
         listenForTransitionToCamera(scope, keyguardInteractor)
-        if (!communalSceneKtfRefactor()) {
-            listenForDreamingToGlanceableHub()
-        } else {
-            listenForDreamingToGlanceableHubFromPowerButton()
-        }
+        listenForDreamingToGlanceableHubFromPowerButton()
         listenForDreamingToPrimaryBouncer()
     }
 
@@ -105,18 +99,6 @@
         }
     }
 
-    private fun listenForDreamingToGlanceableHub() {
-        if (!communalSettingsInteractor.isCommunalFlagEnabled()) return
-        if (SceneContainerFlag.isEnabled) return
-        scope.launch("$TAG#listenForDreamingToGlanceableHub", mainDispatcher) {
-            glanceableHubTransitions.listenForGlanceableHubTransition(
-                transitionOwnerName = TAG,
-                fromState = KeyguardState.DREAMING,
-                toState = KeyguardState.GLANCEABLE_HUB,
-            )
-        }
-    }
-
     /**
      * Normally when pressing power button from the dream, the devices goes from DREAMING to DOZING,
      * then [FromDozingTransitionInteractor] handles the transition to GLANCEABLE_HUB. However if
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 c5d40a0..2eeba0f 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
@@ -19,7 +19,6 @@
 import android.animation.ValueAnimator
 import com.android.app.animation.Interpolators
 import com.android.app.tracing.coroutines.launchTraced as launch
-import com.android.systemui.Flags.communalSceneKtfRefactor
 import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor
 import com.android.systemui.communal.domain.interactor.CommunalSettingsInteractor
 import com.android.systemui.communal.shared.model.CommunalScenes
@@ -31,12 +30,10 @@
 import com.android.systemui.keyguard.KeyguardWmStateRefactor
 import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository
 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.scene.shared.flag.SceneContainerFlag
 import com.android.systemui.util.kotlin.BooleanFlowOperators.allOf
 import com.android.systemui.util.kotlin.BooleanFlowOperators.noneOf
-import com.android.systemui.util.kotlin.BooleanFlowOperators.not
 import com.android.systemui.util.kotlin.Utils.Companion.sampleFilter
 import com.android.systemui.util.kotlin.sample
 import javax.inject.Inject
@@ -45,10 +42,8 @@
 import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.FlowPreview
-import kotlinx.coroutines.flow.collectLatest
 import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.debounce
-import kotlinx.coroutines.withContext
 
 @OptIn(FlowPreview::class)
 @SysUISingleton
@@ -58,7 +53,6 @@
     @Background private val scope: CoroutineScope,
     @Main mainDispatcher: CoroutineDispatcher,
     @Background bgDispatcher: CoroutineDispatcher,
-    private val glanceableHubTransitions: GlanceableHubTransitions,
     private val communalSettingsInteractor: CommunalSettingsInteractor,
     keyguardInteractor: KeyguardInteractor,
     private val communalSceneInteractor: CommunalSceneInteractor,
@@ -83,9 +77,6 @@
         if (!communalSettingsInteractor.isCommunalFlagEnabled()) {
             return
         }
-        if (!communalSceneKtfRefactor()) {
-            listenForHubToLockscreenOrDreaming()
-        }
         listenForHubToDozing()
         listenForHubToPrimaryBouncer()
         listenForHubToAlternateBouncer()
@@ -108,30 +99,6 @@
         }
     }
 
-    /**
-     * Listens for the glanceable hub transition to lock screen and directly drives the keyguard
-     * transition.
-     */
-    private fun listenForHubToLockscreenOrDreaming() {
-        scope.launch("$TAG#listenForGlanceableHubToLockscreenOrDream") {
-            keyguardInteractor.isDreaming.collectLatest { dreaming ->
-                withContext(mainDispatcher) {
-                    val toState =
-                        if (dreaming) {
-                            KeyguardState.DREAMING
-                        } else {
-                            KeyguardState.LOCKSCREEN
-                        }
-                    glanceableHubTransitions.listenForGlanceableHubTransition(
-                        transitionOwnerName = TAG,
-                        fromState = KeyguardState.GLANCEABLE_HUB,
-                        toState = toState,
-                    )
-                }
-            }
-        }
-    }
-
     private fun listenForHubToPrimaryBouncer() {
         scope.launch("$TAG#listenForHubToPrimaryBouncer") {
             keyguardInteractor.primaryBouncerShowing
@@ -161,18 +128,11 @@
             powerInteractor.isAsleep
                 .filterRelevantKeyguardStateAnd { isAsleep -> isAsleep }
                 .collect {
-                    if (communalSceneKtfRefactor()) {
-                        communalSceneInteractor.snapToScene(
-                            newScene = CommunalScenes.Blank,
-                            loggingReason = "hub to dozing",
-                            keyguardState = KeyguardState.DOZING,
-                        )
-                    } else {
-                        startTransitionTo(
-                            toState = KeyguardState.DOZING,
-                            modeOnCanceled = TransitionModeOnCanceled.LAST_VALUE,
-                        )
-                    }
+                    communalSceneInteractor.snapToScene(
+                        newScene = CommunalScenes.Blank,
+                        loggingReason = "hub to dozing",
+                        keyguardState = KeyguardState.DOZING,
+                    )
                 }
         }
     }
@@ -202,21 +162,17 @@
                     .filterRelevantKeyguardStateAnd { onTop -> onTop }
                     .collect {
                         maybeStartTransitionToOccludedOrInsecureCamera { state, reason ->
-                            if (communalSceneKtfRefactor()) {
-                                communalSceneInteractor.changeScene(
-                                    newScene = CommunalScenes.Blank,
-                                    loggingReason = "hub to occluded (KeyguardWmStateRefactor)",
-                                    transitionKey = CommunalTransitionKeys.SimpleFade,
-                                    keyguardState = state,
-                                )
-                                null
-                            } else {
-                                startTransitionTo(state, ownerReason = reason)
-                            }
+                            communalSceneInteractor.changeScene(
+                                newScene = CommunalScenes.Blank,
+                                loggingReason = "hub to occluded (KeyguardWmStateRefactor)",
+                                transitionKey = CommunalTransitionKeys.SimpleFade,
+                                keyguardState = state,
+                            )
+                            null
                         }
                     }
             }
-        } else if (communalSceneKtfRefactor()) {
+        } else {
             scope.launch {
                 combine(
                         keyguardInteractor.isKeyguardOccluded,
@@ -248,56 +204,40 @@
                         )
                     }
             }
-        } else {
-            scope.launch {
-                allOf(keyguardInteractor.isKeyguardOccluded, not(keyguardInteractor.isDreaming))
-                    .filterRelevantKeyguardStateAnd { isOccludedAndNotDreaming ->
-                        isOccludedAndNotDreaming
-                    }
-                    .collect { _ -> startTransitionTo(KeyguardState.OCCLUDED) }
-            }
         }
     }
 
     private fun listenForHubToGone() {
         if (SceneContainerFlag.isEnabled) return
-        if (communalSceneKtfRefactor()) {
-            scope.launch {
-                allOf(
-                        keyguardInteractor.isKeyguardGoingAway,
-                        // TODO(b/327225415): Handle edit mode opening here to avoid going to GONE
-                        // state until after edit mode is ready to be shown.
-                        noneOf(
-                            // When launching activities from widgets on the hub, we wait to change
-                            // scenes until the activity launch is complete.
-                            communalSceneInteractor.isLaunchingWidget
-                        ),
-                    )
-                    .filterRelevantKeyguardStateAnd { isKeyguardGoingAway -> isKeyguardGoingAway }
-                    .sample(communalSceneInteractor.editModeState, ::Pair)
-                    .collect { (_, editModeState) ->
-                        if (
-                            editModeState == EditModeState.STARTING ||
-                                editModeState == EditModeState.SHOWING
-                        ) {
-                            // Don't change scenes here as that is handled by the edit activity.
-                            startTransitionTo(KeyguardState.GONE)
-                        } else {
-                            communalSceneInteractor.changeScene(
-                                newScene = CommunalScenes.Blank,
-                                loggingReason = "hub to gone",
-                                transitionKey = CommunalTransitionKeys.SimpleFade,
-                                keyguardState = KeyguardState.GONE,
-                            )
-                        }
+        scope.launch {
+            allOf(
+                    keyguardInteractor.isKeyguardGoingAway,
+                    // TODO(b/327225415): Handle edit mode opening here to avoid going to GONE
+                    // state until after edit mode is ready to be shown.
+                    noneOf(
+                        // When launching activities from widgets on the hub, we wait to change
+                        // scenes until the activity launch is complete.
+                        communalSceneInteractor.isLaunchingWidget
+                    ),
+                )
+                .filterRelevantKeyguardStateAnd { isKeyguardGoingAway -> isKeyguardGoingAway }
+                .sample(communalSceneInteractor.editModeState, ::Pair)
+                .collect { (_, editModeState) ->
+                    if (
+                        editModeState == EditModeState.STARTING ||
+                            editModeState == EditModeState.SHOWING
+                    ) {
+                        // Don't change scenes here as that is handled by the edit activity.
+                        startTransitionTo(KeyguardState.GONE)
+                    } else {
+                        communalSceneInteractor.changeScene(
+                            newScene = CommunalScenes.Blank,
+                            loggingReason = "hub to gone",
+                            transitionKey = CommunalTransitionKeys.SimpleFade,
+                            keyguardState = KeyguardState.GONE,
+                        )
                     }
-            }
-        } else {
-            scope.launch {
-                keyguardInteractor.isKeyguardGoingAway
-                    .filterRelevantKeyguardStateAnd { isKeyguardGoingAway -> isKeyguardGoingAway }
-                    .collect { startTransitionTo(KeyguardState.GONE) }
-            }
+                }
         }
     }
 
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 cf712f1..a01dc02 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
@@ -20,7 +20,6 @@
 import android.util.MathUtils
 import com.android.app.animation.Interpolators
 import com.android.app.tracing.coroutines.launchTraced as launch
-import com.android.systemui.Flags.communalSceneKtfRefactor
 import com.android.systemui.communal.domain.interactor.CommunalInteractor
 import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor
 import com.android.systemui.communal.domain.interactor.CommunalSettingsInteractor
@@ -69,7 +68,6 @@
     keyguardInteractor: KeyguardInteractor,
     private val shadeRepository: ShadeRepository,
     powerInteractor: PowerInteractor,
-    private val glanceableHubTransitions: GlanceableHubTransitions,
     private val communalSettingsInteractor: CommunalSettingsInteractor,
     private val communalInteractor: CommunalInteractor,
     private val communalSceneInteractor: CommunalSceneInteractor,
@@ -96,9 +94,6 @@
         listenForLockscreenToPrimaryBouncerDragging()
         listenForLockscreenToAlternateBouncer()
         listenForLockscreenTransitionToCamera()
-        if (!communalSceneKtfRefactor()) {
-            listenForLockscreenToGlanceableHub()
-        }
         if (communalSettingsInteractor.isV2FlagEnabled()) {
             listenForLockscreenToGlanceableHubV2()
         }
@@ -358,24 +353,6 @@
         }
     }
 
-    /**
-     * Listens for transition from glanceable hub back to lock screen and directly drives the
-     * keyguard transition.
-     */
-    private fun listenForLockscreenToGlanceableHub() {
-        if (SceneContainerFlag.isEnabled) return
-        if (!communalSettingsInteractor.isCommunalFlagEnabled()) {
-            return
-        }
-        scope.launch(context = mainDispatcher) {
-            glanceableHubTransitions.listenForGlanceableHubTransition(
-                transitionOwnerName = TAG,
-                fromState = KeyguardState.LOCKSCREEN,
-                toState = KeyguardState.GLANCEABLE_HUB,
-            )
-        }
-    }
-
     private fun listenForLockscreenToGlanceableHubV2() {
         scope.launch {
             communalInteractor.shouldShowCommunal
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 284298d..a2cfdc1 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
@@ -19,7 +19,6 @@
 import android.animation.ValueAnimator
 import com.android.app.animation.Interpolators
 import com.android.app.tracing.coroutines.launchTraced as launch
-import com.android.systemui.Flags.communalSceneKtfRefactor
 import com.android.systemui.Flags.restartDreamOnUnocclude
 import com.android.systemui.communal.domain.interactor.CommunalInteractor
 import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor
@@ -143,15 +142,11 @@
             startTransitionTo(KeyguardState.DREAMING)
         } else if (isIdleOnCommunal || showCommunalFromOccluded) {
             if (SceneContainerFlag.isEnabled) return
-            if (communalSceneKtfRefactor()) {
-                communalSceneInteractor.changeScene(
-                    newScene = CommunalScenes.Communal,
-                    loggingReason = "occluded to hub",
-                    transitionKey = CommunalTransitionKeys.SimpleFade,
-                )
-            } else {
-                startTransitionTo(KeyguardState.GLANCEABLE_HUB)
-            }
+            communalSceneInteractor.changeScene(
+                newScene = CommunalScenes.Communal,
+                loggingReason = "occluded to hub",
+                transitionKey = CommunalTransitionKeys.SimpleFade,
+            )
         } else {
             startTransitionTo(KeyguardState.LOCKSCREEN)
         }
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 402c152..75d6631 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
@@ -18,9 +18,10 @@
 
 import android.animation.ValueAnimator
 import android.util.Log
+import com.android.app.tracing.coroutines.launchTraced as launch
 import com.android.keyguard.KeyguardSecurityModel
-import com.android.systemui.Flags.communalSceneKtfRefactor
 import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor
+import com.android.systemui.communal.domain.interactor.CommunalSettingsInteractor
 import com.android.systemui.communal.shared.model.CommunalScenes
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Background
@@ -43,9 +44,9 @@
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.filter
 import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.onStart
-import com.android.app.tracing.coroutines.launchTraced as launch
 
 @SysUISingleton
 class FromPrimaryBouncerTransitionInteractor
@@ -59,6 +60,7 @@
     @Main mainDispatcher: CoroutineDispatcher,
     keyguardInteractor: KeyguardInteractor,
     private val communalSceneInteractor: CommunalSceneInteractor,
+    private val communalSettingsInteractor: CommunalSettingsInteractor,
     private val keyguardSecurityModel: KeyguardSecurityModel,
     private val selectedUserInteractor: SelectedUserInteractor,
     powerInteractor: PowerInteractor,
@@ -142,14 +144,17 @@
                     )
                     .collect { (_, isAwake, isDreaming, isIdleOnCommunal) ->
                         val isOccluded = keyguardInteractor.isKeyguardOccluded.value
+                        val hubV2 = communalSettingsInteractor.isV2FlagEnabled()
                         val toState =
                             if (isAwake) {
                                 if (isOccluded && !isDreaming) {
                                     KeyguardState.OCCLUDED
-                                } else if (isIdleOnCommunal) {
+                                } else if (!hubV2 && isIdleOnCommunal) {
                                     KeyguardState.GLANCEABLE_HUB
                                 } else if (isDreaming) {
                                     KeyguardState.DREAMING
+                                } else if (hubV2 && isIdleOnCommunal) {
+                                    KeyguardState.GLANCEABLE_HUB
                                 } else {
                                     KeyguardState.LOCKSCREEN
                                 }
@@ -163,7 +168,17 @@
                                 )
                                 keyguardInteractor.asleepKeyguardState.value
                             }
-                        startTransitionTo(toState)
+                        if (hubV2 && toState != KeyguardState.GLANCEABLE_HUB && isIdleOnCommunal) {
+                            // If bouncer is showing over the hub, we need to make sure we
+                            // properly dismiss the hub when transitioning away.
+                            communalSceneInteractor.changeScene(
+                                newScene = CommunalScenes.Blank,
+                                loggingReason = "bouncer no longer showing over GH",
+                                keyguardState = toState,
+                            )
+                        } else {
+                            startTransitionTo(toState)
+                        }
                     }
             }
         }
@@ -173,8 +188,7 @@
         // If the hub is showing, and we are not animating a widget launch nor transitioning to
         // edit mode, then close the hub immediately.
         if (
-            communalSceneKtfRefactor() &&
-                communalSceneInteractor.isIdleOnCommunal.value &&
+            communalSceneInteractor.isIdleOnCommunal.value &&
                 !communalSceneInteractor.isLaunchingWidget.value &&
                 communalSceneInteractor.editModeState.value == null
         ) {
@@ -187,7 +201,32 @@
 
     private fun listenForPrimaryBouncerToAsleep() {
         if (SceneContainerFlag.isEnabled) return
-        scope.launch { listenForSleepTransition() }
+        scope.launch {
+            if (communalSettingsInteractor.isV2FlagEnabled()) {
+                powerInteractor.isAsleep
+                    .filter { isAsleep -> isAsleep }
+                    .filterRelevantKeyguardState()
+                    .sample(communalSceneInteractor.isIdleOnCommunal)
+                    .collect { isIdleOnCommunal ->
+                        if (isIdleOnCommunal) {
+                            // If the bouncer is showing on top of the hub, then ensure we also
+                            // hide the hub.
+                            communalSceneInteractor.changeScene(
+                                newScene = CommunalScenes.Blank,
+                                loggingReason = "Sleep while primary bouncer showing over hub",
+                                keyguardState = keyguardInteractor.asleepKeyguardState.value,
+                            )
+                        } else {
+                            startTransitionTo(
+                                toState = keyguardInteractor.asleepKeyguardState.value,
+                                ownerReason = "Sleep transition triggered",
+                            )
+                        }
+                    }
+            } else {
+                listenForSleepTransition()
+            }
+        }
     }
 
     private fun listenForPrimaryBouncerToGone() {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/GlanceableHubTransitions.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/GlanceableHubTransitions.kt
deleted file mode 100644
index bde0f56..0000000
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/GlanceableHubTransitions.kt
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.keyguard.domain.interactor
-
-import android.animation.ValueAnimator
-import com.android.app.animation.Interpolators
-import com.android.systemui.communal.domain.interactor.CommunalInteractor
-import com.android.systemui.communal.domain.model.CommunalTransitionProgressModel
-import com.android.systemui.communal.shared.model.CommunalScenes
-import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository
-import com.android.systemui.keyguard.shared.model.KeyguardState
-import com.android.systemui.keyguard.shared.model.TransitionInfo
-import com.android.systemui.keyguard.shared.model.TransitionState
-import com.android.systemui.scene.shared.flag.SceneContainerFlag
-import com.android.systemui.util.kotlin.sample
-import java.util.UUID
-import javax.inject.Inject
-
-class GlanceableHubTransitions
-@Inject
-constructor(
-    private val transitionInteractor: KeyguardTransitionInteractor,
-    private val transitionRepository: KeyguardTransitionRepository,
-    private val communalInteractor: CommunalInteractor,
-) {
-    /**
-     * Listens for the glanceable hub transition to the specified scene and directly drives the
-     * keyguard transition between the lockscreen and the hub.
-     *
-     * The glanceable hub transition progress is used as the source of truth as it cannot be driven
-     * externally. The progress is used for both transitions caused by user touch input or by
-     * programmatic changes.
-     */
-    suspend fun listenForGlanceableHubTransition(
-        transitionOwnerName: String,
-        fromState: KeyguardState,
-        toState: KeyguardState,
-    ) {
-        if (SceneContainerFlag.isEnabled) return
-        val toScene =
-            if (fromState == KeyguardState.GLANCEABLE_HUB) {
-                CommunalScenes.Blank
-            } else {
-                CommunalScenes.Communal
-            }
-        var transitionId: UUID? = null
-
-        communalInteractor
-            .transitionProgressToScene(toScene)
-            .sample(
-                transitionInteractor.startedKeyguardTransitionStep,
-                ::Pair,
-            )
-            .collect { (transitionProgress, lastStartedStep) ->
-                val id = transitionId
-                if (id == null) {
-                    // No transition started.
-                    if (
-                        transitionProgress is CommunalTransitionProgressModel.Transition &&
-                            lastStartedStep.to == fromState
-                    ) {
-                        transitionId =
-                            transitionRepository.startTransition(
-                                TransitionInfo(
-                                    ownerName = transitionOwnerName,
-                                    from = fromState,
-                                    to = toState,
-                                    animator = null, // transition will be manually controlled
-                                )
-                            )
-                    }
-                } else {
-                    if (lastStartedStep.to != toState) {
-                        return@collect
-                    }
-                    // An existing `id` means a transition is started, and calls to
-                    // `updateTransition` will control it until FINISHED or CANCELED
-                    val nextState: TransitionState
-                    val progressFraction: Float
-                    when (transitionProgress) {
-                        is CommunalTransitionProgressModel.Idle -> {
-                            if (transitionProgress.scene == toScene) {
-                                nextState = TransitionState.FINISHED
-                                progressFraction = 1f
-                            } else {
-                                nextState = TransitionState.CANCELED
-                                progressFraction = 0f
-                            }
-                        }
-                        is CommunalTransitionProgressModel.Transition -> {
-                            nextState = TransitionState.RUNNING
-                            progressFraction = transitionProgress.progress
-                        }
-                        is CommunalTransitionProgressModel.OtherTransition -> {
-                            // Shouldn't happen but if another transition starts during the
-                            // current one, mark the current one as canceled.
-                            nextState = TransitionState.CANCELED
-                            progressFraction = 0f
-                        }
-                    }
-                    transitionRepository.updateTransition(
-                        id,
-                        progressFraction,
-                        nextState,
-                    )
-
-                    if (
-                        nextState == TransitionState.CANCELED ||
-                            nextState == TransitionState.FINISHED
-                    ) {
-                        transitionId = null
-                    }
-
-                    // If canceled, just put the state back.
-                    if (nextState == TransitionState.CANCELED) {
-                        transitionRepository.startTransition(
-                            TransitionInfo(
-                                ownerName = transitionOwnerName,
-                                from = toState,
-                                to = fromState,
-                                animator =
-                                    ValueAnimator().apply {
-                                        interpolator = Interpolators.LINEAR
-                                        duration = 0
-                                    }
-                            )
-                        )
-                    }
-                }
-            }
-    }
-}
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 96e05cb..63cf4f7 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
@@ -24,7 +24,6 @@
 import com.android.systemui.keyguard.data.repository.KeyguardClockRepository
 import com.android.systemui.keyguard.shared.model.ClockSize
 import com.android.systemui.keyguard.shared.model.ClockSizeSetting
-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
@@ -33,10 +32,13 @@
 import com.android.systemui.plugins.clocks.ClockController
 import com.android.systemui.plugins.clocks.ClockId
 import com.android.systemui.scene.shared.flag.SceneContainerFlag
-import com.android.systemui.shade.domain.interactor.ShadeInteractor
+import com.android.systemui.shade.domain.interactor.ShadeModeInteractor
 import com.android.systemui.statusbar.notification.domain.interactor.ActiveNotificationsInteractor
 import com.android.systemui.statusbar.notification.domain.interactor.HeadsUpNotificationInteractor
+import com.android.systemui.statusbar.notification.promoted.PromotedNotificationUiAod
+import com.android.systemui.statusbar.notification.promoted.domain.interactor.AODPromotedNotificationInteractor
 import com.android.systemui.util.kotlin.combine
+import com.android.systemui.utils.coroutines.flow.flatMapLatestConflated
 import com.android.systemui.wallpapers.domain.interactor.WallpaperFocalAreaInteractor
 import javax.inject.Inject
 import kotlinx.coroutines.CoroutineScope
@@ -45,6 +47,7 @@
 import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.filterNotNull
+import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.stateIn
 
@@ -57,7 +60,8 @@
 constructor(
     mediaCarouselInteractor: MediaCarouselInteractor,
     activeNotificationsInteractor: ActiveNotificationsInteractor,
-    shadeInteractor: ShadeInteractor,
+    aodPromotedNotificationInteractor: AODPromotedNotificationInteractor,
+    shadeModeInteractor: ShadeModeInteractor,
     keyguardInteractor: KeyguardInteractor,
     keyguardTransitionInteractor: KeyguardTransitionInteractor,
     headsUpNotificationInteractor: HeadsUpNotificationInteractor,
@@ -66,8 +70,13 @@
     private val wallpaperFocalAreaInteractor: WallpaperFocalAreaInteractor,
 ) {
     private val isOnAod: Flow<Boolean> =
-        keyguardTransitionInteractor.currentKeyguardState.map { it == KeyguardState.AOD }
+        keyguardTransitionInteractor.currentKeyguardState.map { it == AOD }
 
+    /**
+     * The clock size setting explicitly selected by the user. When it is `SMALL`, the large clock
+     * is never shown. When it is `DYNAMIC`, the clock size gets determined based on a combination
+     * of system signals.
+     */
     val selectedClockSize: StateFlow<ClockSizeSetting> = keyguardClockRepository.selectedClockSize
 
     val currentClockId: Flow<ClockId> = keyguardClockRepository.currentClockId
@@ -80,53 +89,91 @@
 
     var clock: ClockController? by keyguardClockRepository.clockEventController::clock
 
-    val clockSize: StateFlow<ClockSize> =
+    private val isAodPromotedNotificationPresent: Flow<Boolean> =
+        if (PromotedNotificationUiAod.isEnabled) {
+            aodPromotedNotificationInteractor.isPresent
+        } else {
+            flowOf(false)
+        }
+
+    private val areAnyNotificationsPresent: Flow<Boolean> =
+        if (PromotedNotificationUiAod.isEnabled) {
+            combine(
+                activeNotificationsInteractor.areAnyNotificationsPresent,
+                isAodPromotedNotificationPresent,
+            ) { areAnyNotificationsPresent, isAodPromotedNotificationPresent ->
+                areAnyNotificationsPresent || isAodPromotedNotificationPresent
+            }
+        } else {
+            activeNotificationsInteractor.areAnyNotificationsPresent
+        }
+
+    private val dynamicClockSize: Flow<ClockSize> =
         if (SceneContainerFlag.isEnabled) {
             combine(
-                    shadeInteractor.isShadeLayoutWide,
-                    activeNotificationsInteractor.areAnyNotificationsPresent,
-                    mediaCarouselInteractor.hasActiveMediaOrRecommendation,
-                    keyguardInteractor.isDozing,
-                    isOnAod,
-                ) { isShadeLayoutWide, hasNotifs, hasMedia, isDozing, isOnAod ->
-                    return@combine when {
-                        keyguardClockRepository.shouldForceSmallClock && !isOnAod -> ClockSize.SMALL
-                        !isShadeLayoutWide && (hasNotifs || hasMedia) -> ClockSize.SMALL
-                        !isShadeLayoutWide -> ClockSize.LARGE
-                        hasMedia && !isDozing -> ClockSize.SMALL
-                        else -> ClockSize.LARGE
-                    }
+                shadeModeInteractor.isShadeLayoutWide,
+                areAnyNotificationsPresent,
+                mediaCarouselInteractor.hasActiveMediaOrRecommendation,
+                keyguardInteractor.isDozing,
+                isOnAod,
+            ) { isShadeLayoutWide, hasNotifs, hasMedia, isDozing, isOnAod ->
+                when {
+                    keyguardClockRepository.shouldForceSmallClock && !isOnAod -> ClockSize.SMALL
+                    !isShadeLayoutWide && (hasNotifs || hasMedia) -> ClockSize.SMALL
+                    !isShadeLayoutWide -> ClockSize.LARGE
+                    hasMedia && !isDozing -> ClockSize.SMALL
+                    else -> ClockSize.LARGE
                 }
-                .stateIn(
-                    scope = applicationScope,
-                    started = SharingStarted.WhileSubscribed(),
-                    initialValue = ClockSize.LARGE,
-                )
+            }
         } else {
             keyguardClockRepository.clockSize
         }
 
+    val clockSize: StateFlow<ClockSize> =
+        selectedClockSize
+            .flatMapLatestConflated { selectedSize ->
+                if (selectedSize == ClockSizeSetting.SMALL) {
+                    flowOf(ClockSize.SMALL)
+                } else {
+                    dynamicClockSize
+                }
+            }
+            .stateIn(
+                scope = applicationScope,
+                started = SharingStarted.Eagerly,
+                initialValue = ClockSize.LARGE,
+            )
+
     val clockShouldBeCentered: Flow<Boolean> =
         if (SceneContainerFlag.isEnabled) {
             combine(
-                shadeInteractor.isShadeLayoutWide,
-                activeNotificationsInteractor.areAnyNotificationsPresent,
+                shadeModeInteractor.isShadeLayoutWide,
+                areAnyNotificationsPresent,
+                isAodPromotedNotificationPresent,
                 isOnAod,
                 headsUpNotificationInteractor.isHeadsUpOrAnimatingAway,
                 keyguardInteractor.isDozing,
-            ) { isShadeLayoutWide, areAnyNotificationsPresent, isOnAod, isHeadsUp, isDozing ->
+            ) {
+                isShadeLayoutWide,
+                areAnyNotificationsPresent,
+                isAodPromotedNotificationPresent,
+                isOnAod,
+                isHeadsUp,
+                isDozing ->
                 when {
                     !isShadeLayoutWide -> true
                     !areAnyNotificationsPresent -> true
                     // Pulsing notification appears on the right. Move clock left to avoid overlap.
                     isHeadsUp && isDozing -> false
+                    isAodPromotedNotificationPresent -> false
                     else -> isOnAod
                 }
             }
         } else {
             combine(
-                    shadeInteractor.isShadeLayoutWide,
-                    activeNotificationsInteractor.areAnyNotificationsPresent,
+                    shadeModeInteractor.isShadeLayoutWide,
+                    areAnyNotificationsPresent,
+                    isAodPromotedNotificationPresent,
                     keyguardInteractor.dozeTransitionModel,
                     keyguardTransitionInteractor.startedKeyguardTransitionStep.map { it.to == AOD },
                     keyguardTransitionInteractor.startedKeyguardTransitionStep.map {
@@ -140,6 +187,7 @@
                 ) {
                     isShadeLayoutWide,
                     areAnyNotificationsPresent,
+                    isAodPromotedNotificationPresent,
                     dozeTransitionModel,
                     startedToAod,
                     startedToLockScreen,
@@ -156,7 +204,7 @@
                         // use null to skip emitting wrong value
                         startedToGone || startedToDoze -> null
                         startedToLockScreen -> !areAnyNotificationsPresent
-                        startedToAod -> !isPulsing
+                        startedToAod -> !(isPulsing || isAodPromotedNotificationPresent)
                         else -> true
                     }
                 }
@@ -170,7 +218,7 @@
 
     val renderedClockId: ClockId
         get() {
-            return clock?.let { clock -> clock.config.id }
+            return clock?.config?.id
                 ?: run {
                     Log.e(TAG, "No clock is available")
                     "MISSING_CLOCK_ID"
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 58fb423..3b4a148 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
@@ -19,7 +19,10 @@
 
 import android.annotation.SuppressLint
 import android.util.Log
+import com.android.app.tracing.coroutines.flow.filterTraced
+import com.android.app.tracing.coroutines.flow.traceAs
 import com.android.app.tracing.coroutines.launchTraced as launch
+import com.android.app.tracing.coroutines.traceCoroutine
 import com.android.compose.animation.scene.ObservableTransitionState
 import com.android.compose.animation.scene.SceneKey
 import com.android.systemui.Flags.keyguardTransitionForceFinishOnScreenOff
@@ -90,6 +93,7 @@
                     onBufferOverflow = BufferOverflow.DROP_OLDEST,
                 )
                 .also { it.tryEmit(0f) }
+                .traceAs("KTF-${state.name}")
         }
     }
 
@@ -222,10 +226,11 @@
 
         val flow: Flow<TransitionStep> =
             transitionMap.getOrPut(mappedEdge) {
-                MutableSharedFlow(
-                    extraBufferCapacity = 10,
-                    onBufferOverflow = BufferOverflow.DROP_OLDEST,
-                )
+                MutableSharedFlow<TransitionStep>(
+                        extraBufferCapacity = 10,
+                        onBufferOverflow = BufferOverflow.DROP_OLDEST,
+                    )
+                    .traceAs("KTF-${mappedEdge.from}-to-${mappedEdge.to}")
             }
 
         if (!SceneContainerFlag.isEnabled) {
@@ -234,7 +239,7 @@
         if (edge.isSceneWildcardEdge()) {
             return simulateTransitionStepsForSceneTransitions(edge)
         }
-        return flow.filter { step ->
+        return flow.filterTraced("stl-filter") { step ->
             val fromScene =
                 when (edge) {
                     is Edge.StateToState -> edge.from?.mapToSceneContainerScene()
@@ -273,7 +278,7 @@
                     step.transitionState == TransitionState.CANCELED) &&
                     sceneTransitionPair.value.previousValue.isTransitioning(fromScene, toScene)
 
-            return@filter isTransitioningBetweenLockscreenStates ||
+            return@filterTraced isTransitioningBetweenLockscreenStates ||
                 isTransitioningBetweenDesiredScenes ||
                 terminalStepBelongsToPreviousTransition ||
                 belongsToInstantReversedTransition
@@ -362,27 +367,27 @@
 
         coroutineScope {
             collect { value ->
-                job?.cancelAndJoin()
+                traceCoroutine("cancelAndJoin") { job?.cancelAndJoin() }
 
-                job = launch {
+                job = launch("inner") {
                     val innerFlow = transform(value)
                     try {
                         innerFlow.collect { step ->
                             if (step.transitionState == TransitionState.STARTED) {
                                 startedEmitted = true
                             }
-                            send(step)
+                            traceCoroutine("send($step)") { send(step) }
                         }
                     } finally {
                         if (startedEmitted) {
-                            send(
+                            val step =
                                 TransitionStep(
                                     from = UNDEFINED,
                                     to = UNDEFINED,
                                     value = 1f,
                                     transitionState = TransitionState.FINISHED,
                                 )
-                            )
+                            traceCoroutine("send($step)") { send(step) }
                             startedEmitted = false
                         }
                     }
@@ -390,6 +395,7 @@
             }
         }
     }
+    .traceAs("flatMapLatestWithFinished")
 
     /**
      * Converts old KTF states to UNDEFINED when [SceneContainerFlag] is enabled.
@@ -545,6 +551,7 @@
                 }
             }
             .onStart { emit(false) }
+            .traceAs("isInTransition-$edge-$edgeWithoutSceneContainer")
             .distinctUntilChanged()
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlow.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlow.kt
index 8f68158..c5127a5 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlow.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlow.kt
@@ -66,11 +66,14 @@
          * range. This function maps the [startTime] and [duration] into [0, 1], when this subset is
          * valid.
          *
+         * Note that [onStep] accepts a null return value. When null, no animation information will
+         * be emitted, effectively saying "do not change the value on this frame"
+         *
          * Note that [onCancel] isn't used when the scene framework is enabled.
          */
         fun sharedFlow(
             duration: Duration = transitionDuration,
-            onStep: (Float) -> Float,
+            onStep: (Float) -> Float?,
             startTime: Duration = 0.milliseconds,
             onStart: (() -> Unit)? = null,
             onCancel: (() -> Float)? = null,
@@ -102,7 +105,7 @@
          */
         fun sharedFlowWithState(
             duration: Duration,
-            onStep: (Float) -> Float,
+            onStep: (Float) -> Float?,
             startTime: Duration = 0.milliseconds,
             onStart: (() -> Unit)? = null,
             onCancel: (() -> Float)? = null,
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 00710c9..8e38538 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
@@ -300,7 +300,7 @@
                     }
 
                     launch {
-                        viewModel.isNotifIconContainerVisible.collect { isVisible ->
+                        viewModel.isAodPromotedNotifVisible.collect { isVisible ->
                             if (isVisible.value) {
                                 blueprintViewModel.refreshBlueprint()
                             }
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 97fa3f1..f0113a5 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
@@ -26,7 +26,6 @@
 import com.android.systemui.shared.Flags.ambientAod
 import com.android.systemui.statusbar.LightRevealScrim
 import com.android.systemui.wallpapers.ui.viewmodel.WallpaperViewModel
-import com.android.app.tracing.coroutines.launchTraced as launch
 
 object LightRevealScrimViewBinder {
     @JvmStatic
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 aed8664..0a08740 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
@@ -26,7 +26,6 @@
 import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
 import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
 import com.android.systemui.keyguard.shared.model.BurnInModel
-import com.android.systemui.keyguard.shared.model.ClockSize
 import com.android.systemui.keyguard.shared.model.Edge
 import com.android.systemui.keyguard.shared.model.KeyguardState
 import com.android.systemui.keyguard.ui.StateToValue
@@ -35,6 +34,7 @@
 import javax.inject.Inject
 import kotlin.math.max
 import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.SharingStarted
@@ -51,6 +51,7 @@
  * Models UI state for elements that need to apply anti-burn-in tactics when showing in AOD
  * (always-on display).
  */
+@OptIn(ExperimentalCoroutinesApi::class)
 @SysUISingleton
 class AodBurnInViewModel
 @Inject
@@ -184,10 +185,9 @@
                 keyguardClockViewModel.currentClock.value
                     ?.config
                     ?.useAlternateSmartspaceAODTransition == true
-            // Only scale large non-weather clocks
-            // elements in large weather clock will translate the same as smartspace
-            val useScaleOnly =
-                (!useAltAod) && keyguardClockViewModel.clockSize.value == ClockSize.LARGE
+            // Only scale large non-weather clocks elements in large weather clock will translate
+            // the same as smartspace
+            val useScaleOnly = (!useAltAod) && keyguardClockViewModel.isLargeClockVisible.value
 
             val burnInY = MathUtils.lerp(0, burnIn.translationY, interpolated).toInt()
             val translationY = max(params.topInset - params.minViewY, burnInY)
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DozingToDreamingTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DozingToDreamingTransitionViewModel.kt
index e6a85c6..9018c58 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DozingToDreamingTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DozingToDreamingTransitionViewModel.kt
@@ -39,4 +39,6 @@
         )
 
     val lockscreenAlpha: Flow<Float> = transitionAnimation.immediatelyTransitionTo(0f)
+    // Notifications should not be shown while transitioning to dream.
+    val notificationAlpha = transitionAnimation.immediatelyTransitionTo(0f)
 }
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 88fdc83..cf5cc26 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
@@ -18,7 +18,6 @@
 
 import android.content.Context
 import android.content.res.Resources
-import androidx.annotation.VisibleForTesting
 import androidx.constraintlayout.helper.widget.Layer
 import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
 import com.android.systemui.customization.R as customR
@@ -27,11 +26,10 @@
 import com.android.systemui.dagger.qualifiers.Main
 import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor
 import com.android.systemui.keyguard.shared.model.ClockSize
-import com.android.systemui.keyguard.shared.model.ClockSizeSetting
 import com.android.systemui.plugins.clocks.ClockPreviewConfig
 import com.android.systemui.scene.shared.flag.SceneContainerFlag
 import com.android.systemui.shade.ShadeDisplayAware
-import com.android.systemui.shade.domain.interactor.ShadeInteractor
+import com.android.systemui.shade.domain.interactor.ShadeModeInteractor
 import com.android.systemui.statusbar.notification.icon.ui.viewmodel.NotificationIconContainerAlwaysOnDisplayViewModel
 import com.android.systemui.statusbar.ui.SystemBarUtilsProxy
 import javax.inject.Inject
@@ -47,11 +45,11 @@
 class KeyguardClockViewModel
 @Inject
 constructor(
-    val context: Context,
+    private val context: Context,
     keyguardClockInteractor: KeyguardClockInteractor,
     @Application private val applicationScope: CoroutineScope,
     aodNotificationIconViewModel: NotificationIconContainerAlwaysOnDisplayViewModel,
-    @get:VisibleForTesting val shadeInteractor: ShadeInteractor,
+    private val shadeModeInteractor: ShadeModeInteractor,
     private val systemBarUtils: SystemBarUtilsProxy,
     @ShadeDisplayAware configurationInteractor: ConfigurationInteractor,
     // TODO: b/374267505 - Use ShadeDisplayAware resources here.
@@ -59,17 +57,7 @@
 ) {
     var burnInLayer: Layer? = null
 
-    val clockSize: StateFlow<ClockSize> =
-        combine(keyguardClockInteractor.selectedClockSize, keyguardClockInteractor.clockSize) {
-                selectedSize,
-                clockSize ->
-                if (selectedSize == ClockSizeSetting.SMALL) ClockSize.SMALL else clockSize
-            }
-            .stateIn(
-                scope = applicationScope,
-                started = SharingStarted.Eagerly,
-                initialValue = ClockSize.LARGE,
-            )
+    val clockSize: StateFlow<ClockSize> = keyguardClockInteractor.clockSize
 
     val isLargeClockVisible: StateFlow<Boolean> =
         clockSize
@@ -118,7 +106,7 @@
         combine(
                 isLargeClockVisible,
                 clockShouldBeCentered,
-                shadeInteractor.isShadeLayoutWide,
+                shadeModeInteractor.isShadeLayoutWide,
                 currentClock,
             ) { isLargeClockVisible, clockShouldBeCentered, isShadeLayoutWide, currentClock ->
                 if (currentClock?.config?.useCustomClockScene == true) {
@@ -163,7 +151,7 @@
     fun getSmallClockTopMargin(): Int {
         return ClockPreviewConfig(
                 context,
-                shadeInteractor.isShadeLayoutWide.value,
+                shadeModeInteractor.isShadeLayoutWide.value,
                 SceneContainerFlag.isEnabled,
             )
             .getSmallClockTopPadding(systemBarUtils.getStatusBarHeaderHeightKeyguard())
@@ -172,7 +160,7 @@
     val smallClockTopMargin =
         combine(
             configurationInteractor.onAnyConfigurationChange,
-            shadeInteractor.isShadeLayoutWide,
+            shadeModeInteractor.isShadeLayoutWide,
         ) { _, _ ->
             getSmallClockTopMargin()
         }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardMediaViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardMediaViewModel.kt
index ba03c48..e70d696 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardMediaViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardMediaViewModel.kt
@@ -21,6 +21,7 @@
 import com.android.systemui.lifecycle.ExclusiveActivatable
 import com.android.systemui.lifecycle.Hydrator
 import com.android.systemui.media.controls.domain.pipeline.interactor.MediaCarouselInteractor
+import com.android.systemui.shade.domain.interactor.ShadeModeInteractor
 import com.android.systemui.utils.coroutines.flow.flatMapLatestConflated
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
@@ -31,6 +32,7 @@
 constructor(
     mediaCarouselInteractor: MediaCarouselInteractor,
     keyguardInteractor: KeyguardInteractor,
+    shadeModeInteractor: ShadeModeInteractor,
 ) : ExclusiveActivatable() {
 
     private val hydrator = Hydrator("KeyguardMediaViewModel.hydrator")
@@ -54,6 +56,12 @@
                     mediaCarouselInteractor.hasActiveMediaOrRecommendation.value,
         )
 
+    val isShadeLayoutWide: Boolean by
+        hydrator.hydratedStateOf(
+            traceName = "isShadeLayoutWide",
+            source = shadeModeInteractor.isShadeLayoutWide,
+        )
+
     override suspend fun onActivated(): Nothing {
         hydrator.activate()
     }
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 62a5eba..8e21745 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
@@ -25,6 +25,7 @@
 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.dump.DumpManager
 import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
 import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
 import com.android.systemui.keyguard.domain.interactor.PulseExpansionInteractor
@@ -44,9 +45,11 @@
 import com.android.systemui.shade.ui.viewmodel.NotificationShadeWindowModel
 import com.android.systemui.statusbar.notification.domain.interactor.NotificationsKeyguardInteractor
 import com.android.systemui.statusbar.notification.icon.ui.viewmodel.NotificationIconContainerAlwaysOnDisplayViewModel
+import com.android.systemui.statusbar.notification.promoted.domain.interactor.AODPromotedNotificationInteractor
 import com.android.systemui.statusbar.phone.DozeParameters
 import com.android.systemui.statusbar.phone.ScreenOffAnimationController
 import com.android.systemui.util.kotlin.BooleanFlowOperators.anyOf
+import com.android.systemui.util.kotlin.FlowDumperImpl
 import com.android.systemui.util.kotlin.pairwise
 import com.android.systemui.util.kotlin.sample
 import com.android.systemui.util.ui.AnimatableEvent
@@ -82,6 +85,7 @@
     private val notificationsKeyguardInteractor: NotificationsKeyguardInteractor,
     private val pulseExpansionInteractor: PulseExpansionInteractor,
     notificationShadeWindowModel: NotificationShadeWindowModel,
+    private val aodPromotedNotificationInteractor: AODPromotedNotificationInteractor,
     private val aodNotificationIconViewModel: NotificationIconContainerAlwaysOnDisplayViewModel,
     private val alternateBouncerToAodTransitionViewModel: AlternateBouncerToAodTransitionViewModel,
     private val alternateBouncerToGoneTransitionViewModel:
@@ -134,17 +138,21 @@
     private val aodBurnInViewModel: AodBurnInViewModel,
     private val shadeInteractor: ShadeInteractor,
     wallpaperFocalAreaInteractor: WallpaperFocalAreaInteractor,
-) {
+    dumpManager: DumpManager,
+) : FlowDumperImpl(dumpManager) {
     val burnInLayerVisibility: Flow<Int> =
         keyguardTransitionInteractor.startedKeyguardTransitionStep
             .filter { it.to == AOD || it.to == LOCKSCREEN }
             .map { VISIBLE }
+            .dumpWhileCollecting("burnInLayerVisibility")
 
     val goneToAodTransition =
-        keyguardTransitionInteractor.transition(
-            edge = Edge.create(Scenes.Gone, AOD),
-            edgeWithoutSceneContainer = Edge.create(GONE, AOD),
-        )
+        keyguardTransitionInteractor
+            .transition(
+                edge = Edge.create(Scenes.Gone, AOD),
+                edgeWithoutSceneContainer = Edge.create(GONE, AOD),
+            )
+            .dumpWhileCollecting("goneToAodTransition")
 
     private val goneToAodTransitionRunning: Flow<Boolean> =
         goneToAodTransition
@@ -222,13 +230,15 @@
         )
 
     /** Last point that the root view was tapped */
-    val lastRootViewTapPosition: Flow<Point?> = keyguardInteractor.lastRootViewTapPosition
+    val lastRootViewTapPosition: Flow<Point?> =
+        keyguardInteractor.lastRootViewTapPosition.dumpWhileCollecting("lastRootViewTapPosition")
 
     /**
      * The keyguard root view can be clipped as the shade is pulled down, typically only for
      * non-split shade cases.
      */
-    val topClippingBounds: Flow<Int?> = keyguardInteractor.topClippingBounds
+    val topClippingBounds: Flow<Int?> =
+        keyguardInteractor.topClippingBounds.dumpWhileCollecting("topClippingBounds")
 
     /** An observable for the alpha level for the entire keyguard root view. */
     fun alpha(viewState: ViewStateAccessor): Flow<Float> {
@@ -287,40 +297,56 @@
                 }
             }
             .distinctUntilChanged()
+            .dumpWhileCollecting("alpha")
     }
 
     val scaleFromZoomOut: Flow<Float> =
-        keyguardInteractor.zoomOut.map { 1 - it * PUSHBACK_SCALE_FOR_LOCKSCREEN }
+        keyguardInteractor.zoomOut
+            .map { 1 - it * PUSHBACK_SCALE_FOR_LOCKSCREEN }
+            .dumpWhileCollecting("scaleFromZoomOut")
 
-    val translationY: Flow<Float> = aodBurnInViewModel.movement.map { it.translationY.toFloat() }
+    val translationY: Flow<Float> =
+        aodBurnInViewModel.movement
+            .map { it.translationY.toFloat() }
+            .dumpWhileCollecting("translationY")
 
     val translationX: Flow<StateToValue> =
         merge(
-            aodBurnInViewModel.movement.map {
-                StateToValue(to = AOD, value = it.translationX.toFloat())
-            },
-            lockscreenToGlanceableHubTransitionViewModel.keyguardTranslationX,
-            glanceableHubToLockscreenTransitionViewModel.keyguardTranslationX,
-        )
+                aodBurnInViewModel.movement.map {
+                    StateToValue(to = AOD, value = it.translationX.toFloat())
+                },
+                lockscreenToGlanceableHubTransitionViewModel.keyguardTranslationX,
+                glanceableHubToLockscreenTransitionViewModel.keyguardTranslationX,
+            )
+            .dumpWhileCollecting("translationX")
 
     fun updateBurnInParams(params: BurnInParameters) {
         aodBurnInViewModel.updateBurnInParams(params)
     }
 
     val scale: Flow<BurnInScaleViewModel> =
-        aodBurnInViewModel.movement.map {
-            BurnInScaleViewModel(scale = it.scale, scaleClockOnly = it.scaleClockOnly)
-        }
+        aodBurnInViewModel.movement
+            .map { BurnInScaleViewModel(scale = it.scale, scaleClockOnly = it.scaleClockOnly) }
+            .dumpWhileCollecting("scale")
 
-    val isAodPromotedNotifVisible: StateFlow<Boolean> =
-        keyguardTransitionInteractor
-            .transitionValue(AOD)
-            .map { it == 1f }
+    val isAodPromotedNotifVisible: StateFlow<AnimatedValue<Boolean>> =
+        combine(
+                areNotifsFullyHiddenAnimated(),
+                isPulseExpandingAnimated(),
+                aodPromotedNotificationInteractor.isPresent,
+            ) { notifsFullyHiddenAnimated, pulseExpandingAnimated, haveAodPromotedNotif ->
+                zip(notifsFullyHiddenAnimated, pulseExpandingAnimated) {
+                    notifsFullyHidden,
+                    pulseExpanding ->
+                    notifsFullyHidden && !pulseExpanding && haveAodPromotedNotif
+                }
+            }
             .stateIn(
                 scope = applicationScope,
                 started = SharingStarted.WhileSubscribed(),
-                initialValue = false,
+                initialValue = AnimatedValue.NotAnimating(false),
             )
+            .dumpValue("isAodPromotedNotifVisible")
 
     /** Is the notification icon container visible? */
     val isNotifIconContainerVisible: StateFlow<AnimatedValue<Boolean>> =
@@ -376,6 +402,7 @@
                 started = SharingStarted.WhileSubscribed(),
                 initialValue = AnimatedValue.NotAnimating(false),
             )
+            .dumpValue("isNotifIconContainerVisible")
 
     fun onNotificationContainerBoundsChanged(top: Float, bottom: Float, animate: Boolean = false) {
         keyguardInteractor.setNotificationContainerBounds(
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 3e3a89a..ecebaee 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
@@ -17,8 +17,9 @@
 package com.android.systemui.keyguard.ui.viewmodel
 
 import android.content.res.Resources
+import androidx.compose.runtime.getValue
+import androidx.compose.ui.Alignment
 import com.android.app.tracing.coroutines.launchTraced as launch
-import com.android.internal.annotations.VisibleForTesting
 import com.android.systemui.biometrics.AuthController
 import com.android.systemui.customization.R as customR
 import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor
@@ -30,86 +31,121 @@
 import com.android.systemui.keyguard.shared.transition.KeyguardTransitionAnimationCallback
 import com.android.systemui.keyguard.shared.transition.KeyguardTransitionAnimationCallbackDelegator
 import com.android.systemui.lifecycle.ExclusiveActivatable
+import com.android.systemui.lifecycle.Hydrator
 import com.android.systemui.res.R
-import com.android.systemui.shade.domain.interactor.ShadeInteractor
+import com.android.systemui.shade.domain.interactor.ShadeModeInteractor
+import com.android.systemui.shade.shared.model.ShadeMode
 import com.android.systemui.unfold.domain.interactor.UnfoldTransitionInteractor
 import dagger.assisted.Assisted
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
-import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.awaitCancellation
 import kotlinx.coroutines.coroutineScope
-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
 import kotlinx.coroutines.flow.distinctUntilChanged
 import kotlinx.coroutines.flow.map
-import kotlinx.coroutines.flow.stateIn
 
 class LockscreenContentViewModel
 @AssistedInject
 constructor(
-    clockInteractor: KeyguardClockInteractor,
-    private val interactor: KeyguardBlueprintInteractor,
+    private val clockInteractor: KeyguardClockInteractor,
+    interactor: KeyguardBlueprintInteractor,
     private val authController: AuthController,
     val touchHandling: KeyguardTouchHandlingViewModel,
-    private val shadeInteractor: ShadeInteractor,
-    private val unfoldTransitionInteractor: UnfoldTransitionInteractor,
-    private val deviceEntryInteractor: DeviceEntryInteractor,
-    private val transitionInteractor: KeyguardTransitionInteractor,
+    shadeModeInteractor: ShadeModeInteractor,
+    unfoldTransitionInteractor: UnfoldTransitionInteractor,
+    deviceEntryInteractor: DeviceEntryInteractor,
+    transitionInteractor: KeyguardTransitionInteractor,
     private val keyguardTransitionAnimationCallbackDelegator:
         KeyguardTransitionAnimationCallbackDelegator,
     @Assisted private val keyguardTransitionAnimationCallback: KeyguardTransitionAnimationCallback,
 ) : ExclusiveActivatable() {
-    @VisibleForTesting val clockSize = clockInteractor.clockSize
+
+    private val hydrator = Hydrator("LockscreenContentViewModel.hydrator")
 
     val isUdfpsVisible: Boolean
         get() = authController.isUdfpsSupported
 
-    val isShadeLayoutWide: StateFlow<Boolean> = shadeInteractor.isShadeLayoutWide
+    /** Where to place the notifications stack on the lockscreen. */
+    val notificationsPlacement: NotificationsPlacement by
+        hydrator.hydratedStateOf(
+            traceName = "notificationsPlacement",
+            initialValue = NotificationsPlacement.BelowClock,
+            source =
+                combine(shadeModeInteractor.shadeMode, clockInteractor.clockSize) {
+                    shadeMode,
+                    clockSize ->
+                    if (shadeMode is ShadeMode.Split) {
+                        NotificationsPlacement.BesideClock(alignment = Alignment.TopEnd)
+                    } else if (clockSize == ClockSize.SMALL) {
+                        NotificationsPlacement.BelowClock
+                    } else {
+                        NotificationsPlacement.BesideClock(alignment = Alignment.TopStart)
+                    }
+                },
+        )
 
-    private val _unfoldTranslations = MutableStateFlow(UnfoldTranslations())
     /** Amount of horizontal translation that should be applied to elements in the scene. */
-    val unfoldTranslations: StateFlow<UnfoldTranslations> = _unfoldTranslations.asStateFlow()
+    val unfoldTranslations: UnfoldTranslations by
+        hydrator.hydratedStateOf(
+            traceName = "unfoldTranslations",
+            initialValue = UnfoldTranslations(),
+            source =
+                combine(
+                    unfoldTransitionInteractor.unfoldTranslationX(isOnStartSide = true),
+                    unfoldTransitionInteractor.unfoldTranslationX(isOnStartSide = false),
+                    ::UnfoldTranslations,
+                ),
+        )
 
-    private val _isContentVisible = MutableStateFlow(true)
     /** Whether the content of the scene UI should be shown. */
-    val isContentVisible: StateFlow<Boolean> = _isContentVisible.asStateFlow()
+    val isContentVisible: Boolean by
+        hydrator.hydratedStateOf(
+            traceName = "isContentVisible",
+            initialValue = true,
+            // Content is visible unless we're OCCLUDED. Currently, we don't have nice animations
+            // into and out of OCCLUDED, so the lockscreen/AOD content is hidden immediately upon
+            // entering/exiting OCCLUDED.
+            source = transitionInteractor.transitionValue(KeyguardState.OCCLUDED).map { it == 0f },
+        )
+
+    /** Indicates whether lockscreen notifications should be rendered. */
+    val areNotificationsVisible: Boolean by
+        hydrator.hydratedStateOf(
+            traceName = "areNotificationsVisible",
+            initialValue = false,
+            // Content is visible unless we're OCCLUDED. Currently, we don't have nice animations
+            // into and out of OCCLUDED, so the lockscreen/AOD content is hidden immediately upon
+            // entering/exiting OCCLUDED.
+            source =
+                combine(clockInteractor.clockSize, shadeModeInteractor.isShadeLayoutWide) {
+                    clockSize,
+                    isShadeLayoutWide ->
+                    clockSize == ClockSize.SMALL || isShadeLayoutWide
+                },
+        )
 
     /** @see DeviceEntryInteractor.isBypassEnabled */
-    val isBypassEnabled: StateFlow<Boolean>
-        get() = deviceEntryInteractor.isBypassEnabled
+    val isBypassEnabled: Boolean by
+        hydrator.hydratedStateOf(
+            traceName = "isBypassEnabled",
+            source = deviceEntryInteractor.isBypassEnabled,
+        )
+
+    val blueprintId: String by
+        hydrator.hydratedStateOf(
+            traceName = "blueprintId",
+            initialValue = interactor.getCurrentBlueprint().id,
+            source = interactor.blueprint.map { it.id }.distinctUntilChanged(),
+        )
 
     override suspend fun onActivated(): Nothing {
         coroutineScope {
             try {
+                launch { hydrator.activate() }
+
                 keyguardTransitionAnimationCallbackDelegator.delegate =
                     keyguardTransitionAnimationCallback
-                launch {
-                    combine(
-                            unfoldTransitionInteractor.unfoldTranslationX(isOnStartSide = true),
-                            unfoldTransitionInteractor.unfoldTranslationX(isOnStartSide = false),
-                        ) { start, end ->
-                            UnfoldTranslations(start = start, end = end)
-                        }
-                        .collect { _unfoldTranslations.value = it }
-                }
-
-                launch {
-                    transitionInteractor
-                        .transitionValue(KeyguardState.OCCLUDED)
-                        .map { it > 0f }
-                        .collect { fullyOrPartiallyOccluded ->
-                            // Content is visible unless we're OCCLUDED. Currently, we don't have
-                            // nice
-                            // animations into and out of OCCLUDED, so the lockscreen/AOD content is
-                            // hidden immediately upon entering/exiting OCCLUDED.
-                            _isContentVisible.value = !fullyOrPartiallyOccluded
-                        }
-                }
 
                 awaitCancellation()
             } finally {
@@ -118,16 +154,8 @@
         }
     }
 
-    /** Returns a flow that indicates whether lockscreen notifications should be rendered. */
-    fun areNotificationsVisible(): Flow<Boolean> {
-        return combine(clockSize, shadeInteractor.isShadeLayoutWide) { clockSize, isShadeLayoutWide
-            ->
-            clockSize == ClockSize.SMALL || isShadeLayoutWide
-        }
-    }
-
     fun getSmartSpacePaddingTop(resources: Resources): Int {
-        return if (clockSize.value == ClockSize.LARGE) {
+        return if (clockInteractor.clockSize.value == ClockSize.LARGE) {
             resources.getDimensionPixelSize(customR.dimen.keyguard_smartspace_top_offset) +
                 resources.getDimensionPixelSize(R.dimen.keyguard_clock_top_margin)
         } else {
@@ -135,17 +163,6 @@
         }
     }
 
-    fun blueprintId(scope: CoroutineScope): StateFlow<String> {
-        return interactor.blueprint
-            .map { it.id }
-            .distinctUntilChanged()
-            .stateIn(
-                scope = scope,
-                started = SharingStarted.WhileSubscribed(),
-                initialValue = interactor.getCurrentBlueprint().id,
-            )
-    }
-
     data class UnfoldTranslations(
 
         /**
@@ -162,6 +179,15 @@
         val end: Float = 0f,
     )
 
+    /** Where to place the notifications stack on the lockscreen. */
+    sealed interface NotificationsPlacement {
+        /** Show notifications below the lockscreen clock. */
+        data object BelowClock : NotificationsPlacement
+
+        /** Show notifications side-by-side with the clock. */
+        data class BesideClock(val alignment: Alignment) : NotificationsPlacement
+    }
+
     @AssistedFactory
     interface Factory {
         fun create(
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDozingTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDozingTransitionViewModel.kt
index dc7fefa..65c0a4f 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDozingTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDozingTransitionViewModel.kt
@@ -54,7 +54,12 @@
         )
 
     val deviceEntryBackgroundViewAlpha: Flow<Float> =
-        transitionAnimation.immediatelyTransitionTo(0f)
+        transitionAnimation.sharedFlow(
+            duration = TO_DOZING_DURATION,
+            onStep = { null },
+            onFinish = { 0f },
+            onCancel = { 0f },
+        )
 
     override val deviceEntryParentViewAlpha: Flow<Float> =
         deviceEntryUdfpsInteractor.isUdfpsEnrolledAndEnabled.flatMapLatest {
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaViewController.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaViewController.kt
index c177811..2b36872 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaViewController.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaViewController.kt
@@ -1040,13 +1040,19 @@
                 expandedLayout.load(context, R.xml.media_recommendations_expanded)
             }
         }
-        readjustPlayPauseWidth()
+        readjustUIUpdateConstraints()
         refreshState()
     }
 
-    private fun readjustPlayPauseWidth() {
+    private fun readjustUIUpdateConstraints() {
         // TODO: move to xml file when flag is removed.
         if (Flags.mediaControlsUiUpdate()) {
+            collapsedLayout.setGuidelineEnd(
+                R.id.action_button_guideline,
+                context.resources.getDimensionPixelSize(
+                    R.dimen.qs_media_session_collapsed_guideline
+                ),
+            )
             collapsedLayout.constrainWidth(
                 R.id.actionPlayPause,
                 context.resources.getDimensionPixelSize(R.dimen.qs_media_action_play_pause_width),
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 d63c2e0..0107a52 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
@@ -23,11 +23,11 @@
 import android.view.View
 import android.view.ViewGroup
 import android.view.ViewOutlineProvider
+import androidx.annotation.VisibleForTesting
 import androidx.core.view.GestureDetectorCompat
 import androidx.dynamicanimation.animation.FloatPropertyCompat
 import androidx.dynamicanimation.animation.SpringForce
 import com.android.app.tracing.TraceStateLogger
-import com.android.internal.annotations.VisibleForTesting
 import com.android.settingslib.Utils
 import com.android.systemui.Gefingerpoken
 import com.android.systemui.classifier.Classifier.NOTIFICATION_DISMISS
@@ -38,9 +38,10 @@
 import com.android.systemui.util.animation.TransitionLayout
 import com.android.systemui.util.concurrency.DelayableExecutor
 import com.android.wm.shell.shared.animation.PhysicsAnimator
+import kotlin.math.sign
 
 private const val FLING_SLOP = 1000000
-private const val DISMISS_DELAY = 100L
+@VisibleForTesting const val DISMISS_DELAY = 100L
 private const val SCROLL_DELAY = 100L
 private const val RUBBERBAND_FACTOR = 0.2f
 private const val SETTINGS_BUTTON_TRANSLATION_FRACTION = 0.3f
@@ -64,7 +65,7 @@
     private val closeGuts: (immediate: Boolean) -> Unit,
     private val falsingManager: FalsingManager,
     private val logSmartspaceImpression: (Boolean) -> Unit,
-    private val logger: MediaUiEventLogger
+    private val logger: MediaUiEventLogger,
 ) {
     /** Trace state logger for media carousel visibility */
     private val visibleStateLogger = TraceStateLogger("$TAG#visibleToUser")
@@ -96,7 +97,7 @@
 
     /** What's the currently visible player index? */
     var visibleMediaIndex: Int = 0
-        private set
+        @VisibleForTesting set
 
     /** How much are we scrolled into the current media? */
     private var scrollIntoCurrentMedia: Int = 0
@@ -137,14 +138,14 @@
                 eStart: MotionEvent?,
                 eCurrent: MotionEvent,
                 vX: Float,
-                vY: Float
+                vY: Float,
             ) = onFling(vX, vY)
 
             override fun onScroll(
                 down: MotionEvent?,
                 lastMotion: MotionEvent,
                 distanceX: Float,
-                distanceY: Float
+                distanceY: Float,
             ) = onScroll(down!!, lastMotion, distanceX)
 
             override fun onDown(e: MotionEvent): Boolean {
@@ -157,6 +158,7 @@
     val touchListener =
         object : Gefingerpoken {
             override fun onTouchEvent(motionEvent: MotionEvent?) = onTouch(motionEvent!!)
+
             override fun onInterceptTouchEvent(ev: MotionEvent?) = onInterceptTouch(ev!!)
         }
 
@@ -168,7 +170,7 @@
                 scrollX: Int,
                 scrollY: Int,
                 oldScrollX: Int,
-                oldScrollY: Int
+                oldScrollY: Int,
             ) {
                 if (playerWidthPlusPadding == 0) {
                     return
@@ -177,7 +179,7 @@
                 val relativeScrollX = scrollView.relativeScrollX
                 onMediaScrollingChanged(
                     relativeScrollX / playerWidthPlusPadding,
-                    relativeScrollX % playerWidthPlusPadding
+                    relativeScrollX % playerWidthPlusPadding,
                 )
             }
         }
@@ -209,7 +211,7 @@
                         0,
                         carouselWidth,
                         carouselHeight,
-                        cornerRadius.toFloat()
+                        cornerRadius.toFloat(),
                     )
                 }
             }
@@ -235,7 +237,7 @@
                     getMaxTranslation().toFloat(),
                     0.0f,
                     1.0f,
-                    Math.abs(contentTranslation)
+                    Math.abs(contentTranslation),
                 )
             val settingsTranslation =
                 (1.0f - settingsOffset) *
@@ -323,7 +325,7 @@
                         CONTENT_TRANSLATION,
                         newTranslation,
                         startVelocity = 0.0f,
-                        config = translationConfig
+                        config = translationConfig,
                     )
                     .start()
                 scrollView.animationTargetX = newTranslation
@@ -391,7 +393,7 @@
                         CONTENT_TRANSLATION,
                         newTranslation,
                         startVelocity = 0.0f,
-                        config = translationConfig
+                        config = translationConfig,
                     )
                     .start()
             } else {
@@ -430,7 +432,7 @@
                     CONTENT_TRANSLATION,
                     newTranslation,
                     startVelocity = vX,
-                    config = translationConfig
+                    config = translationConfig,
                 )
                 .start()
             scrollView.animationTargetX = newTranslation
@@ -583,10 +585,35 @@
         // We need to post this to wait for the active player becomes visible.
         mainExecutor.executeDelayed(
             { scrollView.smoothScrollTo(view.left, scrollView.scrollY) },
-            SCROLL_DELAY
+            SCROLL_DELAY,
         )
     }
 
+    /**
+     * Scrolls the media carousel by the number of players specified by [step]. If scrolling beyond
+     * the carousel's bounds:
+     * - If the carousel is not dismissible, the settings button is displayed.
+     * - If the carousel is dismissible, no action taken.
+     *
+     * @param step A positive number means next, and negative means previous.
+     */
+    fun scrollByStep(step: Int) {
+        val destIndex = visibleMediaIndex + step
+        if (destIndex >= mediaContent.childCount || destIndex < 0) {
+            if (!showsSettingsButton) return
+            var translation = getMaxTranslation() * sign(-step.toFloat())
+            translation = if (isRtl) -translation else translation
+            PhysicsAnimator.getInstance(this)
+                .spring(CONTENT_TRANSLATION, translation, config = translationConfig)
+                .start()
+            scrollView.animationTargetX = translation
+        } else if (scrollView.getContentTranslation() != 0.0f) {
+            resetTranslation(true)
+        } else {
+            scrollToPlayer(destIndex = destIndex)
+        }
+    }
+
     companion object {
         private val CONTENT_TRANSLATION =
             object : FloatPropertyCompat<MediaCarouselScrollHandler>("contentTranslation") {
diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java
index be814ae..f5e6232 100644
--- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java
+++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java
@@ -185,6 +185,7 @@
             }
 
             boolean isDeviceGroup = false;
+            boolean hideGroupItem = false;
             GroupStatus groupStatus = null;
             OngoingSessionStatus ongoingSessionStatus = null;
             ConnectionState connectionState = ConnectionState.DISCONNECTED;
@@ -209,107 +210,116 @@
                         && !mController.isCurrentConnectedDeviceRemote()) {
                     connectionState = ConnectionState.CONNECTED;
                     restrictVolumeAdjustment = true;
-                    mCurrentActivePosition = position;
                     clickListener = v -> onItemClick(v, device);
-                } else if (mShouldGroupSelectedMediaItems
-                        && mController.getSelectedMediaDevice().size() > 1
-                        && isDeviceIncluded(mController.getSelectedMediaDevice(), device)) {
-                    if (!mediaItem.isFirstDeviceInGroup()) {
-                        mItemLayout.setVisibility(View.GONE);
-                        return;
-                    } else {
-                        isDeviceGroup = true;
-                    }
-                } else if (device.hasSubtext()) {
-                    subtitle = device.getSubtextString();
-                    boolean isActiveWithOngoingSession =
-                            device.hasOngoingSession() && (currentlyConnected || isSelected);
-                    if (isActiveWithOngoingSession) {
-                        mCurrentActivePosition = position;
-                        ongoingSessionStatus = new OngoingSessionStatus(
-                                device.isHostForOngoingSession());
-                        connectionState = ConnectionState.CONNECTED;
-                    } else {
-                        if (currentlyConnected) {
-                            mCurrentActivePosition = position;
-                            connectionState = ConnectionState.CONNECTED;
-                        }
-                        clickListener = getClickListenerBasedOnSelectionBehavior(device);
-                        deviceDisabled = clickListener == null;
-                        deviceStatusIcon = getDeviceStatusIcon(device, device.hasOngoingSession());
-                    }
-                } else if (device.getState() == MediaDeviceState.STATE_CONNECTING_FAILED) {
-                    deviceStatusIcon = mContext.getDrawable(R.drawable.media_output_status_failed);
-                    subtitle = mContext.getString(R.string.media_output_dialog_connect_failed);
-                    clickListener = v -> onItemClick(v, device);
+                } else if (currentlyConnected && isMutingExpectedDeviceExist
+                        && !mController.isCurrentConnectedDeviceRemote()) {
+                    // mark as disconnected and set special click listener
+                    clickListener = v -> cancelMuteAwaitConnection();
                 } else if (device.getState() == MediaDeviceState.STATE_GROUPING) {
                     connectionState = ConnectionState.CONNECTING;
-                } else if (mController.getSelectedMediaDevice().size() > 1 && isSelected) {
-                    // selected device in group
-                    groupStatus = new GroupStatus(
-                            true /* selected */,
-                            isDeselectable /* deselectable */);
-                    connectionState = ConnectionState.CONNECTED;
-                } else if (currentlyConnected) {
-                    // single selected device
-                    if (isMutingExpectedDeviceExist
-                            && !mController.isCurrentConnectedDeviceRemote()) {
-                        // mark as disconnected and set special click listener
-                        clickListener = v -> cancelMuteAwaitConnection();
-                    } else if (device.hasOngoingSession()) {
-                        mCurrentActivePosition = position;
-                        ongoingSessionStatus = new OngoingSessionStatus(
-                                device.isHostForOngoingSession());
-                        connectionState = ConnectionState.CONNECTED;
-                    } else if (mController.isCurrentConnectedDeviceRemote()
-                            && !mController.getSelectableMediaDevice().isEmpty()) {
-                        //If device is connected and there's other selectable devices, layout as
-                        // one of selected devices.
-                        groupStatus = new GroupStatus(
-                                true /* selected */,
-                                isDeselectable /* isDeselectable */);
-                        connectionState = ConnectionState.CONNECTED;
+                } else if (mShouldGroupSelectedMediaItems && hasMultipleSelectedDevices()
+                        && isSelected) {
+                    if (mediaItem.isFirstDeviceInGroup()) {
+                        isDeviceGroup = true;
                     } else {
-                        mCurrentActivePosition = position;
-                        connectionState = ConnectionState.CONNECTED;
+                        hideGroupItem = true;
                     }
-                } else if (isSelectable) {
-                    //groupable device
-                    groupStatus = new GroupStatus(false /* selected */, true /* deselectable */);
-                    if (!Flags.disableTransferWhenAppsDoNotSupport()
-                            || isTransferable
-                            || hasRouteListingPreferenceItem) {
+                } else { // A connected or disconnected device.
+                    subtitle = device.hasSubtext() ? device.getSubtextString() : null;
+                    ongoingSessionStatus = getOngoingSessionStatus(device);
+                    groupStatus = getGroupStatus(isSelected, isSelectable, isDeselectable);
+
+                    if (device.getState() == MediaDeviceState.STATE_CONNECTING_FAILED) {
+                        deviceStatusIcon = mContext.getDrawable(
+                                R.drawable.media_output_status_failed);
+                        subtitle = mContext.getString(R.string.media_output_dialog_connect_failed);
                         clickListener = v -> onItemClick(v, device);
+                    } else if (currentlyConnected || isSelected) {
+                        connectionState = ConnectionState.CONNECTED;
+                    } else { // disconnected
+                        if (isSelectable) { // groupable device
+                            if (!Flags.disableTransferWhenAppsDoNotSupport() || isTransferable
+                                    || hasRouteListingPreferenceItem) {
+                                clickListener = v -> onItemClick(v, device);
+                            }
+                        } else {
+                            deviceStatusIcon = getDeviceStatusIcon(device,
+                                    device.hasOngoingSession());
+                            clickListener = getClickListenerBasedOnSelectionBehavior(device);
+                        }
+                        deviceDisabled = clickListener == null;
                     }
-                    deviceDisabled = clickListener == null;
-                } else {
-                    deviceStatusIcon = getDeviceStatusIcon(device, device.hasOngoingSession());
-                    clickListener = getClickListenerBasedOnSelectionBehavior(device);
-                    deviceDisabled = clickListener == null;
                 }
             }
 
-            if (isDeviceGroup) {
-                String sessionName = mController.getSessionName() == null ? ""
-                        : mController.getSessionName().toString();
-                updateTitle(sessionName);
-                updateUnmutedVolumeIcon(null /* device */);
-                updateGroupSeekBar(getGroupItemContentDescription(sessionName));
-                updateEndAreaForDeviceGroup();
-                updateItemBackground(ConnectionState.CONNECTED);
-            } else {
-                updateTitle(device.getName());
-                updateTitleIcon(device, connectionState, restrictVolumeAdjustment);
-                updateSeekBar(device, connectionState, restrictVolumeAdjustment,
-                        getDeviceItemContentDescription(device));
-                updateEndArea(device, connectionState, groupStatus, ongoingSessionStatus);
-                updateLoadingIndicator(connectionState);
-                updateFullItemClickListener(clickListener);
-                updateContentAlpha(deviceDisabled);
-                updateSubtitle(subtitle);
-                updateDeviceStatusIcon(deviceStatusIcon);
-                updateItemBackground(connectionState);
+            if (connectionState == ConnectionState.CONNECTED || isDeviceGroup) {
+                mCurrentActivePosition = position;
             }
+
+            if (isDeviceGroup) {
+                renderDeviceGroupItem();
+            } else {
+                renderDeviceItem(hideGroupItem, device, connectionState, restrictVolumeAdjustment,
+                        groupStatus, ongoingSessionStatus, clickListener, deviceDisabled, subtitle,
+                        deviceStatusIcon);
+            }
+        }
+
+        private void renderDeviceItem(boolean hideGroupItem, MediaDevice device,
+                ConnectionState connectionState, boolean restrictVolumeAdjustment,
+                GroupStatus groupStatus, OngoingSessionStatus ongoingSessionStatus,
+                View.OnClickListener clickListener, boolean deviceDisabled, String subtitle,
+                Drawable deviceStatusIcon) {
+            if (hideGroupItem) {
+                mItemLayout.setVisibility(View.GONE);
+                return;
+            }
+            updateTitle(device.getName());
+            updateTitleIcon(device, connectionState, restrictVolumeAdjustment);
+            updateSeekBar(device, connectionState, restrictVolumeAdjustment,
+                    getDeviceItemContentDescription(device));
+            updateEndArea(device, connectionState, groupStatus, ongoingSessionStatus);
+            updateLoadingIndicator(connectionState);
+            updateFullItemClickListener(clickListener);
+            updateContentAlpha(deviceDisabled);
+            updateSubtitle(subtitle);
+            updateDeviceStatusIcon(deviceStatusIcon);
+            updateItemBackground(connectionState);
+        }
+
+        private void renderDeviceGroupItem() {
+            String sessionName = mController.getSessionName() == null ? ""
+                    : mController.getSessionName().toString();
+            updateTitle(sessionName);
+            updateUnmutedVolumeIcon(null /* device */);
+            updateGroupSeekBar(getGroupItemContentDescription(sessionName));
+            updateEndAreaForDeviceGroup();
+            updateItemBackground(ConnectionState.CONNECTED);
+        }
+
+        private OngoingSessionStatus getOngoingSessionStatus(MediaDevice device) {
+            return device.hasOngoingSession() ? new OngoingSessionStatus(
+                    device.isHostForOngoingSession()) : null;
+        }
+
+        private GroupStatus getGroupStatus(boolean isSelected, boolean isSelectable,
+                boolean isDeselectable) {
+            // A device should either be selectable or, when the device selected, the list should
+            // have other selectable or selected devices.
+            boolean selectedWithOtherGroupDevices =
+                    isSelected && (hasMultipleSelectedDevices() || hasSelectableDevices());
+            if (isSelectable || selectedWithOtherGroupDevices) {
+                return new GroupStatus(isSelected, isDeselectable);
+            }
+            return null;
+        }
+
+        private boolean hasMultipleSelectedDevices() {
+            return mController.getSelectedMediaDevice().size() > 1;
+        }
+
+        private boolean hasSelectableDevices() {
+            return !mController.getSelectableMediaDevice().isEmpty();
         }
 
         /** Renders the right side round pill button / checkbox. */
@@ -440,6 +450,7 @@
             updateEndAreaColor(groupStatus.selected() ? mController.getColorSeekbarProgress()
                     : mController.getColorItemBackground());
             mEndTouchArea.setContentDescription(getDeviceItemContentDescription(device));
+            mCheckBox.setOnCheckedChangeListener(null);
             mCheckBox.setChecked(groupStatus.selected());
             mCheckBox.setOnCheckedChangeListener(
                     isEnabled ? (buttonView, isChecked) -> onGroupActionTriggered(
diff --git a/packages/SystemUI/src/com/android/systemui/modes/shared/ModesUi.kt b/packages/SystemUI/src/com/android/systemui/modes/shared/ModesUi.kt
index a0663d7..e293e20 100644
--- a/packages/SystemUI/src/com/android/systemui/modes/shared/ModesUi.kt
+++ b/packages/SystemUI/src/com/android/systemui/modes/shared/ModesUi.kt
@@ -25,7 +25,7 @@
     /** Is the refactor enabled */
     @JvmStatic
     inline val isEnabled
-        get() = Flags.modesApi() && Flags.modesUi()
+        get() = Flags.modesUi()
 
     /**
      * Called to ensure code is only run when the flag is enabled. This protects users from the
diff --git a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyDialogV2.kt b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyDialogV2.kt
index 57d4063..9117afb 100644
--- a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyDialogV2.kt
+++ b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyDialogV2.kt
@@ -39,6 +39,11 @@
 import androidx.annotation.WorkerThread
 import androidx.core.view.ViewCompat
 import androidx.core.view.accessibility.AccessibilityNodeInfoCompat
+import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat
+import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_COLLAPSE
+import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_EXPAND
+import androidx.core.view.accessibility.AccessibilityViewCommand
+import com.android.systemui.Flags
 import com.android.systemui.animation.ViewHierarchyAnimator
 import com.android.systemui.res.R
 import com.android.systemui.statusbar.phone.SystemUIDialog
@@ -282,49 +287,95 @@
 
         val expandToggle =
             itemHeader.findViewById<ImageView>(R.id.privacy_dialog_item_header_expand_toggle)!!
-        expandToggle.setImageResource(R.drawable.privacy_dialog_expand_toggle_down)
         expandToggle.visibility = View.VISIBLE
-
-        ViewCompat.replaceAccessibilityAction(
-            itemCard,
-            AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_CLICK,
-            context.getString(R.string.privacy_dialog_expand_action),
-            null,
-        )
-
         val expandedLayout =
             itemCard.findViewById<View>(R.id.privacy_dialog_item_header_expanded_layout)!!
         expandedLayout.setOnClickListener {
             // Stop clicks from propagating
         }
 
-        itemCard.setOnClickListener {
-            if (expandedLayout.visibility == View.VISIBLE) {
-                expandedLayout.visibility = View.GONE
-                expandToggle.setImageResource(R.drawable.privacy_dialog_expand_toggle_down)
-                ViewCompat.replaceAccessibilityAction(
-                    it!!,
-                    AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_CLICK,
-                    context.getString(R.string.privacy_dialog_expand_action),
-                    null,
-                )
-            } else {
-                expandedLayout.visibility = View.VISIBLE
-                expandToggle.setImageResource(R.drawable.privacy_dialog_expand_toggle_up)
-                ViewCompat.replaceAccessibilityAction(
-                    it!!,
-                    AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_CLICK,
-                    context.getString(R.string.privacy_dialog_collapse_action),
-                    null,
+        if (Flags.expandCollapsePrivacyDialog()) {
+            updateExpansion(ACTION_COLLAPSE, itemCard, expandedLayout, expandToggle)
+
+            itemCard.setOnClickListener {
+                if (expandedLayout.visibility == View.VISIBLE) {
+                    updateExpansion(ACTION_COLLAPSE, it!!, expandedLayout, expandToggle)
+                } else {
+                    updateExpansion(ACTION_EXPAND, it!!, expandedLayout, expandToggle)
+                }
+            }
+        } else {
+            expandToggle.setImageResource(R.drawable.privacy_dialog_expand_toggle_down)
+            ViewCompat.replaceAccessibilityAction(
+                itemCard,
+                AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_CLICK,
+                context.getString(R.string.privacy_dialog_expand_action),
+                null,
+            )
+
+            itemCard.setOnClickListener {
+                if (expandedLayout.visibility == View.VISIBLE) {
+                    expandedLayout.visibility = View.GONE
+                    expandToggle.setImageResource(R.drawable.privacy_dialog_expand_toggle_down)
+                    ViewCompat.replaceAccessibilityAction(
+                        it!!,
+                        AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_CLICK,
+                        context.getString(R.string.privacy_dialog_expand_action),
+                        null,
+                    )
+                } else {
+                    expandedLayout.visibility = View.VISIBLE
+                    expandToggle.setImageResource(R.drawable.privacy_dialog_expand_toggle_up)
+                    ViewCompat.replaceAccessibilityAction(
+                        it!!,
+                        AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_CLICK,
+                        context.getString(R.string.privacy_dialog_collapse_action),
+                        null,
+                    )
+                }
+                ViewHierarchyAnimator.animateNextUpdate(
+                    rootView = window!!.decorView,
+                    excludedViews = setOf(expandedLayout),
                 )
             }
-            ViewHierarchyAnimator.animateNextUpdate(
-                rootView = window!!.decorView,
-                excludedViews = setOf(expandedLayout),
-            )
         }
     }
 
+    private fun updateExpansion(
+        newState: AccessibilityActionCompat,
+        itemCard: View,
+        expandedLayout: View,
+        expandToggle: ImageView,
+    ) {
+        expandedLayout.visibility = if (newState == ACTION_COLLAPSE) View.GONE else View.VISIBLE
+        expandToggle.setImageResource(
+            if (newState == ACTION_COLLAPSE) R.drawable.privacy_dialog_expand_toggle_down
+            else R.drawable.privacy_dialog_expand_toggle_up
+        )
+        val accessibilityString =
+            context.getString(
+                if (newState == ACTION_COLLAPSE) R.string.privacy_dialog_expand_action
+                else R.string.privacy_dialog_collapse_action
+            )
+        ViewCompat.replaceAccessibilityAction(
+            itemCard,
+            AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_CLICK,
+            accessibilityString,
+            null,
+        )
+        val expandCollapseAccessibilityListener =
+            AccessibilityViewCommand { view: View, _: AccessibilityViewCommand.CommandArguments? ->
+                view.callOnClick()
+            }
+        ViewCompat.replaceAccessibilityAction(
+            itemCard,
+            if (newState == ACTION_COLLAPSE) ACTION_EXPAND else ACTION_COLLAPSE,
+            accessibilityString,
+            expandCollapseAccessibilityListener,
+        )
+        ViewCompat.removeAccessibilityAction(itemCard, newState.id)
+    }
+
     private fun updateIconView(iconView: ImageView, indicatorIcon: Drawable, active: Boolean) {
         indicatorIcon.setTint(getForegroundColor(active))
         val backgroundIcon = getMutableDrawable(R.drawable.privacy_dialog_background_circle)
diff --git a/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt b/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt
index cf3b496..28540d4 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt
@@ -883,7 +883,7 @@
         var currentTransition: ExpansionTransition? = null
 
         fun snapTo(scene: SceneKey) {
-            state.snapToScene(scene)
+            state.snapTo(scene)
             currentTransition = null
         }
 
diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt
index 7701b90..ebfe101 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt
@@ -34,6 +34,7 @@
 import androidx.compose.foundation.clickable
 import androidx.compose.foundation.clipScrollableContainer
 import androidx.compose.foundation.gestures.Orientation
+import androidx.compose.foundation.gestures.detectTapGestures
 import androidx.compose.foundation.layout.Arrangement.spacedBy
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.BoxScope
@@ -56,14 +57,18 @@
 import androidx.compose.foundation.rememberScrollState
 import androidx.compose.foundation.shape.CircleShape
 import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.foundation.systemGestureExclusion
 import androidx.compose.foundation.verticalScroll
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.automirrored.filled.ArrowBack
+import androidx.compose.material.icons.filled.Add
 import androidx.compose.material.icons.filled.Clear
+import androidx.compose.material.icons.filled.Remove
 import androidx.compose.material3.ExperimentalMaterial3Api
 import androidx.compose.material3.Icon
 import androidx.compose.material3.IconButton
 import androidx.compose.material3.LocalContentColor
+import androidx.compose.material3.LocalMinimumInteractiveComponentSize
 import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.Scaffold
 import androidx.compose.material3.Text
@@ -86,9 +91,12 @@
 import androidx.compose.ui.draw.clip
 import androidx.compose.ui.draw.drawBehind
 import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.geometry.isSpecified
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.graphicsLayer
+import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.layout.MeasureScope
 import androidx.compose.ui.layout.layout
 import androidx.compose.ui.layout.onGloballyPositioned
@@ -105,10 +113,13 @@
 import androidx.compose.ui.semantics.stateDescription
 import androidx.compose.ui.text.style.TextAlign
 import androidx.compose.ui.text.style.TextOverflow
+import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
+import androidx.compose.ui.unit.toSize
 import androidx.compose.ui.util.fastMap
+import androidx.compose.ui.zIndex
 import com.android.app.tracing.coroutines.launchTraced as launch
 import com.android.compose.animation.bounceable
 import com.android.compose.modifiers.height
@@ -131,6 +142,7 @@
 import com.android.systemui.qs.panels.ui.compose.infinitegrid.EditModeTileDefaults.AUTO_SCROLL_SPEED
 import com.android.systemui.qs.panels.ui.compose.infinitegrid.EditModeTileDefaults.AvailableTilesGridMinHeight
 import com.android.systemui.qs.panels.ui.compose.infinitegrid.EditModeTileDefaults.CurrentTilesGridPadding
+import com.android.systemui.qs.panels.ui.compose.infinitegrid.EditModeTileDefaults.TileBadgeSize
 import com.android.systemui.qs.panels.ui.compose.selection.MutableSelectionState
 import com.android.systemui.qs.panels.ui.compose.selection.ResizableTileContainer
 import com.android.systemui.qs.panels.ui.compose.selection.ResizingState
@@ -143,6 +155,7 @@
 import com.android.systemui.qs.panels.ui.model.GridCell
 import com.android.systemui.qs.panels.ui.model.SpacerGridCell
 import com.android.systemui.qs.panels.ui.model.TileGridCell
+import com.android.systemui.qs.panels.ui.viewmodel.AvailableEditActions
 import com.android.systemui.qs.panels.ui.viewmodel.BounceableTileViewModel
 import com.android.systemui.qs.panels.ui.viewmodel.EditTileViewModel
 import com.android.systemui.qs.pipeline.shared.TileSpec
@@ -152,6 +165,7 @@
 import kotlin.math.roundToInt
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.delay
+import kotlinx.coroutines.launch
 
 object TileType
 
@@ -232,16 +246,14 @@
                         // the top bar
                         .padding(top = innerPadding.calculateTopPadding())
                         .clipScrollableContainer(Orientation.Vertical)
-                        .verticalScroll(scrollState),
+                        .verticalScroll(scrollState)
+                        .dragAndDropRemoveZone(listState, onRemoveTile),
             ) {
                 AnimatedContent(
                     targetState = listState.dragInProgress || selectionState.selected,
                     label = "QSEditHeader",
                 ) { showRemoveTarget ->
-                    EditGridHeader(
-                        Modifier.dragAndDropRemoveZone(listState, onRemoveTile)
-                            .padding(bottom = 26.dp)
-                    ) {
+                    EditGridHeader(Modifier.padding(bottom = 26.dp)) {
                         if (showRemoveTarget) {
                             RemoveTileTarget {
                                 selectionState.selection?.let {
@@ -261,6 +273,7 @@
                     columns,
                     largeTilesSpan,
                     onResize,
+                    onRemoveTile,
                     onSetTiles,
                 )
 
@@ -269,7 +282,6 @@
                     Modifier.fillMaxWidth()
                         .requiredHeightIn(AvailableTilesGridMinHeight)
                         .animateContentSize()
-                        .dragAndDropRemoveZone(listState, onRemoveTile)
                 ) {
                     // Using the fully qualified name here as a workaround for AnimatedVisibility
                     // not being available from a Box
@@ -385,6 +397,7 @@
     columns: Int,
     largeTilesSpan: Int,
     onResize: (TileSpec, toIcon: Boolean) -> Unit,
+    onRemoveTile: (TileSpec) -> Unit,
     onSetTiles: (List<TileSpec>) -> Unit,
 ) {
     val currentListState by rememberUpdatedState(listState)
@@ -424,8 +437,15 @@
                 }
                 .testTag(CURRENT_TILES_GRID_TEST_TAG),
     ) {
-        EditTiles(cells, columns, listState, selectionState, coroutineScope, largeTilesSpan) {
-            resizingOperation ->
+        EditTiles(
+            cells,
+            columns,
+            listState,
+            selectionState,
+            coroutineScope,
+            largeTilesSpan,
+            onRemoveTile,
+        ) { resizingOperation ->
             when (resizingOperation) {
                 is TemporaryResizeOperation -> {
                     currentListState.resizeTile(resizingOperation.spec, resizingOperation.toIcon)
@@ -530,6 +550,7 @@
     selectionState: MutableSelectionState,
     coroutineScope: CoroutineScope,
     largeTilesSpan: Int,
+    onRemoveTile: (TileSpec) -> Unit,
     onResize: (operation: ResizeOperation) -> Unit,
 ) {
     items(
@@ -558,6 +579,7 @@
                         dragAndDropState = dragAndDropState,
                         selectionState = selectionState,
                         onResize = onResize,
+                        onRemoveTile = onRemoveTile,
                         coroutineScope = coroutineScope,
                         bounceableInfo = cells.bounceableInfo(index, columns),
                         largeTilesSpan = largeTilesSpan,
@@ -576,6 +598,7 @@
     dragAndDropState: DragAndDropState,
     selectionState: MutableSelectionState,
     onResize: (operation: ResizeOperation) -> Unit,
+    onRemoveTile: (TileSpec) -> Unit,
     coroutineScope: CoroutineScope,
     largeTilesSpan: Int,
     bounceableInfo: BounceableInfo,
@@ -583,6 +606,8 @@
 ) {
     val stateDescription = stringResource(id = R.string.accessibility_qs_edit_position, index + 1)
     var selected by remember { mutableStateOf(false) }
+    val showRemovalBadge =
+        !selected && cell.tile.availableEditActions.contains(AvailableEditActions.REMOVE)
     val selectionAlpha by
         animateFloatAsState(
             targetValue = if (selected) 1f else 0f,
@@ -682,6 +707,15 @@
         ) {
             EditTile(tile = cell.tile, state = state, progress = progress)
         }
+
+        if (showRemovalBadge) {
+            TileBadge(
+                icon = Icons.Default.Remove,
+                contentDescription = stringResource(R.string.qs_customize_remove),
+            ) {
+                onRemoveTile(cell.tile.tileSpec)
+            }
+        }
     }
 }
 
@@ -708,27 +742,35 @@
         verticalArrangement = spacedBy(CommonTileDefaults.TilePadding, Alignment.Top),
         modifier = modifier,
     ) {
-        Box(
-            Modifier.fillMaxWidth()
-                .height(TileHeight)
-                .clickable(onClick = onClick, onClickLabel = onClickActionName)
-                .semantics(mergeDescendants = true) { this.stateDescription = stateDescription }
-                .dragAndDropTileSource(
-                    SizedTileImpl(cell.tile, cell.width),
-                    dragAndDropState,
-                    DragType.Add,
-                ) {
-                    selectionState.unSelect()
-                }
-                .tileBackground(colors.background)
-                .tilePadding()
-        ) {
-            // Icon
-            SmallTileContent(
-                iconProvider = { cell.tile.icon },
-                color = colors.icon,
-                animateToEnd = true,
-                modifier = Modifier.align(Alignment.Center),
+        Box {
+            Box(
+                Modifier.fillMaxWidth()
+                    .height(TileHeight)
+                    .clickable(onClick = onClick, onClickLabel = onClickActionName)
+                    .semantics(mergeDescendants = true) { this.stateDescription = stateDescription }
+                    .dragAndDropTileSource(
+                        SizedTileImpl(cell.tile, cell.width),
+                        dragAndDropState,
+                        DragType.Add,
+                    ) {
+                        selectionState.unSelect()
+                    }
+                    .tileBackground(colors.background)
+                    .tilePadding()
+            ) {
+                // Icon
+                SmallTileContent(
+                    iconProvider = { cell.tile.icon },
+                    color = colors.icon,
+                    animateToEnd = true,
+                    modifier = Modifier.align(Alignment.Center),
+                )
+            }
+
+            TileBadge(
+                icon = Icons.Default.Add,
+                contentDescription = onClickActionName,
+                onClick = onClick,
             )
         }
         Box(Modifier.fillMaxSize()) {
@@ -745,6 +787,39 @@
 }
 
 @Composable
+private fun TileBadge(icon: ImageVector, contentDescription: String?, onClick: () -> Unit) {
+    // Use a higher zIndex than the tile to draw over it, and manually create the touch target as
+    // we're drawing over neighbor tiles as well.
+    val minTouchTargetSize = LocalMinimumInteractiveComponentSize.current
+
+    Box(
+        Modifier.zIndex(2f)
+            .layout { measurable, constraints ->
+                val size = minTouchTargetSize.roundToPx()
+                val placeable = measurable.measure(Constraints(size))
+                layout(placeable.width, placeable.height) {
+                    val iconRadius = TileBadgeSize.roundToPx() / 2
+                    val x = constraints.maxWidth - placeable.width / 2 - iconRadius
+                    val y = 0 - placeable.height / 2 + iconRadius
+                    placeable.place(x, y)
+                }
+            }
+            .systemGestureExclusion { Rect(Offset.Zero, it.size.toSize()) }
+            .pointerInput(Unit) { detectTapGestures { onClick() } }
+    ) {
+        val secondaryColor = MaterialTheme.colorScheme.secondary
+        Icon(
+            icon,
+            contentDescription = contentDescription,
+            modifier =
+                Modifier.size(TileBadgeSize).align(Alignment.Center).drawBehind {
+                    drawCircle(secondaryColor)
+                },
+        )
+    }
+}
+
+@Composable
 private fun SpacerGridCell(modifier: Modifier = Modifier) {
     // By default, spacers are invisible and exist purely to catch drag movements
     Box(modifier.height(TileHeight).fillMaxWidth())
@@ -829,6 +904,7 @@
     const val AUTO_SCROLL_SPEED = 2 // 2ms per pixel
     val CurrentTilesGridPadding = 8.dp
     val AvailableTilesGridMinHeight = 200.dp
+    val TileBadgeSize = 20.dp
 
     @Composable
     fun editTileColors(): TileColors =
diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/selection/Selection.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/selection/Selection.kt
index c1545e1..7c47263 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/selection/Selection.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/selection/Selection.kt
@@ -81,7 +81,7 @@
             state = state,
             modifier =
                 // Higher zIndex to make sure the handle is drawn above the content
-                Modifier.zIndex(2f),
+                Modifier.zIndex(if (selected) 2f else 1f),
         )
     }
 }
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 973265c..fd5861f 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java
@@ -43,8 +43,8 @@
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 import com.android.settingslib.satellite.SatelliteDialogUtils;
 import com.android.systemui.animation.Expandable;
+import com.android.systemui.bluetooth.qsdialog.BluetoothDetailsContentViewModel;
 import com.android.systemui.bluetooth.qsdialog.BluetoothDetailsViewModel;
-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;
@@ -84,7 +84,7 @@
 
     private final Executor mExecutor;
 
-    private final BluetoothTileDialogViewModel mDialogViewModel;
+    private final BluetoothDetailsContentViewModel mDetailsContentViewModel;
 
     private final FeatureFlags mFeatureFlags;
     @Nullable
@@ -104,7 +104,7 @@
             QSLogger qsLogger,
             BluetoothController bluetoothController,
             FeatureFlags featureFlags,
-            BluetoothTileDialogViewModel dialogViewModel
+            BluetoothDetailsContentViewModel detailsContentViewModel
     ) {
         super(host, uiEventLogger, backgroundLooper, mainHandler, falsingManager, metricsLogger,
                 statusBarStateController, activityStarter, qsLogger);
@@ -112,7 +112,7 @@
         mController.observe(getLifecycle(), mCallback);
         mExecutor = new HandlerExecutor(mainHandler);
         mFeatureFlags = featureFlags;
-        mDialogViewModel = dialogViewModel;
+        mDetailsContentViewModel = detailsContentViewModel;
     }
 
     @Override
@@ -133,7 +133,7 @@
                 callback.accept(new BluetoothDetailsViewModel(() -> {
                     longClick(null);
                     return null;
-                }, mDialogViewModel))
+                }, mDetailsContentViewModel))
         );
         return true;
     }
@@ -158,7 +158,7 @@
 
     private void handleClickEvent(@Nullable Expandable expandable) {
         if (mFeatureFlags.isEnabled(Flags.BLUETOOTH_QS_TILE_DIALOG)) {
-            mDialogViewModel.showDetailsContent(expandable, /* view= */ null);
+            mDetailsContentViewModel.showDetailsContent(expandable, /* view= */ null);
         } else {
             // Secondary clicks are header clicks, just toggle.
             toggleBluetooth();
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTileNewImpl.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTileNewImpl.kt
index 4d0e808..f80b8fb 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTileNewImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTileNewImpl.kt
@@ -36,7 +36,6 @@
 import com.android.systemui.qs.tileimpl.QSTileImpl
 import com.android.systemui.qs.tiles.dialog.InternetDetailsViewModel
 import com.android.systemui.qs.tiles.dialog.InternetDialogManager
-import com.android.systemui.qs.tiles.dialog.WifiStateWorker
 import com.android.systemui.res.R
 import com.android.systemui.statusbar.connectivity.AccessPointController
 import com.android.systemui.statusbar.pipeline.shared.ui.binder.InternetTileBinder
@@ -58,7 +57,6 @@
     qsLogger: QSLogger,
     viewModel: InternetTileViewModel,
     private val internetDialogManager: InternetDialogManager,
-    private val wifiStateWorker: WifiStateWorker,
     private val accessPointController: AccessPointController,
     private val internetDetailsViewModelFactory: InternetDetailsViewModel.Factory,
 ) :
@@ -86,10 +84,7 @@
         mContext.getString(R.string.quick_settings_internet_label)
 
     override fun newTileState(): QSTile.BooleanState {
-        return QSTile.BooleanState().also {
-            it.forceExpandIcon = true
-            it.handlesSecondaryClick = true
-        }
+        return QSTile.BooleanState().also { it.forceExpandIcon = true }
     }
 
     override fun handleClick(expandable: Expandable?) {
@@ -107,12 +102,6 @@
         return internetDetailsViewModelFactory.create { longClick(null) }
     }
 
-    override fun handleSecondaryClick(expandable: Expandable?) {
-        // TODO(b/358352265): Figure out the correct action for the secondary click
-        // Toggle wifi
-        wifiStateWorker.isWifiEnabled = !wifiStateWorker.isWifiEnabled
-    }
-
     override fun handleUpdateState(state: QSTile.BooleanState, arg: Any?) {
         state.label = mContext.resources.getString(R.string.quick_settings_internet_label)
         state.expandedAccessibilityClassName = Button::class.java.name
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/ScreenRecordTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/ScreenRecordTile.java
index 42b35c7..7b88d69 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/ScreenRecordTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/ScreenRecordTile.java
@@ -26,6 +26,7 @@
 import android.util.Log;
 import android.widget.Button;
 import android.widget.Switch;
+import android.widget.Toast;
 
 import androidx.annotation.Nullable;
 
@@ -192,8 +193,19 @@
     @Override
     public boolean getDetailsViewModel(Consumer<TileDetailsViewModel> callback) {
         handleClick(() -> executeWhenUnlockedKeyguard(
-                () -> callback.accept(new ScreenRecordDetailsViewModel(mController,
-                                        this::onStartRecordingClicked)))
+                () -> {
+                    if (mController.isScreenCaptureDisabled()) {
+                        // Close the panel first so that the toast can show up.
+                        mDialogTransitionAnimator.disableAllCurrentDialogsExitAnimations();
+                        mPanelInteractor.collapsePanels();
+
+                        showDisabledByPolicyToast();
+                        return;
+                    }
+
+                    callback.accept(new ScreenRecordDetailsViewModel(mController,
+                            this::onStartRecordingClicked));
+                })
         );
         return true;
     }
@@ -244,6 +256,12 @@
         return mContext.getString(R.string.quick_settings_screen_record_label);
     }
 
+    void showDisabledByPolicyToast() {
+        Toast.makeText(mContext,
+                R.string.screen_capturing_disabled_by_policy_dialog_description, Toast.LENGTH_SHORT)
+                .show();
+    }
+
     private void cancelCountdown() {
         Log.d(TAG, "Cancelling countdown");
         mController.cancelCountdown();
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegateLegacy.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegateLegacy.java
index c6bcab4..75cb8dd 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegateLegacy.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegateLegacy.java
@@ -589,8 +589,10 @@
                 }
                 mSecondaryMobileNetworkLayout = mDialogView.findViewById(
                         R.id.secondary_mobile_network_layout);
-                mSecondaryMobileNetworkLayout.setOnClickListener(
-                        this::onClickConnectedSecondarySub);
+                if (mCanConfigMobileData) {
+                    mSecondaryMobileNetworkLayout.setOnClickListener(
+                            this::onClickConnectedSecondarySub);
+                }
                 mSecondaryMobileNetworkLayout.setBackground(mBackgroundOn);
 
                 TextView mSecondaryMobileTitleText = mDialogView.requireViewById(
@@ -623,6 +625,8 @@
                         mDialogView.requireViewById(R.id.secondary_settings_icon);
                 mSecondaryMobileSettingsIcon.setColorFilter(
                         dialog.getContext().getColor(R.color.connected_network_primary_color));
+                mSecondaryMobileSettingsIcon.setVisibility(mCanConfigMobileData ?
+                        View.VISIBLE : View.INVISIBLE);
 
                 // set secondary visual for default data sub
                 mMobileNetworkLayout.setBackground(mBackgroundOff);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/ScreenRecordDetailsContent.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/ScreenRecordDetailsContent.kt
index bf1a51d..3eb73d8 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/ScreenRecordDetailsContent.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/ScreenRecordDetailsContent.kt
@@ -28,13 +28,6 @@
 
 @Composable
 fun ScreenRecordDetailsContent(viewModel: ScreenRecordDetailsViewModel) {
-    // TODO(b/378514312): Finish implementing this function.
-
-    if (viewModel.recordingController.isScreenCaptureDisabled) {
-        // TODO(b/388345506): Show disabled page here.
-        return
-    }
-
     val viewBinder: ScreenRecordPermissionViewBinder = remember {
         viewModel.recordingController.createScreenRecordPermissionViewBinder(
             viewModel.onStartRecordingClicked
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/internet/domain/InternetTileMapper.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/internet/domain/InternetTileMapper.kt
index 7ad01e4..8d58805 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/internet/domain/InternetTileMapper.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/internet/domain/InternetTileMapper.kt
@@ -92,10 +92,6 @@
                 else QSTileState.ActivationState.INACTIVE
 
             supportedActions =
-                setOf(
-                    QSTileState.UserAction.CLICK,
-                    QSTileState.UserAction.TOGGLE_CLICK,
-                    QSTileState.UserAction.LONG_CLICK,
-                )
+                setOf(QSTileState.UserAction.CLICK, QSTileState.UserAction.LONG_CLICK)
         }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/internet/domain/interactor/InternetTileUserActionInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/internet/domain/interactor/InternetTileUserActionInteractor.kt
index 6e2c437..8e48fe4 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/internet/domain/interactor/InternetTileUserActionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/internet/domain/interactor/InternetTileUserActionInteractor.kt
@@ -26,7 +26,6 @@
 import com.android.systemui.qs.tiles.base.interactor.QSTileUserActionInteractor
 import com.android.systemui.qs.tiles.dialog.InternetDetailsViewModel
 import com.android.systemui.qs.tiles.dialog.InternetDialogManager
-import com.android.systemui.qs.tiles.dialog.WifiStateWorker
 import com.android.systemui.qs.tiles.impl.internet.domain.model.InternetTileModel
 import com.android.systemui.qs.tiles.viewmodel.QSTileUserAction
 import com.android.systemui.statusbar.connectivity.AccessPointController
@@ -40,7 +39,6 @@
 constructor(
     @Main private val mainContext: CoroutineContext,
     private val internetDialogManager: InternetDialogManager,
-    private val wifiStateWorker: WifiStateWorker,
     private val accessPointController: AccessPointController,
     private val qsTileIntentUserActionHandler: QSTileIntentUserInputHandler,
     private val internetDetailsViewModelFactory: InternetDetailsViewModel.Factory,
@@ -59,24 +57,17 @@
                         )
                     }
                 }
-                is QSTileUserAction.ToggleClick -> {
-                    // TODO(b/358352265): Figure out the correct action for the secondary click
-                    // Toggle Wifi
-                    wifiStateWorker.isWifiEnabled = !wifiStateWorker.isWifiEnabled
-                }
                 is QSTileUserAction.LongClick -> {
                     handleLongClick(action.expandable)
                 }
+                else -> {}
             }
         }
 
     override val detailsViewModel: TileDetailsViewModel =
         internetDetailsViewModelFactory.create { handleLongClick(null) }
 
-    private fun handleLongClick(expandable:Expandable?){
-        qsTileIntentUserActionHandler.handle(
-            expandable,
-            Intent(Settings.ACTION_WIFI_SETTINGS)
-        )
+    private fun handleLongClick(expandable: Expandable?) {
+        qsTileIntentUserActionHandler.handle(expandable, Intent(Settings.ACTION_WIFI_SETTINGS))
     }
 }
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 475c079..e9e7dec 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
@@ -16,6 +16,7 @@
 
 package com.android.systemui.scene.domain.interactor
 
+import com.android.app.tracing.coroutines.flow.stateInTraced
 import com.android.compose.animation.scene.ContentKey
 import com.android.compose.animation.scene.ObservableTransitionState
 import com.android.compose.animation.scene.OverlayKey
@@ -52,7 +53,6 @@
 import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.onEach
-import kotlinx.coroutines.flow.stateIn
 import kotlinx.coroutines.flow.update
 import kotlinx.coroutines.launch
 
@@ -124,7 +124,8 @@
     val transitionState: StateFlow<ObservableTransitionState> =
         repository.transitionState
             .onEach { logger.logSceneTransition(it) }
-            .stateIn(
+            .stateInTraced(
+                name = "transitionState",
                 scope = applicationScope,
                 started = SharingStarted.Eagerly,
                 initialValue = repository.transitionState.value,
@@ -145,7 +146,8 @@
                     is ObservableTransitionState.Transition -> state.toContent
                 }
             }
-            .stateIn(
+            .stateInTraced(
+                name = "transitioningTo",
                 scope = applicationScope,
                 started = SharingStarted.WhileSubscribed(),
                 initialValue = null,
@@ -164,7 +166,8 @@
                     is ObservableTransitionState.Idle -> flowOf(false)
                 }
             }
-            .stateIn(
+            .stateInTraced(
+                name = "isTransitionUserInputOngoing",
                 scope = applicationScope,
                 started = SharingStarted.WhileSubscribed(),
                 initialValue = false,
@@ -183,7 +186,8 @@
                     activeTransitionAnimationCount = activeTransitionAnimationCount,
                 )
             }
-            .stateIn(
+            .stateInTraced(
+                name = "isVisible",
                 scope = applicationScope,
                 started = SharingStarted.WhileSubscribed(),
                 initialValue = isVisibleInternal(),
diff --git a/packages/SystemUI/src/com/android/systemui/scene/domain/resolver/HomeSceneFamilyResolver.kt b/packages/SystemUI/src/com/android/systemui/scene/domain/resolver/HomeSceneFamilyResolver.kt
index 140b231..aab37d4 100644
--- a/packages/SystemUI/src/com/android/systemui/scene/domain/resolver/HomeSceneFamilyResolver.kt
+++ b/packages/SystemUI/src/com/android/systemui/scene/domain/resolver/HomeSceneFamilyResolver.kt
@@ -16,7 +16,6 @@
 
 package com.android.systemui.scene.domain.resolver
 
-import android.util.Log
 import com.android.compose.animation.scene.SceneKey
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Application
@@ -84,7 +83,7 @@
         isDreamingWithOverlay: Boolean,
         isAbleToDream: Boolean,
     ): SceneKey {
-        val result = when {
+        return when {
             // Dream can run even if Keyguard is disabled, thus it has the highest priority here.
             isDreamingWithOverlay && isAbleToDream -> Scenes.Dream
             !isKeyguardEnabled -> Scenes.Gone
@@ -93,21 +92,9 @@
             !isUnlocked -> Scenes.Lockscreen
             else -> Scenes.Gone
         }
-        Log.d(TAG, "homeScene emitting $result, values:")
-        Log.d(TAG, "  isKeyguardEnabled=$isKeyguardEnabled")
-        Log.d(TAG, "  canSwipeToEnter=$canSwipeToEnter")
-        Log.d(TAG, "  isDeviceEntered=$isDeviceEntered" )
-        Log.d(TAG, "  isUnlocked=$isUnlocked")
-        Log.d(TAG, "  isDreamingWithOverlay=$isDreamingWithOverlay")
-        Log.d(TAG, "  isAbleToDream=$isAbleToDream")
-        Log.d(TAG, "")
-        return result
     }
 
     companion object {
-
-        private const val TAG = "HomeSceneFamilyResolver"
-
         val homeScenes =
             setOf(
                 Scenes.Gone,
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 94e32fc..16adf5e 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
@@ -90,6 +90,7 @@
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.channels.awaitClose
 import kotlinx.coroutines.coroutineScope
+import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.SharingStarted
 import kotlinx.coroutines.flow.collectLatest
 import kotlinx.coroutines.flow.combine
@@ -610,15 +611,24 @@
 
     private fun handleShadeTouchability() {
         applicationScope.launch {
-            shadeInteractor.isShadeTouchable
-                .distinctUntilChanged()
-                .filter { !it }
-                .collect {
-                    switchToScene(
-                        targetSceneKey = Scenes.Lockscreen,
-                        loggingReason = "device became non-interactive (SceneContainerStartable)",
-                    )
+            repeatWhen(deviceEntryInteractor.isDeviceEntered.map { !it }) {
+                // Run logic only when the device isn't entered.
+                repeatWhen(
+                    sceneInteractor.transitionState.map { !it.isTransitioning(to = Scenes.Gone) }
+                ) {
+                    // Run logic only when not transitioning to gone.
+                    shadeInteractor.isShadeTouchable
+                        .distinctUntilChanged()
+                        .filter { !it }
+                        .collect {
+                            switchToScene(
+                                targetSceneKey = Scenes.Lockscreen,
+                                loggingReason =
+                                    "device became non-interactive (SceneContainerStartable)",
+                            )
+                        }
                 }
+            }
         }
     }
 
@@ -1013,6 +1023,14 @@
         }
     }
 
+    private suspend fun repeatWhen(condition: Flow<Boolean>, block: suspend () -> Unit) {
+        condition.distinctUntilChanged().collectLatest { conditionMet ->
+            if (conditionMet) {
+                block()
+            }
+        }
+    }
+
     companion object {
         private const val TAG = "SceneContainerStartable"
     }
diff --git a/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt b/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt
index 01bcc24..efdf5be 100644
--- a/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt
@@ -40,6 +40,7 @@
 import com.android.systemui.power.domain.interactor.PowerInteractor
 import com.android.systemui.scene.domain.interactor.SceneInteractor
 import com.android.systemui.scene.shared.logger.SceneLogger
+import com.android.systemui.scene.shared.model.Overlays
 import com.android.systemui.scene.shared.model.Scenes
 import com.android.systemui.scene.ui.composable.Overlay
 import com.android.systemui.shade.domain.interactor.ShadeModeInteractor
@@ -218,39 +219,36 @@
      * it being a false touch.
      */
     fun canChangeScene(toScene: SceneKey): Boolean {
-        val interactionTypeOrNull =
-            when (toScene) {
-                Scenes.Bouncer -> Classifier.BOUNCER_UNLOCK
-                Scenes.Gone -> Classifier.UNLOCK
-                Scenes.Shade -> Classifier.NOTIFICATION_DRAG_DOWN
-                Scenes.QuickSettings -> Classifier.QUICK_SETTINGS
-                else -> null
-            }
-
-        val fromScene = currentScene.value
-        val isAllowed =
-            interactionTypeOrNull?.let { interactionType ->
-                // It's important that the falsing system is always queried, even if no enforcement
-                // will occur. This helps build up the right signal in the system.
-                val isFalseTouch = falsingInteractor.isFalseTouch(interactionType)
-
-                // Only enforce falsing if moving from the lockscreen scene to a new scene.
-                val fromLockscreenScene = fromScene == Scenes.Lockscreen
-
-                !fromLockscreenScene || !isFalseTouch
-            } ?: true
-
-        if (isAllowed) {
+        return isInteractionAllowedByFalsing(toScene).also {
             // A scene change is guaranteed; log it.
             logger.logSceneChanged(
-                from = fromScene,
+                from = currentScene.value,
                 to = toScene,
                 sceneState = null,
                 reason = "user interaction",
                 isInstant = false,
             )
         }
-        return isAllowed
+    }
+
+    /**
+     * Returns `true` if showing the [newlyShown] overlay is currently allowed; `false` otherwise.
+     *
+     * This is invoked only for user-initiated transitions. The goal is to check with the falsing
+     * system whether the overlay change should be rejected due to it being a false touch.
+     */
+    fun canShowOrReplaceOverlay(
+        newlyShown: OverlayKey,
+        beingReplaced: OverlayKey? = null,
+    ): Boolean {
+        return isInteractionAllowedByFalsing(newlyShown).also {
+            // An overlay change is guaranteed; log it.
+            logger.logOverlayChangeRequested(
+                from = beingReplaced,
+                to = newlyShown,
+                reason = "user interaction",
+            )
+        }
     }
 
     /**
@@ -313,6 +311,34 @@
         return sceneInteractor.filteredUserActions(unfiltered)
     }
 
+    /**
+     * Returns `true` if transitioning to [content] is permissible by the falsing system; `false`
+     * otherwise.
+     */
+    private fun isInteractionAllowedByFalsing(content: ContentKey): Boolean {
+        val interactionTypeOrNull =
+            when (content) {
+                Scenes.Bouncer -> Classifier.BOUNCER_UNLOCK
+                Scenes.Gone -> Classifier.UNLOCK
+                Scenes.Shade,
+                Overlays.NotificationsShade -> Classifier.NOTIFICATION_DRAG_DOWN
+                Scenes.QuickSettings,
+                Overlays.QuickSettingsShade -> Classifier.QUICK_SETTINGS
+                else -> null
+            }
+
+        return interactionTypeOrNull?.let { interactionType ->
+            // It's important that the falsing system is always queried, even if no enforcement
+            // will occur. This helps build up the right signal in the system.
+            val isFalseTouch = falsingInteractor.isFalseTouch(interactionType)
+
+            // Only enforce falsing if moving from the lockscreen scene to new content.
+            val fromLockscreenScene = currentScene.value == Scenes.Lockscreen
+
+            !fromLockscreenScene || !isFalseTouch
+        } ?: true
+    }
+
     /** Defines interface for classes that can handle externally-reported [MotionEvent]s. */
     interface MotionEventHandler {
         /** Notifies that a [MotionEvent] has occurred. */
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/scroll/ImageTileSet.java b/packages/SystemUI/src/com/android/systemui/screenshot/scroll/ImageTileSet.java
index 76a72f7..25c3805 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/scroll/ImageTileSet.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/scroll/ImageTileSet.java
@@ -29,6 +29,7 @@
 
 import com.android.internal.util.CallbackRegistry;
 import com.android.internal.util.CallbackRegistry.NotifierCallback;
+import com.android.systemui.dagger.qualifiers.Main;
 
 import java.util.ArrayList;
 import java.util.Iterator;
@@ -49,7 +50,7 @@
     private CallbackRegistry<OnContentChangedListener, ImageTileSet, Rect> mContentListeners;
 
     @Inject
-    ImageTileSet(@UiThread Handler handler) {
+    ImageTileSet(@Main Handler handler) {
         mHandler = handler;
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/shade/BaseShadeControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/BaseShadeControllerImpl.kt
index b271c69..71977ef 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/BaseShadeControllerImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/BaseShadeControllerImpl.kt
@@ -16,19 +16,19 @@
 
 package com.android.systemui.shade
 
+import com.android.keyguard.KeyguardViewController
 import com.android.systemui.assist.AssistManager
 import com.android.systemui.statusbar.CommandQueue
 import com.android.systemui.statusbar.NotificationPresenter
 import com.android.systemui.statusbar.NotificationShadeWindowController
-import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager
 import dagger.Lazy
 
 /** A base class for non-empty implementations of ShadeController. */
 abstract class BaseShadeControllerImpl(
     protected val commandQueue: CommandQueue,
-    protected val statusBarKeyguardViewManager: StatusBarKeyguardViewManager,
+    protected val keyguardViewController: KeyguardViewController,
     protected val notificationShadeWindowController: NotificationShadeWindowController,
-    protected val assistManagerLazy: Lazy<AssistManager>
+    protected val assistManagerLazy: Lazy<AssistManager>,
 ) : ShadeController {
     protected lateinit var notifPresenter: NotificationPresenter
     /** Runnables to run after completing a collapse of the shade. */
@@ -66,7 +66,7 @@
         for (r in clonedList) {
             r.run()
         }
-        statusBarKeyguardViewManager.readyForKeyguardDone()
+        keyguardViewController.readyForKeyguardDone()
     }
 
     final override fun onLaunchAnimationEnd(launchIsFullScreen: Boolean) {
@@ -77,6 +77,7 @@
             instantCollapseShade()
         }
     }
+
     final override fun onLaunchAnimationCancelled(isLaunchForActivity: Boolean) {
         if (
             notifPresenter.isPresenterFullyCollapsed() &&
diff --git a/packages/SystemUI/src/com/android/systemui/shade/GlanceableHubContainerController.kt b/packages/SystemUI/src/com/android/systemui/shade/GlanceableHubContainerController.kt
index a379ef7..305e71e 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/GlanceableHubContainerController.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/GlanceableHubContainerController.kt
@@ -520,7 +520,10 @@
         val glanceableHubV2 = communalSettingsInteractor.isV2FlagEnabled()
         if (
             !hubShowing &&
-                (touchOnNotifications || touchOnUmo || touchOnSmartspace || glanceableHubV2)
+                (touchOnNotifications ||
+                    touchOnUmo ||
+                    touchOnSmartspace ||
+                    !communalViewModel.swipeToHubEnabled())
         ) {
             logger.d({
                 "Lockscreen touch ignored: touchOnNotifications: $bool1, touchOnUmo: $bool2, " +
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeControllerImpl.java b/packages/SystemUI/src/com/android/systemui/shade/ShadeControllerImpl.java
index 0e30f2b..acae1bc 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ShadeControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeControllerImpl.java
@@ -23,6 +23,7 @@
 import android.view.ViewTreeObserver;
 import android.view.WindowManagerGlobal;
 
+import com.android.keyguard.KeyguardViewController;
 import com.android.systemui.DejankUtils;
 import com.android.systemui.assist.AssistManager;
 import com.android.systemui.dagger.SysUISingleton;
@@ -35,7 +36,6 @@
 import com.android.systemui.statusbar.NotificationShadeWindowController;
 import com.android.systemui.statusbar.StatusBarState;
 import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
-import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
 import com.android.systemui.statusbar.policy.DeviceProvisionedController;
 import com.android.systemui.statusbar.policy.KeyguardStateController;
 import com.android.systemui.statusbar.window.StatusBarWindowControllerStore;
@@ -61,7 +61,6 @@
     private final KeyguardStateController mKeyguardStateController;
     private final NotificationShadeWindowController mNotificationShadeWindowController;
     private final StatusBarStateController mStatusBarStateController;
-    private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
     private final StatusBarWindowControllerStore mStatusBarWindowControllerStore;
     private final DeviceProvisionedController mDeviceProvisionedController;
 
@@ -82,7 +81,7 @@
             WindowRootViewVisibilityInteractor windowRootViewVisibilityInteractor,
             KeyguardStateController keyguardStateController,
             StatusBarStateController statusBarStateController,
-            StatusBarKeyguardViewManager statusBarKeyguardViewManager,
+            KeyguardViewController keyguardViewController,
             StatusBarWindowControllerStore statusBarWindowControllerStore,
             DeviceProvisionedController deviceProvisionedController,
             NotificationShadeWindowController notificationShadeWindowController,
@@ -93,7 +92,7 @@
             Lazy<NotificationGutsManager> gutsManager
     ) {
         super(commandQueue,
-                statusBarKeyguardViewManager,
+                keyguardViewController,
                 notificationShadeWindowController,
                 assistManagerLazy);
         SceneContainerFlag.assertInLegacyMode();
@@ -107,7 +106,6 @@
         mGutsManager = gutsManager;
         mNotificationShadeWindowController = notificationShadeWindowController;
         mNotifShadeWindowViewController = notificationShadeWindowViewController;
-        mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
         mDisplayId = displayId;
         mKeyguardStateController = keyguardStateController;
         mAssistManagerLazy = assistManagerLazy;
@@ -396,7 +394,7 @@
 
     @Override
     public void collapseShadeForActivityStart() {
-        if (isExpandedVisible() && !mStatusBarKeyguardViewManager.isBouncerShowing()) {
+        if (isExpandedVisible() && !getKeyguardViewController().isBouncerShowing()) {
             animateCollapseShadeForcedDelayed();
         } else {
             // Do it after DismissAction has been processed to conserve the
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAwareModule.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAwareModule.kt
index f926d39..96b224f 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAwareModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAwareModule.kt
@@ -42,12 +42,12 @@
 import com.android.systemui.shade.domain.interactor.ShadeDialogContextInteractor
 import com.android.systemui.shade.domain.interactor.ShadeDialogContextInteractorImpl
 import com.android.systemui.shade.domain.interactor.ShadeDisplaysInteractor
-import com.android.systemui.shade.domain.interactor.ShadeExpandedStateInteractor
 import com.android.systemui.shade.shared.flag.ShadeWindowGoesAround
+import com.android.systemui.statusbar.notification.stack.NotificationStackRebindingHider
+import com.android.systemui.statusbar.notification.stack.NotificationStackRebindingHiderImpl
 import com.android.systemui.statusbar.phone.ConfigurationControllerImpl
 import com.android.systemui.statusbar.phone.ConfigurationForwarder
 import com.android.systemui.statusbar.policy.ConfigurationController
-import dagger.BindsOptionalOf
 import dagger.Module
 import dagger.Provides
 import dagger.multibindings.ClassKey
@@ -67,7 +67,7 @@
  * By using this dedicated module, we ensure the notification shade window always utilizes the
  * correct display context and resources, regardless of the display it's on.
  */
-@Module(includes = [OptionalShadeDisplayAwareBindings::class, ShadeDisplayPolicyModule::class])
+@Module(includes = [ShadeDisplayPolicyModule::class])
 object ShadeDisplayAwareModule {
 
     /** Creates a new context for the shade window. */
@@ -242,17 +242,6 @@
         }
     }
 
-    @Provides
-    @IntoMap
-    @ClassKey(ShadeDisplaysInteractor::class)
-    fun provideShadeDisplaysInteractor(impl: Provider<ShadeDisplaysInteractor>): CoreStartable {
-        return if (ShadeWindowGoesAround.isEnabled) {
-            impl.get()
-        } else {
-            CoreStartable.NOP
-        }
-    }
-
     /**
      * Provided for making classes easier to test. In tests, a custom method to wait for the next
      * frame can be easily provided.
@@ -264,11 +253,25 @@
     fun provideShadeOnDefaultDisplayWhenLocked(): Boolean = true
 }
 
+/** Module that should be included only if the shade window [WindowRootView] is available. */
 @Module
-internal interface OptionalShadeDisplayAwareBindings {
-    @BindsOptionalOf fun bindOptionalOfWindowRootView(): WindowRootView
+object ShadeDisplayAwareWithShadeWindowModule {
+    @Provides
+    @IntoMap
+    @ClassKey(ShadeDisplaysInteractor::class)
+    fun provideShadeDisplaysInteractor(impl: Provider<ShadeDisplaysInteractor>): CoreStartable {
+        return if (ShadeWindowGoesAround.isEnabled) {
+            impl.get()
+        } else {
+            CoreStartable.NOP
+        }
+    }
 
-    @BindsOptionalOf fun bindOptionalOShadeExpandedStateInteractor(): ShadeExpandedStateInteractor
+    @Provides
+    @SysUISingleton
+    fun bindNotificationStackRebindingHider(
+        impl: NotificationStackRebindingHiderImpl
+    ): NotificationStackRebindingHider = impl
 }
 
 /**
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayChangeLatencyTracker.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayChangeLatencyTracker.kt
index 13b540a..5fda998 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayChangeLatencyTracker.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayChangeLatencyTracker.kt
@@ -24,8 +24,6 @@
 import com.android.systemui.dagger.qualifiers.Background
 import com.android.systemui.scene.ui.view.WindowRootView
 import com.android.systemui.shade.data.repository.ShadeDisplaysRepository
-import com.android.systemui.util.kotlin.getOrNull
-import java.util.Optional
 import java.util.concurrent.CancellationException
 import javax.inject.Inject
 import kotlin.time.Duration.Companion.seconds
@@ -51,22 +49,13 @@
 class ShadeDisplayChangeLatencyTracker
 @Inject
 constructor(
-    optionalShadeRootView: Optional<WindowRootView>,
+    private val shadeRootView: WindowRootView,
     @ShadeDisplayAware private val configurationRepository: ConfigurationRepository,
     private val latencyTracker: LatencyTracker,
     @Background private val bgScope: CoroutineScope,
     private val choreographerUtils: ChoreographerUtils,
 ) {
 
-    private val shadeRootView =
-        optionalShadeRootView.getOrNull()
-            ?: error(
-                """
-            ShadeRootView must be provided for ShadeDisplayChangeLatencyTracker to work.
-            If it is not, it means this is being instantiated in a SystemUI variant that shouldn't.
-            """
-                    .trimIndent()
-            )
     /**
      * We need to keep this always up to date eagerly to avoid delays receiving the new display ID.
      */
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt
index 9a79e1a..ce48c85 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt
@@ -31,16 +31,26 @@
 import android.provider.AlarmClock
 import android.view.DisplayCutout
 import android.view.View
+import android.view.ViewGroup
 import android.view.WindowInsets
 import android.widget.TextView
 import androidx.annotation.VisibleForTesting
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.wrapContentWidth
+import androidx.compose.runtime.getValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.ComposeView
+import androidx.compose.ui.unit.dp
 import androidx.constraintlayout.motion.widget.MotionLayout
 import androidx.core.view.doOnLayout
+import androidx.core.view.isVisible
+import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import com.android.app.animation.Interpolators
 import com.android.settingslib.Utils
 import com.android.systemui.Dumpable
 import com.android.systemui.animation.ShadeInterpolation
 import com.android.systemui.battery.BatteryMeterView
+import com.android.systemui.battery.BatteryMeterView.MODE_ESTIMATE
 import com.android.systemui.battery.BatteryMeterViewController
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.demomode.DemoMode
@@ -60,12 +70,15 @@
 import com.android.systemui.shade.carrier.ShadeCarrierGroupController
 import com.android.systemui.shade.data.repository.ShadeDisplaysRepository
 import com.android.systemui.shade.shared.flag.ShadeWindowGoesAround
+import com.android.systemui.statusbar.core.NewStatusBarIcons
 import com.android.systemui.statusbar.data.repository.StatusBarContentInsetsProviderStore
 import com.android.systemui.statusbar.phone.StatusBarLocation
 import com.android.systemui.statusbar.phone.StatusIconContainer
 import com.android.systemui.statusbar.phone.StatusOverlayHoverListenerFactory
 import com.android.systemui.statusbar.phone.ui.StatusBarIconController
 import com.android.systemui.statusbar.phone.ui.TintedIconManager
+import com.android.systemui.statusbar.pipeline.battery.ui.composable.BatteryWithEstimate
+import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.BatteryViewModel
 import com.android.systemui.statusbar.policy.Clock
 import com.android.systemui.statusbar.policy.ConfigurationController
 import com.android.systemui.statusbar.policy.NextAlarmController
@@ -76,6 +89,7 @@
 import java.io.PrintWriter
 import javax.inject.Inject
 import javax.inject.Named
+import kotlinx.coroutines.flow.MutableStateFlow
 
 /**
  * Controller for QS header.
@@ -100,6 +114,7 @@
     private val shadeDisplaysRepositoryLazy: Lazy<ShadeDisplaysRepository>,
     private val variableDateViewControllerFactory: VariableDateViewController.Factory,
     @Named(SHADE_HEADER) private val batteryMeterViewController: BatteryMeterViewController,
+    private val batteryViewModelFactory: BatteryViewModel.Factory,
     private val dumpManager: DumpManager,
     private val shadeCarrierGroupControllerBuilder: ShadeCarrierGroupController.Builder,
     private val combinedShadeHeadersConstraintManager: CombinedShadeHeadersConstraintManager,
@@ -162,6 +177,8 @@
     private var lastInsets: WindowInsets? = null
     private var nextAlarmIntent: PendingIntent? = null
 
+    private val showBatteryEstimate = MutableStateFlow(false)
+
     private var qsDisabled = false
     private var visible = false
         set(value) {
@@ -323,10 +340,6 @@
 
     override fun onInit() {
         variableDateViewControllerFactory.create(date as VariableDateView).init()
-        batteryMeterViewController.init()
-
-        // battery settings same as in QS icons
-        batteryMeterViewController.ignoreTunerUpdates()
 
         val fgColor =
             Utils.getColorAttrDefaultColor(header.context, android.R.attr.textColorPrimary)
@@ -336,11 +349,36 @@
         iconManager = tintedIconManagerFactory.create(iconContainer, StatusBarLocation.QS)
         iconManager.setTint(fgColor, bgColor)
 
-        batteryIcon.updateColors(
-            fgColor /* foreground */,
-            bgColor /* background */,
-            fgColor, /* single tone (current default) */
-        )
+        if (!NewStatusBarIcons.isEnabled) {
+            batteryMeterViewController.init()
+
+            // battery settings same as in QS icons
+            batteryMeterViewController.ignoreTunerUpdates()
+
+            batteryIcon.isVisible = true
+            batteryIcon.updateColors(
+                fgColor /* foreground */,
+                bgColor /* background */,
+                fgColor, /* single tone (current default) */
+            )
+        } else {
+            // Configure the compose battery view
+            val batteryComposeView =
+                ComposeView(mView.context).apply {
+                    setContent {
+                        val showBatteryEstimate by showBatteryEstimate.collectAsStateWithLifecycle()
+                        BatteryWithEstimate(
+                            modifier = Modifier.height(17.dp).wrapContentWidth(),
+                            viewModelFactory = batteryViewModelFactory,
+                            isDark = { true },
+                            showEstimate = showBatteryEstimate,
+                        )
+                    }
+                }
+            mView.requireViewById<ViewGroup>(R.id.hover_system_icons_container).apply {
+                addView(batteryComposeView, -1)
+            }
+        }
 
         carrierIconSlots =
             listOf(header.context.getString(com.android.internal.R.string.status_bar_mobile))
@@ -474,7 +512,11 @@
 
     private fun updateBatteryMode() {
         qsBatteryModeController.getBatteryMode(cutout, qsExpandedFraction)?.let {
-            batteryIcon.setPercentShowMode(it)
+            if (NewStatusBarIcons.isEnabled) {
+                showBatteryEstimate.value = it == MODE_ESTIMATE
+            } else {
+                batteryIcon.setPercentShowMode(it)
+            }
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt
index b9df9f86..c44e066 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt
@@ -45,13 +45,22 @@
 import com.android.systemui.shade.domain.interactor.ShadeLockscreenInteractorImpl
 import com.android.systemui.shade.domain.interactor.ShadeModeInteractor
 import com.android.systemui.shade.domain.interactor.ShadeModeInteractorImpl
+import com.android.systemui.window.dagger.WindowRootViewBlurModule
 import dagger.Binds
 import dagger.Module
 import dagger.Provides
 import javax.inject.Provider
 
 /** Module for classes related to the notification shade. */
-@Module(includes = [StartShadeModule::class, ShadeViewProviderModule::class])
+@Module(
+    includes =
+        [
+            StartShadeModule::class,
+            ShadeViewProviderModule::class,
+            WindowRootViewBlurModule::class,
+            ShadeDisplayAwareWithShadeWindowModule::class,
+        ]
+)
 abstract class ShadeModule {
     companion object {
         @Provides
diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractor.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractor.kt
index e746274..9a5c968 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractor.kt
@@ -39,9 +39,7 @@
 import com.android.systemui.statusbar.notification.row.NotificationRebindingTracker
 import com.android.systemui.statusbar.notification.stack.NotificationStackRebindingHider
 import com.android.systemui.statusbar.phone.ConfigurationForwarder
-import com.android.systemui.util.kotlin.getOrNull
 import com.android.window.flags.Flags
-import java.util.Optional
 import javax.inject.Inject
 import kotlin.coroutines.CoroutineContext
 import kotlin.time.Duration.Companion.seconds
@@ -63,17 +61,14 @@
     @Background private val bgScope: CoroutineScope,
     @Main private val mainThreadContext: CoroutineContext,
     private val shadeDisplayChangeLatencyTracker: ShadeDisplayChangeLatencyTracker,
-    shadeExpandedInteractor: Optional<ShadeExpandedStateInteractor>,
+    private val shadeExpandedInteractor: ShadeExpandedStateInteractor,
     private val shadeExpansionIntent: ShadeExpansionIntent,
     private val activeNotificationsInteractor: ActiveNotificationsInteractor,
     private val notificationRebindingTracker: NotificationRebindingTracker,
-    notificationStackRebindingHider: Optional<NotificationStackRebindingHider>,
+    private val notificationStackRebindingHider: NotificationStackRebindingHider,
     @ShadeDisplayAware private val configForwarder: ConfigurationForwarder,
 ) : CoreStartable {
 
-    private val shadeExpandedInteractor = requireOptional(shadeExpandedInteractor)
-    private val notificationStackRebindingHider = requireOptional(notificationStackRebindingHider)
-
     private val hasActiveNotifications: Boolean
         get() = activeNotificationsInteractor.areAnyNotificationsPresentValue
 
@@ -224,24 +219,5 @@
         const val TAG = "ShadeDisplaysInteractor"
         const val COLLAPSE_EXPAND_REASON = "Shade window move"
         val TIMEOUT = 1.seconds
-
-        /**
-         * [ShadeDisplaysInteractor] is bound in the SystemUI module for all variants, but needs
-         * some specific dependencies to be bound from each variant (e.g.
-         * [ShadeExpandedStateInteractor] or [NotificationStackRebindingHider]). When those are not
-         * bound, this class is not expected to be instantiated, and trying to instantiate it would
-         * crash.
-         */
-        inline fun <reified T> requireOptional(optional: Optional<T>): T {
-            return optional.getOrNull()
-                ?: error(
-                    """
-                ${T::class.java.simpleName} must be provided for ShadeDisplaysInteractor to work.
-                If it is not, it means this is being instantiated in a SystemUI variant that
-                shouldn't.
-                """
-                        .trimIndent()
-                )
-        }
     }
 }
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 9d81be2..e8b5d5b 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
@@ -16,7 +16,6 @@
 
 package com.android.systemui.shade.domain.interactor
 
-import android.util.Log
 import com.android.app.tracing.coroutines.flow.flowName
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Application
@@ -39,7 +38,6 @@
 import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.distinctUntilChanged
 import kotlinx.coroutines.flow.map
-import kotlinx.coroutines.flow.onEach
 import kotlinx.coroutines.flow.stateIn
 
 /** The non-empty [ShadeInteractor] implementation. */
@@ -100,31 +98,17 @@
 
     override val isShadeTouchable: Flow<Boolean> =
         combine(
-            powerInteractor.isAsleep.onEach {
-                Log.d(TAG, "isShadeTouchable: upstream isAsleep=$it")
-            },
-            keyguardTransitionInteractor
-                .isInTransition(Edge.create(to = KeyguardState.AOD))
-                .onEach { Log.d(TAG, "isShadeTouchable: upstream isTransitioningToAod=$it") },
-            keyguardRepository.dozeTransitionModel
-                .map { it.to == DozeStateModel.DOZE_PULSING }
-                .onEach { Log.d(TAG, "isShadeTouchable: upstream isPulsing=$it") },
+            powerInteractor.isAsleep,
+            keyguardTransitionInteractor.isInTransition(Edge.create(to = KeyguardState.AOD)),
+            keyguardRepository.dozeTransitionModel.map { it.to == DozeStateModel.DOZE_PULSING },
         ) { isAsleep, isTransitioningToAod, isPulsing ->
-            val downstream =
-                when {
-                    // If the device is transitioning to AOD, only accept touches if
-                    // still animating.
-                    isTransitioningToAod -> dozeParams.shouldControlScreenOff()
-                    // If the device is asleep, only accept touches if there's a pulse
-                    isAsleep -> isPulsing
-                    else -> true
-                }
-            Log.d(TAG, "isShadeTouchable emitting $downstream, values:")
-            Log.d(TAG, "  isAsleep=$isAsleep")
-            Log.d(TAG, "  isTransitioningToAod=$isTransitioningToAod")
-            Log.d(TAG, "  isPulsing=$isPulsing")
-            Log.d(TAG, "")
-            downstream
+            when {
+                // If the device is transitioning to AOD, only accept touches if still animating.
+                isTransitioningToAod -> dozeParams.shouldControlScreenOff()
+                // If the device is asleep, only accept touches if there's a pulse
+                isAsleep -> isPulsing
+                else -> true
+            }
         }
 
     override val isExpandToQsEnabled: Flow<Boolean> =
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ui/ShadeColors.kt b/packages/SystemUI/src/com/android/systemui/shade/ui/ShadeColors.kt
index 8db6225..6242847 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ui/ShadeColors.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ui/ShadeColors.kt
@@ -23,18 +23,48 @@
 
 object ShadeColors {
     @JvmStatic
-    fun Resources.shadePanel(): Int {
-        val layerAbove =
-            ColorUtils.setAlphaComponent(getColor(R.color.shade_panel_base), (0.4f * 255).toInt())
+    fun Resources.shadePanel(blurSupported: Boolean): Int {
+        return if (blurSupported) {
+            shadePanelStandard()
+        } else {
+            shadePanelFallback()
+        }
+    }
+
+    @JvmStatic
+    fun Resources.notificationScrim(blurSupported: Boolean): Int {
+        return if (blurSupported) {
+            notificationScrimStandard()
+        } else {
+            notificationScrimFallback()
+        }
+    }
+
+    @JvmStatic
+    private fun Resources.shadePanelStandard(): Int {
+        val layerAbove = ColorUtils.setAlphaComponent(
+            getColor(R.color.shade_panel_base, null),
+            (0.4f * 255).toInt()
+        )
         val layerBelow = ColorUtils.setAlphaComponent(Color.WHITE, (0.1f * 255).toInt())
         return ColorUtils.compositeColors(layerAbove, layerBelow)
     }
 
     @JvmStatic
-    fun Resources.notificationScrim(): Int {
+    private fun Resources.shadePanelFallback(): Int {
+        return getColor(R.color.shade_panel_fallback, null)
+    }
+
+    @JvmStatic
+    private fun Resources.notificationScrimStandard(): Int {
         return ColorUtils.setAlphaComponent(
-            getColor(R.color.notification_scrim_base),
+            getColor(R.color.notification_scrim_base, null),
             (0.5f * 255).toInt(),
         )
     }
+
+    @JvmStatic
+    private fun Resources.notificationScrimFallback(): Int {
+        return getColor(R.color.notification_scrim_fallback, null)
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BatteryStatusChip.kt b/packages/SystemUI/src/com/android/systemui/statusbar/BatteryStatusChip.kt
index a58ce41..02cec13 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/BatteryStatusChip.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/BatteryStatusChip.kt
@@ -26,6 +26,7 @@
 import com.android.systemui.battery.BatteryMeterView
 import com.android.systemui.battery.unified.BatteryColors
 import com.android.systemui.res.R
+import com.android.systemui.statusbar.core.NewStatusBarIcons
 import com.android.systemui.statusbar.events.BackgroundAnimatableView
 
 class BatteryStatusChip @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
@@ -37,6 +38,8 @@
         get() = batteryMeterView
 
     init {
+        NewStatusBarIcons.assertInLegacyMode()
+
         inflate(context, R.layout.battery_status_chip, this)
         roundedContainer = requireViewById(R.id.rounded_container)
         batteryMeterView = requireViewById(R.id.battery_meter_view)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java
index 25ebc8c..f06565f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java
@@ -24,8 +24,10 @@
 import static android.os.Flags.allowPrivateProfile;
 import static android.os.UserHandle.USER_ALL;
 import static android.os.UserHandle.USER_NULL;
+import static android.provider.Settings.Secure.REDACT_OTP_NOTIFICATION_IMMEDIATELY;
 import static android.provider.Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS;
 import static android.provider.Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS;
+import static android.provider.Settings.Secure.REDACT_OTP_NOTIFICATION_WHILE_CONNECTED_TO_WIFI;
 
 import static com.android.systemui.DejankUtils.whitelistIpcs;
 
@@ -44,6 +46,7 @@
 import android.database.ExecutorContentObserver;
 import android.net.Uri;
 import android.os.Looper;
+import android.os.Process;
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.provider.Settings;
@@ -118,6 +121,11 @@
             Settings.Secure.getUriFor(LOCK_SCREEN_SHOW_NOTIFICATIONS);
     private static final Uri SHOW_PRIVATE_LOCKSCREEN =
             Settings.Secure.getUriFor(LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS);
+    private static final Uri REDACT_OTP_ON_WIFI =
+            Settings.Secure.getUriFor(REDACT_OTP_NOTIFICATION_WHILE_CONNECTED_TO_WIFI);
+
+    private static final Uri REDACT_OTP_IMMEDIATELY =
+            Settings.Secure.getUriFor(REDACT_OTP_NOTIFICATION_IMMEDIATELY);
 
     private static final long LOCK_TIME_FOR_SENSITIVE_REDACTION_MS =
             TimeUnit.MINUTES.toMillis(10);
@@ -307,6 +315,9 @@
     @VisibleForTesting
     protected final AtomicBoolean mConnectedToWifi = new AtomicBoolean(false);
 
+    protected final AtomicBoolean mRedactOtpOnWifi = new AtomicBoolean(true);
+    protected final AtomicBoolean mRedactOtpImmediately = new AtomicBoolean(false);
+
     protected int mCurrentUserId = 0;
 
     protected NotificationPresenter mPresenter;
@@ -363,6 +374,8 @@
 
         mLockScreenUris.add(SHOW_LOCKSCREEN);
         mLockScreenUris.add(SHOW_PRIVATE_LOCKSCREEN);
+        mLockScreenUris.add(REDACT_OTP_ON_WIFI);
+        mLockScreenUris.add(REDACT_OTP_IMMEDIATELY);
 
         dumpManager.registerDumpable(this);
 
@@ -432,6 +445,10 @@
                         changed |= updateUserShowSettings(user.getIdentifier());
                     } else if (SHOW_PRIVATE_LOCKSCREEN.equals(uri)) {
                         changed |= updateUserShowPrivateSettings(user.getIdentifier());
+                    } else if (REDACT_OTP_ON_WIFI.equals(uri)) {
+                        changed |= updateRedactOtpOnWifiSetting();
+                    } else if (REDACT_OTP_IMMEDIATELY.equals(uri)) {
+                        changed |= updateRedactOtpImmediatelySetting();
                     }
                 }
 
@@ -465,6 +482,14 @@
                 true,
                 mLockscreenSettingsObserver,
                 USER_ALL);
+        mSecureSettings.registerContentObserverAsync(
+                REDACT_OTP_ON_WIFI,
+                mLockscreenSettingsObserver
+        );
+        mSecureSettings.registerContentObserverAsync(
+                REDACT_OTP_IMMEDIATELY,
+                mLockscreenSettingsObserver
+        );
 
 
         mBroadcastDispatcher.registerReceiver(mAllUsersReceiver,
@@ -602,6 +627,28 @@
     }
 
     @WorkerThread
+    private boolean updateRedactOtpOnWifiSetting() {
+        boolean originalValue = mRedactOtpOnWifi.get();
+        boolean newValue = mSecureSettings.getIntForUser(
+                REDACT_OTP_NOTIFICATION_WHILE_CONNECTED_TO_WIFI,
+                0,
+                Process.myUserHandle().getIdentifier()) != 0;
+        mRedactOtpOnWifi.set(newValue);
+        return originalValue != newValue;
+    }
+
+    @WorkerThread
+    private boolean updateRedactOtpImmediatelySetting() {
+        boolean originalValue = mRedactOtpImmediately.get();
+        boolean newValue = mSecureSettings.getIntForUser(
+                REDACT_OTP_NOTIFICATION_IMMEDIATELY,
+                0,
+                Process.myUserHandle().getIdentifier()) != 0;
+        mRedactOtpImmediately.set(newValue);
+        return originalValue != newValue;
+    }
+
+    @WorkerThread
     private boolean updateGlobalKeyguardSettings() {
         final boolean oldValue = mKeyguardAllowingNotifications;
         mKeyguardAllowingNotifications = mKeyguardManager.getPrivateNotificationsAllowed();
@@ -769,23 +816,31 @@
             return false;
         }
 
-        if (mConnectedToWifi.get()) {
-            return false;
+        if (!mRedactOtpOnWifi.get()) {
+            if (mConnectedToWifi.get()) {
+                return false;
+            }
+
+            long lastWifiConnectTime = mLastWifiConnectionTime.get();
+            // If the device has connected to wifi since receiving the notification, do not redact
+            if (ent.getSbn().getPostTime() < lastWifiConnectTime) {
+                return false;
+            }
         }
 
         if (ent.getRanking() == null || !ent.getRanking().hasSensitiveContent()) {
             return false;
         }
 
-        long lastWifiConnectTime = mLastWifiConnectionTime.get();
-        // If the device has connected to wifi since receiving the notification, do not redact
-        if (ent.getSbn().getPostTime() < lastWifiConnectTime) {
-            return false;
+        long latestTimeForRedaction;
+        if (mRedactOtpImmediately.get()) {
+            latestTimeForRedaction = mLastLockTime.get();
+        } else {
+            // If the lock screen was not already locked for LOCK_TIME_FOR_SENSITIVE_REDACTION_MS
+            // when this notification arrived, do not redact
+            latestTimeForRedaction = mLastLockTime.get() + LOCK_TIME_FOR_SENSITIVE_REDACTION_MS;
         }
 
-        // If the lock screen was not already locked for LOCK_TIME_FOR_SENSITIVE_REDACTION_MS when
-        // this notification arrived, do not redact
-        long latestTimeForRedaction = mLastLockTime.get() + LOCK_TIME_FOR_SENSITIVE_REDACTION_MS;
         if (ent.getSbn().getPostTime() < latestTimeForRedaction) {
             return false;
         }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt
index 3e76107..6aa2fe2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt
@@ -38,7 +38,6 @@
 import com.android.systemui.Flags.spatialModelAppPushback
 import com.android.systemui.animation.ShadeInterpolation
 import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.dagger.qualifiers.Application
 import com.android.systemui.dump.DumpManager
 import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
 import com.android.systemui.plugins.statusbar.StatusBarStateController
@@ -61,8 +60,6 @@
 import javax.inject.Inject
 import kotlin.math.max
 import kotlin.math.sign
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.launch
 
 /**
  * Responsible for blurring the notification shade window, and applying a zoom effect to the
@@ -84,7 +81,6 @@
     @ShadeDisplayAware private val context: Context,
     private val splitShadeStateController: SplitShadeStateController,
     private val windowRootViewBlurInteractor: WindowRootViewBlurInteractor,
-    @Application private val applicationScope: CoroutineScope,
     private val appZoomOutOptional: Optional<AppZoomOut>,
     dumpManager: DumpManager,
     configurationController: ConfigurationController,
@@ -394,18 +390,15 @@
     private fun initBlurListeners() {
         if (!Flags.bouncerUiRevamp()) return
 
-        applicationScope.launch {
-            Log.d(TAG, "Starting coroutines for window root view blur")
-            windowRootViewBlurInteractor.onBlurAppliedEvent.collect { appliedBlurRadius ->
-                if (updateScheduled) {
-                    // Process the blur applied event only if we scheduled the update
-                    TrackTracer.instantForGroup("shade", "shade_blur_radius", appliedBlurRadius)
-                    updateScheduled = false
-                    onBlurApplied(appliedBlurRadius, zoomOutCalculatedFromShadeRadius)
-                } else {
-                    // Try scheduling an update now, maybe our blur request will be scheduled now.
-                    scheduleUpdate()
-                }
+        windowRootViewBlurInteractor.registerBlurAppliedListener { appliedBlurRadius ->
+            if (updateScheduled) {
+                // Process the blur applied event only if we scheduled the update
+                TrackTracer.instantForGroup("shade", "shade_blur_radius", appliedBlurRadius)
+                updateScheduled = false
+                onBlurApplied(appliedBlurRadius, zoomOutCalculatedFromShadeRadius)
+            } else {
+                // Try scheduling an update now, maybe our blur request will be scheduled now.
+                scheduleUpdate()
             }
         }
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/call/ui/viewmodel/CallChipViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/call/ui/viewmodel/CallChipViewModel.kt
index a2c0226..f466278 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/chips/call/ui/viewmodel/CallChipViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/call/ui/viewmodel/CallChipViewModel.kt
@@ -32,9 +32,7 @@
 import com.android.systemui.statusbar.chips.StatusBarChipLogTags.pad
 import com.android.systemui.statusbar.chips.StatusBarChipsLog
 import com.android.systemui.statusbar.chips.call.domain.interactor.CallChipInteractor
-import com.android.systemui.statusbar.chips.notification.shared.StatusBarNotifChips
 import com.android.systemui.statusbar.chips.ui.model.ColorsModel
-import com.android.systemui.statusbar.chips.ui.model.ColorsModel.Companion.toCustomColorsModel
 import com.android.systemui.statusbar.chips.ui.model.OngoingActivityChipModel
 import com.android.systemui.statusbar.chips.ui.view.ChipBackgroundContainer
 import com.android.systemui.statusbar.chips.ui.viewmodel.OngoingActivityChipViewModel
@@ -86,12 +84,7 @@
                                 OngoingActivityChipModel.ChipIcon.SingleColorIcon(phoneIcon)
                             }
 
-                        val colors =
-                            if (StatusBarNotifChips.isEnabled && state.promotedContent != null) {
-                                state.promotedContent.toCustomColorsModel()
-                            } else {
-                                ColorsModel.Themed
-                            }
+                        val colors = ColorsModel.AccentThemed
 
                         // This block mimics OngoingCallController#updateChip.
                         if (state.startTimeMs <= 0L) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/domain/interactor/SingleNotificationChipInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/domain/interactor/SingleNotificationChipInteractor.kt
index a933888..d8c3e25 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/domain/interactor/SingleNotificationChipInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/domain/interactor/SingleNotificationChipInteractor.kt
@@ -16,6 +16,7 @@
 
 package com.android.systemui.statusbar.chips.notification.domain.interactor
 
+import com.android.systemui.activity.data.model.AppVisibilityModel
 import com.android.systemui.activity.data.repository.ActivityManagerRepository
 import com.android.systemui.log.LogBuffer
 import com.android.systemui.log.core.Logger
@@ -30,8 +31,6 @@
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.combine
-import kotlinx.coroutines.flow.flatMapLatest
-import kotlinx.coroutines.flow.map
 
 /**
  * Interactor representing a single notification's status bar chip.
@@ -53,6 +52,7 @@
     @StatusBarChipsLog private val logBuffer: LogBuffer,
 ) {
     private val key = startingModel.key
+    private val uid = startingModel.uid
     private val logger = Logger(logBuffer, "Notif".pad())
     // [StatusBarChipLogTag] recommends a max tag length of 20, so [extraLogTag] should NOT be the
     // top-level tag. It should instead be provided as the first string in each log message.
@@ -88,34 +88,37 @@
             }
             return
         }
+
+        if (model.uid != uid) {
+            logger.e({
+                "$str1: received model with different uid, which shouldn't happen. " +
+                    "Original UID: $int1, New UID: $int2. " +
+                    "Proceeding as usual, but app visibility changes will be for *old* UID."
+            }) {
+                str1 = extraLogTag
+                int1 = uid
+                int2 = model.uid
+            }
+        }
         _notificationModel.value = model
     }
 
-    private val uid: Flow<Int> = _notificationModel.map { it.uid }
-
-    /** True if the application managing the notification is visible to the user. */
-    private val isAppVisible: Flow<Boolean> =
-        uid.flatMapLatest { currentUid ->
-            activityManagerRepository.createIsAppVisibleFlow(currentUid, logger, extraLogTag)
-        }
+    /** Details about when the app managing the notification was & is visible to the user. */
+    private val appVisibility: Flow<AppVisibilityModel> =
+        activityManagerRepository.createAppVisibilityFlow(uid, logger, extraLogTag)
 
     /**
      * Emits this notification's status bar chip, or null if this notification shouldn't show a
      * status bar chip.
      */
     val notificationChip: Flow<NotificationChipModel?> =
-        combine(_notificationModel, isAppVisible) { notif, isAppVisible ->
-            if (isAppVisible) {
-                // If the app that posted this notification is visible, we want to hide the chip
-                // because information between the status bar chip and the app itself could be
-                // out-of-sync (like a timer that's slightly off)
-                null
-            } else {
-                notif.toNotificationChipModel()
-            }
+        combine(_notificationModel, appVisibility) { notif, appVisibility ->
+            notif.toNotificationChipModel(appVisibility)
         }
 
-    private fun ActiveNotificationModel.toNotificationChipModel(): NotificationChipModel? {
+    private fun ActiveNotificationModel.toNotificationChipModel(
+        appVisibility: AppVisibilityModel
+    ): NotificationChipModel? {
         val promotedContent = this.promotedContent
         if (promotedContent == null) {
             logger.w({
@@ -138,7 +141,15 @@
             }
         }
 
-        return NotificationChipModel(key, appName, statusBarChipIconView, promotedContent)
+        return NotificationChipModel(
+            key = key,
+            appName = appName,
+            statusBarChipIconView = statusBarChipIconView,
+            promotedContent = promotedContent,
+            creationTime = creationTime,
+            isAppVisible = appVisibility.isAppCurrentlyVisible,
+            lastAppVisibleTime = appVisibility.lastAppVisibleTime,
+        )
     }
 
     @AssistedFactory
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/domain/interactor/StatusBarNotificationChipsInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/domain/interactor/StatusBarNotificationChipsInteractor.kt
index 9463db5..d20a2d1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/domain/interactor/StatusBarNotificationChipsInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/domain/interactor/StatusBarNotificationChipsInteractor.kt
@@ -32,6 +32,7 @@
 import com.android.systemui.util.kotlin.pairwise
 import com.android.systemui.util.time.SystemClock
 import javax.inject.Inject
+import kotlin.math.max
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.MutableSharedFlow
@@ -39,9 +40,11 @@
 import kotlinx.coroutines.flow.SharedFlow
 import kotlinx.coroutines.flow.asSharedFlow
 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
 
 /** An interactor for the notification chips shown in the status bar. */
 @SysUISingleton
@@ -132,9 +135,6 @@
                         }
                     interactor.setNotification(notif)
                 }
-                logger.d({ "Interactors: $str1" }) {
-                    str1 = promotedNotificationInteractorMap.keys.joinToString(separator = " /// ")
-                }
                 promotedNotificationInteractors.value =
                     promotedNotificationInteractorMap.values.toList()
             }
@@ -142,29 +142,26 @@
     }
 
     /**
-     * A flow modeling the notifications that should be shown as chips in the status bar. Emits an
-     * empty list if there are no notifications that should show a status bar chip.
+     * Emits all notifications that are eligible to show as chips in the status bar. This is
+     * different from which chips will *actually* show, see [shownNotificationChips] for that.
      */
-    val notificationChips: Flow<List<NotificationChipModel>> =
+    private val allNotificationChips: Flow<List<NotificationChipModel>> =
         if (StatusBarNotifChips.isEnabled) {
             // For all our current interactors...
-            promotedNotificationInteractors.flatMapLatest { intrs ->
-                // Stable-sort the promoted notifications by when they first appeared so that:
-                // 1) The chips don't switch places if the older chip gets a notification update.
-                // 2) The chips don't switch places when the second chip is tapped. (Whichever
-                // notification is showing heads-up is considered to be the top notification, which
-                // means tapping the second chip would move it to be the first chip if we didn't
-                // sort by appearance time here.)
-                // 3) Older chips get hidden if there's not enough room for all chips.
-                val interactors = intrs.sortedByDescending { it.creationTime }
+            // TODO(b/364653005): When a promoted notification is added or removed, each individual
+            // interactor's [notificationChip] flow becomes un-collected then re-collected, which
+            // can cause some flows to remove then add callbacks when they don't need to. Is there a
+            // better structure for this? Maybe Channels or a StateFlow with a short timeout?
+            promotedNotificationInteractors.flatMapLatest { interactors ->
                 if (interactors.isNotEmpty()) {
                     // Combine each interactor's [notificationChip] flow...
                     val allNotificationChips: List<Flow<NotificationChipModel?>> =
                         interactors.map { interactor -> interactor.notificationChip }
                     combine(allNotificationChips) {
-                        // ... and emit just the non-null chips
-                        it.filterNotNull()
-                    }
+                            // ... and emit just the non-null & sorted chips
+                            it.filterNotNull().sortedWith(chipComparator)
+                        }
+                        .logSort()
                 } else {
                     flowOf(emptyList())
                 }
@@ -172,4 +169,44 @@
         } else {
             flowOf(emptyList())
         }
+
+    /** Emits the notifications that should actually be *shown* as chips in the status bar. */
+    val shownNotificationChips: Flow<List<NotificationChipModel>> =
+        allNotificationChips.map { chipsList ->
+            // If the app that posted this notification is visible, we want to hide the chip
+            // because information between the status bar chip and the app itself could be
+            // out-of-sync (like a timer that's slightly off)
+            chipsList.filter { !it.isAppVisible }
+        }
+
+    /*
+    Stable sort the promoted notifications by two criteria:
+    Criteria #1: Whichever app was most recently visible has higher ranking.
+    - Reasoning: If a user opened the app to see additional information, that's
+    likely the most important ongoing notification.
+    Criteria #2: Whichever notification first appeared more recently has higher ranking.
+    - Reasoning: Older chips get hidden if there's not enough room for all chips.
+    This semi-stable ordering ensures:
+    1) The chips don't switch places if the older chip gets a notification update.
+    2) The chips don't switch places when the second chip is tapped. (Whichever
+    notification is showing heads-up is considered to be the top notification, which
+    means tapping the second chip would move it to be the first chip if we didn't
+    sort by appearance time here.)
+    */
+    private val chipComparator =
+        compareByDescending<NotificationChipModel> {
+            max(it.creationTime, it.lastAppVisibleTime ?: Long.MIN_VALUE)
+        }
+
+    private fun Flow<List<NotificationChipModel>>.logSort(): Flow<List<NotificationChipModel>> {
+        return this.distinctUntilChanged().onEach { chips ->
+            val logString =
+                chips.joinToString {
+                    "{key=${it.key}. " +
+                        "lastVisibleAppTime=${it.lastAppVisibleTime}. " +
+                        "creationTime=${it.creationTime}}"
+                }
+            logger.d({ "Sorted chips: $str1" }) { str1 = logString }
+        }
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/domain/model/NotificationChipModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/domain/model/NotificationChipModel.kt
index e7a9080..1f2079d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/domain/model/NotificationChipModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/domain/model/NotificationChipModel.kt
@@ -22,8 +22,17 @@
 /** Modeling all the data needed to render a status bar notification chip. */
 data class NotificationChipModel(
     val key: String,
-    /** The user-readable name of the app that posted the call notification. */
+    /** The user-readable name of the app that posted this notification. */
     val appName: String,
     val statusBarChipIconView: StatusBarIconView?,
     val promotedContent: PromotedNotificationContentModel,
+    /** The time when the notification first appeared as promoted. */
+    val creationTime: Long,
+    /** True if the app managing this notification is currently visible to the user. */
+    val isAppVisible: Boolean,
+    /**
+     * The time when the app managing this notification last appeared as visible, or null if the app
+     * hasn't become visible since the notification became promoted.
+     */
+    val lastAppVisibleTime: Long?,
 )
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModel.kt
index 8357df4..3ecbdf8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModel.kt
@@ -27,7 +27,7 @@
 import com.android.systemui.statusbar.chips.notification.domain.interactor.StatusBarNotificationChipsInteractor
 import com.android.systemui.statusbar.chips.notification.domain.model.NotificationChipModel
 import com.android.systemui.statusbar.chips.notification.shared.StatusBarNotifChips
-import com.android.systemui.statusbar.chips.ui.model.ColorsModel.Companion.toCustomColorsModel
+import com.android.systemui.statusbar.chips.ui.model.ColorsModel
 import com.android.systemui.statusbar.chips.ui.model.OngoingActivityChipModel
 import com.android.systemui.statusbar.core.StatusBarConnectedDisplays
 import com.android.systemui.statusbar.notification.domain.interactor.HeadsUpNotificationInteractor
@@ -58,7 +58,7 @@
      */
     val chips: Flow<List<OngoingActivityChipModel.Active>> =
         combine(
-                notifChipsInteractor.notificationChips,
+                notifChipsInteractor.shownNotificationChips,
                 headsUpNotificationInteractor.statusBarHeadsUpState,
             ) { notifications, headsUpState ->
                 notifications.map { it.toActivityChipModel(headsUpState) }
@@ -85,8 +85,7 @@
                     contentDescription,
                 )
             }
-        val colors = this.promotedContent.toCustomColorsModel()
-
+        val colors = ColorsModel.SystemThemed
         val clickListener: () -> Unit = {
             // The notification pipeline needs everything to run on the main thread, so keep
             // this event on the main thread.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/binder/OngoingActivityChipBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/binder/OngoingActivityChipBinder.kt
index 456cd12..d41353b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/binder/OngoingActivityChipBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/binder/OngoingActivityChipBinder.kt
@@ -17,6 +17,7 @@
 package com.android.systemui.statusbar.chips.ui.binder
 
 import android.annotation.IdRes
+import android.content.Context
 import android.content.res.ColorStateList
 import android.graphics.drawable.GradientDrawable
 import android.view.View
@@ -32,6 +33,7 @@
 import com.android.systemui.res.R
 import com.android.systemui.statusbar.StatusBarIconView
 import com.android.systemui.statusbar.chips.notification.shared.StatusBarNotifChips
+import com.android.systemui.statusbar.chips.ui.model.ColorsModel
 import com.android.systemui.statusbar.chips.ui.model.OngoingActivityChipModel
 import com.android.systemui.statusbar.chips.ui.view.ChipBackgroundContainer
 import com.android.systemui.statusbar.chips.ui.view.ChipChronometer
@@ -76,8 +78,10 @@
                 chipTimeView.setTextColor(textColor)
                 chipTextView.setTextColor(textColor)
                 chipShortTimeDeltaView.setTextColor(textColor)
-                (chipBackgroundView.background as GradientDrawable).color =
-                    chipModel.colors.background(chipContext)
+                (chipBackgroundView.background as GradientDrawable).setBackgroundColors(
+                    chipModel.colors,
+                    chipContext,
+                )
             }
             is OngoingActivityChipModel.Inactive -> {
                 // The Chronometer should be stopped to prevent leaks -- see b/192243808 and
@@ -460,5 +464,20 @@
         chipView.minimumWidth = minimumWidth
     }
 
+    private fun GradientDrawable.setBackgroundColors(colors: ColorsModel, context: Context) {
+        this.color = colors.background(context)
+        val outline = colors.outline(context)
+        if (outline != null) {
+            this.setStroke(
+                context.resources.getDimensionPixelSize(
+                    R.dimen.ongoing_activity_chip_outline_width
+                ),
+                outline,
+            )
+        } else {
+            this.setStroke(0, /* color= */ 0)
+        }
+    }
+
     @IdRes private val CUSTOM_ICON_VIEW_ID = R.id.ongoing_activity_chip_custom_icon
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/ChipContent.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/ChipContent.kt
index 32de0fb..5242fea 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/ChipContent.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/ChipContent.kt
@@ -19,17 +19,8 @@
 import androidx.compose.material3.MaterialTheme
 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.draw.drawWithCache
-import androidx.compose.ui.graphics.BlendMode
-import androidx.compose.ui.graphics.Brush
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.CompositingStrategy
-import androidx.compose.ui.graphics.graphicsLayer
 import androidx.compose.ui.layout.Measurable
 import androidx.compose.ui.layout.MeasureResult
 import androidx.compose.ui.layout.MeasureScope
@@ -37,6 +28,8 @@
 import androidx.compose.ui.node.ModifierNodeElement
 import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.res.dimensionResource
+import androidx.compose.ui.text.TextMeasurer
+import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.rememberTextMeasurer
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Dp
@@ -44,7 +37,9 @@
 import androidx.compose.ui.unit.dp
 import com.android.systemui.res.R
 import com.android.systemui.statusbar.chips.ui.model.OngoingActivityChipModel
+import com.android.systemui.statusbar.chips.ui.viewmodel.formatTimeRemainingData
 import com.android.systemui.statusbar.chips.ui.viewmodel.rememberChronometerState
+import com.android.systemui.statusbar.chips.ui.viewmodel.rememberTimeRemainingState
 import kotlin.math.min
 
 @Composable
@@ -83,15 +78,14 @@
                 softWrap = false,
                 modifier =
                     modifier
-                        .customTextContentLayout(
+                        .hideTextIfDoesNotFit(
+                            text = text,
+                            textStyle = textStyle,
+                            textMeasurer = textMeasurer,
                             maxTextWidth = maxTextWidth,
                             startPadding = startPadding,
                             endPadding = endPadding,
-                        ) { constraintWidth ->
-                            val intrinsicWidth =
-                                textMeasurer.measure(text, textStyle, softWrap = false).size.width
-                            intrinsicWidth <= constraintWidth
-                        }
+                        )
                         .neverDecreaseWidth(),
             )
         }
@@ -108,7 +102,6 @@
         }
 
         is OngoingActivityChipModel.Active.Text -> {
-            var hasOverflow by remember { mutableStateOf(false) }
             val text = viewModel.text
             Text(
                 text = text,
@@ -116,29 +109,38 @@
                 style = textStyle,
                 softWrap = false,
                 modifier =
-                    modifier
-                        .customTextContentLayout(
-                            maxTextWidth = maxTextWidth,
-                            startPadding = startPadding,
-                            endPadding = endPadding,
-                        ) { constraintWidth ->
-                            val intrinsicWidth =
-                                textMeasurer.measure(text, textStyle, softWrap = false).size.width
-                            hasOverflow = intrinsicWidth > constraintWidth
-                            constraintWidth.toFloat() / intrinsicWidth.toFloat() > 0.5f
-                        }
-                        .overflowFadeOut(
-                            hasOverflow = { hasOverflow },
-                            fadeLength =
-                                dimensionResource(
-                                    id = R.dimen.ongoing_activity_chip_text_fading_edge_length
-                                ),
-                        ),
+                    modifier.hideTextIfDoesNotFit(
+                        text = text,
+                        textStyle = textStyle,
+                        textMeasurer = textMeasurer,
+                        maxTextWidth = maxTextWidth,
+                        startPadding = startPadding,
+                        endPadding = endPadding,
+                    ),
             )
         }
 
         is OngoingActivityChipModel.Active.ShortTimeDelta -> {
-            // TODO(b/372657935): Implement ShortTimeDelta content in compose.
+            val timeRemainingState = rememberTimeRemainingState(futureTimeMillis = viewModel.time)
+
+            timeRemainingState.timeRemainingData?.let {
+                val text = formatTimeRemainingData(it)
+                Text(
+                    text = text,
+                    style = textStyle,
+                    color = textColor,
+                    softWrap = false,
+                    modifier =
+                        modifier.hideTextIfDoesNotFit(
+                            text = text,
+                            textStyle = textStyle,
+                            textMeasurer = textMeasurer,
+                            maxTextWidth = maxTextWidth,
+                            startPadding = startPadding,
+                            endPadding = endPadding,
+                        ),
+                )
+            }
         }
 
         is OngoingActivityChipModel.Active.IconOnly -> {
@@ -180,45 +182,67 @@
 }
 
 /**
- * A custom layout modifier for text that ensures its text is only visible if a provided
- * [shouldShow] callback returns true. Imposes a provided [maxTextWidthPx]. Also, accounts for
- * provided padding values if provided and ensures its text is placed with the provided padding
- * included around it.
+ * A custom layout modifier for text that ensures the text is only visible if it completely fits
+ * within the constrained bounds. Imposes a provided [maxTextWidthPx]. Also, accounts for provided
+ * padding values if provided and ensures its text is placed with the provided padding included
+ * around it.
  */
-private fun Modifier.customTextContentLayout(
+private fun Modifier.hideTextIfDoesNotFit(
+    text: String,
+    textStyle: TextStyle,
+    textMeasurer: TextMeasurer,
     maxTextWidth: Dp,
     startPadding: Dp = 0.dp,
     endPadding: Dp = 0.dp,
-    shouldShow: (constraintWidth: Int) -> Boolean,
 ): Modifier {
     return this.then(
-        CustomTextContentLayoutElement(maxTextWidth, startPadding, endPadding, shouldShow)
+        HideTextIfDoesNotFitElement(
+            text,
+            textStyle,
+            textMeasurer,
+            maxTextWidth,
+            startPadding,
+            endPadding,
+        )
     )
 }
 
-private data class CustomTextContentLayoutElement(
+private data class HideTextIfDoesNotFitElement(
+    val text: String,
+    val textStyle: TextStyle,
+    val textMeasurer: TextMeasurer,
     val maxTextWidth: Dp,
     val startPadding: Dp,
     val endPadding: Dp,
-    val shouldShow: (constrainedWidth: Int) -> Boolean,
-) : ModifierNodeElement<CustomTextContentLayoutNode>() {
-    override fun create(): CustomTextContentLayoutNode {
-        return CustomTextContentLayoutNode(maxTextWidth, startPadding, endPadding, shouldShow)
+) : ModifierNodeElement<HideTextIfDoesNotFitNode>() {
+    override fun create(): HideTextIfDoesNotFitNode {
+        return HideTextIfDoesNotFitNode(
+            text,
+            textStyle,
+            textMeasurer,
+            maxTextWidth,
+            startPadding,
+            endPadding,
+        )
     }
 
-    override fun update(node: CustomTextContentLayoutNode) {
-        node.shouldShow = shouldShow
+    override fun update(node: HideTextIfDoesNotFitNode) {
+        node.text = text
+        node.textStyle = textStyle
+        node.textMeasurer = textMeasurer
         node.maxTextWidth = maxTextWidth
         node.startPadding = startPadding
         node.endPadding = endPadding
     }
 }
 
-private class CustomTextContentLayoutNode(
+private class HideTextIfDoesNotFitNode(
+    var text: String,
+    var textStyle: TextStyle,
+    var textMeasurer: TextMeasurer,
     var maxTextWidth: Dp,
     var startPadding: Dp,
     var endPadding: Dp,
-    var shouldShow: (constrainedWidth: Int) -> Boolean,
 ) : Modifier.Node(), LayoutModifierNode {
     override fun MeasureScope.measure(
         measurable: Measurable,
@@ -230,9 +254,10 @@
                 .coerceAtLeast(constraints.minWidth)
         val placeable = measurable.measure(constraints.copy(maxWidth = maxWidth))
 
-        val height = placeable.height
-        val width = placeable.width
-        return if (shouldShow(maxWidth)) {
+        val intrinsicWidth = textMeasurer.measure(text, textStyle, softWrap = false).size.width
+        return if (intrinsicWidth <= maxWidth) {
+            val height = placeable.height
+            val width = placeable.width
             layout(width + horizontalPadding.roundToPx(), height) {
                 placeable.place(startPadding.roundToPx(), 0)
             }
@@ -241,20 +266,3 @@
         }
     }
 }
-
-private fun Modifier.overflowFadeOut(hasOverflow: () -> Boolean, fadeLength: Dp): Modifier {
-    return graphicsLayer(compositingStrategy = CompositingStrategy.Offscreen).drawWithCache {
-        val width = size.width
-        val start = (width - fadeLength.toPx()).coerceAtLeast(0f)
-        val gradient =
-            Brush.horizontalGradient(
-                colors = listOf(Color.Black, Color.Transparent),
-                startX = start,
-                endX = width,
-            )
-        onDrawWithContent {
-            drawContent()
-            if (hasOverflow()) drawRect(brush = gradient, blendMode = BlendMode.DstIn)
-        }
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/OngoingActivityChip.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/OngoingActivityChip.kt
index 76c5386..4a999d5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/OngoingActivityChip.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/OngoingActivityChip.kt
@@ -19,6 +19,7 @@
 import android.content.res.ColorStateList
 import android.view.ViewGroup
 import androidx.compose.foundation.background
+import androidx.compose.foundation.border
 import androidx.compose.foundation.clickable
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Box
@@ -48,11 +49,18 @@
 import com.android.systemui.common.ui.compose.Icon
 import com.android.systemui.common.ui.compose.load
 import com.android.systemui.res.R
+import com.android.systemui.statusbar.StatusBarIconView
 import com.android.systemui.statusbar.chips.ui.model.ColorsModel
 import com.android.systemui.statusbar.chips.ui.model.OngoingActivityChipModel
+import com.android.systemui.statusbar.core.StatusBarConnectedDisplays
+import com.android.systemui.statusbar.notification.icon.ui.viewbinder.NotificationIconContainerViewBinder
 
 @Composable
-fun OngoingActivityChip(model: OngoingActivityChipModel.Active, modifier: Modifier = Modifier) {
+fun OngoingActivityChip(
+    model: OngoingActivityChipModel.Active,
+    iconViewStore: NotificationIconContainerViewBinder.IconViewStore?,
+    modifier: Modifier = Modifier,
+) {
     when (val clickBehavior = model.clickBehavior) {
         is OngoingActivityChipModel.ClickBehavior.ExpandAction -> {
             // Wrap the chip in an Expandable so we can animate the expand transition.
@@ -64,15 +72,15 @@
                     ),
                 modifier = modifier,
             ) { expandable ->
-                ChipBody(model, onClick = { clickBehavior.onClick(expandable) })
+                ChipBody(model, iconViewStore, onClick = { clickBehavior.onClick(expandable) })
             }
         }
         is OngoingActivityChipModel.ClickBehavior.ShowHeadsUpNotification -> {
-            ChipBody(model, onClick = { clickBehavior.onClick() })
+            ChipBody(model, iconViewStore, onClick = { clickBehavior.onClick() })
         }
 
         is OngoingActivityChipModel.ClickBehavior.None -> {
-            ChipBody(model, modifier = modifier)
+            ChipBody(model, iconViewStore, modifier = modifier)
         }
     }
 }
@@ -80,12 +88,15 @@
 @Composable
 private fun ChipBody(
     model: OngoingActivityChipModel.Active,
+    iconViewStore: NotificationIconContainerViewBinder.IconViewStore?,
     modifier: Modifier = Modifier,
     onClick: (() -> Unit)? = null,
 ) {
     val context = LocalContext.current
     val isClickable = onClick != null
-    val hasEmbeddedIcon = model.icon is OngoingActivityChipModel.ChipIcon.StatusBarView
+    val hasEmbeddedIcon =
+        model.icon is OngoingActivityChipModel.ChipIcon.StatusBarView ||
+            model.icon is OngoingActivityChipModel.ChipIcon.StatusBarNotificationIcon
     val contentDescription =
         when (val icon = model.icon) {
             is OngoingActivityChipModel.ChipIcon.StatusBarView -> icon.contentDescription.load()
@@ -103,6 +114,13 @@
         } else {
             dimensionResource(id = R.dimen.ongoing_activity_chip_min_text_width) + chipSidePadding
         }
+
+    val outline = model.colors.outline(context)
+    val outlineWidth = dimensionResource(R.dimen.ongoing_activity_chip_outline_width)
+
+    val shape =
+        RoundedCornerShape(dimensionResource(id = R.dimen.ongoing_activity_chip_corner_radius))
+
     // Use a Box with `fillMaxHeight` to create a larger click surface for the chip. The visible
     // height of the chip is determined by the height of the background of the Row below.
     Box(
@@ -121,12 +139,7 @@
             horizontalArrangement = Arrangement.Center,
             verticalAlignment = Alignment.CenterVertically,
             modifier =
-                Modifier.clip(
-                        RoundedCornerShape(
-                            dimensionResource(id = R.dimen.ongoing_activity_chip_corner_radius)
-                        )
-                    )
-                    .height(dimensionResource(R.dimen.ongoing_appops_chip_height))
+                Modifier.height(dimensionResource(R.dimen.ongoing_appops_chip_height))
                     .thenIf(isClickable) { Modifier.widthIn(min = minWidth) }
                     .layout { measurable, constraints ->
                         val placeable = measurable.measure(constraints)
@@ -136,7 +149,14 @@
                             }
                         }
                     }
-                    .background(Color(model.colors.background(context).defaultColor))
+                    .background(Color(model.colors.background(context).defaultColor), shape = shape)
+                    .thenIf(outline != null) {
+                        Modifier.border(
+                            width = outlineWidth,
+                            color = Color(outline!!),
+                            shape = shape,
+                        )
+                    }
                     .padding(
                         horizontal =
                             if (hasEmbeddedIcon) {
@@ -146,7 +166,9 @@
                             }
                     ),
         ) {
-            model.icon?.let { ChipIcon(viewModel = it, colors = model.colors) }
+            model.icon?.let {
+                ChipIcon(viewModel = it, iconViewStore = iconViewStore, colors = model.colors)
+            }
 
             val isIconOnly = model is OngoingActivityChipModel.Active.IconOnly
             if (!isIconOnly) {
@@ -159,6 +181,7 @@
 @Composable
 private fun ChipIcon(
     viewModel: OngoingActivityChipModel.ChipIcon,
+    iconViewStore: NotificationIconContainerViewBinder.IconViewStore?,
     colors: ColorsModel,
     modifier: Modifier = Modifier,
 ) {
@@ -166,22 +189,16 @@
 
     when (viewModel) {
         is OngoingActivityChipModel.ChipIcon.StatusBarView -> {
-            // TODO(b/364653005): If the notification updates their small icon, ensure it's updated
-            // in the chip.
-            val originalIcon = viewModel.impl
-            val iconSizePx =
-                context.resources.getDimensionPixelSize(
-                    R.dimen.ongoing_activity_chip_embedded_padding_icon_size
-                )
-            AndroidView(
-                modifier = modifier,
-                factory = { _ ->
-                    originalIcon.apply {
-                        layoutParams = ViewGroup.LayoutParams(iconSizePx, iconSizePx)
-                        imageTintList = ColorStateList.valueOf(colors.text(context))
-                    }
-                },
-            )
+            StatusBarConnectedDisplays.assertInLegacyMode()
+            StatusBarIcon(colors, viewModel.impl.notification?.key, modifier) { viewModel.impl }
+        }
+        is OngoingActivityChipModel.ChipIcon.StatusBarNotificationIcon -> {
+            StatusBarConnectedDisplays.assertInNewMode()
+            check(iconViewStore != null)
+
+            StatusBarIcon(colors, viewModel.notificationKey, modifier) {
+                iconViewStore.iconView(viewModel.notificationKey)
+            }
         }
 
         is OngoingActivityChipModel.ChipIcon.SingleColorIcon -> {
@@ -199,6 +216,31 @@
     }
 }
 
+/** A Compose wrapper around [StatusBarIconView]. */
+@Composable
+private fun StatusBarIcon(
+    colors: ColorsModel,
+    notificationKey: String?,
+    modifier: Modifier = Modifier,
+    iconFactory: () -> StatusBarIconView?,
+) {
+    val context = LocalContext.current
+
+    val iconSizePx =
+        context.resources.getDimensionPixelSize(
+            R.dimen.ongoing_activity_chip_embedded_padding_icon_size
+        )
+    AndroidView(
+        modifier = modifier,
+        factory = { _ ->
+            iconFactory.invoke()?.apply {
+                layoutParams = ViewGroup.LayoutParams(iconSizePx, iconSizePx)
+                imageTintList = ColorStateList.valueOf(colors.text(context))
+            } ?: throw IllegalStateException("Missing StatusBarIconView for $notificationKey")
+        },
+    )
+}
+
 @Composable
 private fun ExpandableChip(
     color: () -> Color,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/OngoingActivityChips.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/OngoingActivityChips.kt
index 64cad31..4017c43 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/OngoingActivityChips.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/OngoingActivityChips.kt
@@ -26,18 +26,24 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.unit.dp
 import com.android.systemui.statusbar.chips.ui.model.MultipleOngoingActivityChipsModel
+import com.android.systemui.statusbar.notification.icon.ui.viewbinder.NotificationIconContainerViewBinder
 
 @Composable
-fun OngoingActivityChips(chips: MultipleOngoingActivityChipsModel, modifier: Modifier = Modifier) {
+fun OngoingActivityChips(
+    chips: MultipleOngoingActivityChipsModel,
+    iconViewStore: NotificationIconContainerViewBinder.IconViewStore?,
+    modifier: Modifier = Modifier,
+) {
     Row(
         // TODO(b/372657935): Remove magic numbers for padding and spacing.
         modifier = modifier.fillMaxHeight().padding(horizontal = 6.dp),
         verticalAlignment = Alignment.CenterVertically,
         horizontalArrangement = Arrangement.spacedBy(8.dp),
     ) {
-        // TODO(b/372657935): Make sure chips are only shown when there is enough horizontal space.
         chips.active
             .filter { !it.isHidden }
-            .forEach { key(it.key) { OngoingActivityChip(model = it) } }
+            .forEach {
+                key(it.key) { OngoingActivityChip(model = it, iconViewStore = iconViewStore) }
+            }
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/model/ColorsModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/model/ColorsModel.kt
index 25f90f9..4954cb0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/model/ColorsModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/model/ColorsModel.kt
@@ -21,7 +21,6 @@
 import androidx.annotation.ColorInt
 import com.android.settingslib.Utils
 import com.android.systemui.res.R
-import com.android.systemui.statusbar.notification.promoted.shared.model.PromotedNotificationContentModel
 
 /** Model representing how the chip in the status bar should be colored. */
 sealed interface ColorsModel {
@@ -31,13 +30,38 @@
     /** The color for the text (and icon) on the chip. */
     @ColorInt fun text(context: Context): Int
 
-    /** The chip should match the theme's primary color. */
-    data object Themed : ColorsModel {
+    /** The color to use for the chip outline, or null if the chip shouldn't have an outline. */
+    @ColorInt fun outline(context: Context): Int?
+
+    /** The chip should match the theme's primary accent color. */
+    // TODO(b/347717946): The chip's color isn't getting updated when the user switches theme, it
+    // only gets updated when a different configuration change happens, like a rotation.
+    data object AccentThemed : ColorsModel {
         override fun background(context: Context): ColorStateList =
             Utils.getColorAttr(context, com.android.internal.R.attr.colorAccent)
 
         override fun text(context: Context) =
             Utils.getColorAttrDefaultColor(context, com.android.internal.R.attr.colorPrimary)
+
+        override fun outline(context: Context) = null
+    }
+
+    /** The chip should match the system theme main color. */
+    // TODO(b/347717946): The chip's color isn't getting updated when the user switches theme, it
+    // only gets updated when a different configuration change happens, like a rotation.
+    data object SystemThemed : ColorsModel {
+        override fun background(context: Context): ColorStateList =
+            ColorStateList.valueOf(
+                context.getColor(com.android.internal.R.color.materialColorSurfaceDim)
+            )
+
+        override fun text(context: Context) =
+            context.getColor(com.android.internal.R.color.materialColorOnSurface)
+
+        override fun outline(context: Context) =
+            // Outline is required on the SystemThemed chip to guarantee the chip doesn't completely
+            // blend in with the background.
+            context.getColor(com.android.internal.R.color.materialColorOutlineVariant)
     }
 
     /** The chip should have the given background color and primary text color. */
@@ -46,6 +70,8 @@
             ColorStateList.valueOf(backgroundColorInt)
 
         override fun text(context: Context): Int = primaryTextColorInt
+
+        override fun outline(context: Context) = null
     }
 
     /** The chip should have a red background with white text. */
@@ -55,15 +81,7 @@
         }
 
         override fun text(context: Context) = context.getColor(android.R.color.white)
-    }
 
-    companion object {
-        /** Converts the promoted notification colors to a [Custom] colors model. */
-        fun PromotedNotificationContentModel.toCustomColorsModel(): Custom {
-            return Custom(
-                backgroundColorInt = this.colors.backgroundColor,
-                primaryTextColorInt = this.colors.primaryTextColor,
-            )
-        }
+        override fun outline(context: Context) = null
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/view/ChipTextTruncationHelper.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/view/ChipTextTruncationHelper.kt
index 52495eb..c19b144 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/view/ChipTextTruncationHelper.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/view/ChipTextTruncationHelper.kt
@@ -51,9 +51,8 @@
     }
 
     /**
-     * Returns true if this view should show the text because there's enough room for a substantial
-     * amount of text, and returns false if this view should hide the text because the text is much
-     * too long.
+     * Returns true if this view should show the text because there's enough room for all the text,
+     * and returns false if this view should hide the text because not all of it fits.
      *
      * @param desiredTextWidthPx should be calculated by having the view measure itself with
      *   [unlimitedWidthMeasureSpec] and then sending its `measuredWidth` to this method. (This
@@ -82,9 +81,8 @@
             enforcedTextWidth = maxWidthBasedOnDimension
         }
 
-        // Only show the text if at least 50% of it can show. (Assume that if < 50% of the text will
-        // be visible, the text will be more confusing than helpful.)
-        return desiredTextWidthPx <= enforcedTextWidth * 2
+        // Only show the text if all of it can show
+        return desiredTextWidthPx <= enforcedTextWidth
     }
 
     private fun fetchMaxWidth() =
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/viewmodel/TimeRemainingState.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/viewmodel/TimeRemainingState.kt
new file mode 100644
index 0000000..eb6ebca
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/viewmodel/TimeRemainingState.kt
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF 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.chips.ui.viewmodel
+
+import android.os.SystemClock
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.derivedStateOf
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.res.stringResource
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.compose.LocalLifecycleOwner
+import androidx.lifecycle.repeatOnLifecycle
+import kotlin.time.Duration
+import kotlin.time.Duration.Companion.hours
+import kotlin.time.Duration.Companion.minutes
+import kotlin.time.DurationUnit
+import kotlin.time.toDuration
+import kotlinx.coroutines.delay
+
+/**
+ * Manages state and updates for the duration remaining between now and a given time in the future.
+ */
+class TimeRemainingState(private val timeSource: TimeSource, private val futureTimeMillis: Long) {
+    private var durationRemaining by mutableStateOf(Duration.ZERO)
+    private var startTimeMillis: Long = 0
+
+    /**
+     * [Pair] representing the time unit and its value.
+     *
+     * @property first the string resource ID corresponding to the time unit (e.g., minutes, hours).
+     * @property second the time value of the duration unit. Null if time is less than a minute or
+     *   past.
+     */
+    val timeRemainingData by derivedStateOf { getTimeRemainingData(durationRemaining) }
+
+    suspend fun run() {
+        startTimeMillis = timeSource.getCurrentTime()
+        while (true) {
+            val currentTime = timeSource.getCurrentTime()
+            durationRemaining =
+                (futureTimeMillis - currentTime).toDuration(DurationUnit.MILLISECONDS)
+            // No need to update if duration is more than 1 minute in the past. Because, we will
+            // stop displaying anything.
+            if (durationRemaining.inWholeMilliseconds < -1.minutes.inWholeMilliseconds) {
+                break
+            }
+            val delaySkewMillis = (currentTime - startTimeMillis) % 1000L
+            delay(calculateNextUpdateDelay(durationRemaining) - delaySkewMillis)
+        }
+    }
+
+    private fun calculateNextUpdateDelay(duration: Duration): Long {
+        val durationAbsolute = duration.absoluteValue
+        return when {
+            durationAbsolute.inWholeHours < 1 -> {
+                1000 + ((durationAbsolute.inWholeMilliseconds % 1.minutes.inWholeMilliseconds))
+            }
+            durationAbsolute.inWholeHours < 24 -> {
+                1000 + (durationAbsolute.inWholeMilliseconds % 1.hours.inWholeMilliseconds)
+            }
+            else -> 1000 + (durationAbsolute.inWholeMilliseconds % 24.hours.inWholeMilliseconds)
+        }
+    }
+}
+
+/** Remember and manage the TimeRemainingState */
+@Composable
+fun rememberTimeRemainingState(
+    futureTimeMillis: Long,
+    timeSource: TimeSource = remember { TimeSource { SystemClock.elapsedRealtime() } },
+): TimeRemainingState {
+
+    val state =
+        remember(timeSource, futureTimeMillis) { TimeRemainingState(timeSource, futureTimeMillis) }
+    val lifecycleOwner = LocalLifecycleOwner.current
+    LaunchedEffect(lifecycleOwner, timeSource, futureTimeMillis) {
+        lifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { state.run() }
+    }
+
+    return state
+}
+
+private fun getTimeRemainingData(duration: Duration): Pair<Int, Long?>? {
+    return when {
+        duration.inWholeMinutes <= -1 -> null
+        duration.inWholeMinutes < 1 -> Pair(com.android.internal.R.string.now_string_shortest, null)
+        duration.inWholeHours < 1 ->
+            Pair(com.android.internal.R.string.duration_minutes_medium, duration.inWholeMinutes)
+        duration.inWholeDays < 1 ->
+            Pair(com.android.internal.R.string.duration_hours_medium, duration.inWholeHours)
+        else -> null
+    }
+}
+
+/** Formats the time remaining data into a user-readable string. */
+@Composable
+fun formatTimeRemainingData(resourcePair: Pair<Int, Long?>): String {
+    return resourcePair.let { (resourceId, time) ->
+        when (time) {
+            null -> stringResource(resourceId)
+            else -> stringResource(resourceId, time.toInt())
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/StatusEvent.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/StatusEvent.kt
index ea1d782..5887eb6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/events/StatusEvent.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/StatusEvent.kt
@@ -25,6 +25,8 @@
 import com.android.systemui.privacy.PrivacyItem
 import com.android.systemui.statusbar.BatteryStatusChip
 import com.android.systemui.statusbar.ConnectedDisplayChip
+import com.android.systemui.statusbar.core.NewStatusBarIcons
+import com.android.systemui.statusbar.events.ui.view.BatteryStatusEventComposeChip
 
 typealias ViewCreator = (context: Context) -> BackgroundAnimatableView
 
@@ -53,9 +55,7 @@
     }
 }
 
-class BGView(
-    context: Context
-) : View(context), BackgroundAnimatableView {
+class BGView(context: Context) : View(context), BackgroundAnimatableView {
     override val view: View
         get() = this
 
@@ -65,9 +65,7 @@
 }
 
 @SuppressLint("AppCompatCustomView")
-class BGImageView(
-    context: Context
-) : ImageView(context), BackgroundAnimatableView {
+class BGImageView(context: Context) : ImageView(context), BackgroundAnimatableView {
     override val view: View
         get() = this
 
@@ -84,8 +82,10 @@
     override val shouldAnnounceAccessibilityEvent: Boolean = false
 
     override val viewCreator: ViewCreator = { context ->
-        BatteryStatusChip(context).apply {
-            setBatteryLevel(batteryLevel)
+        if (NewStatusBarIcons.isEnabled) {
+            BatteryStatusEventComposeChip(batteryLevel, context)
+        } else {
+            BatteryStatusChip(context).apply { setBatteryLevel(batteryLevel) }
         }
     }
 
@@ -103,9 +103,7 @@
     override var contentDescription: String? = ""
     override val shouldAnnounceAccessibilityEvent: Boolean = true
 
-    override val viewCreator: ViewCreator = { context ->
-        ConnectedDisplayChip(context)
-    }
+    override val viewCreator: ViewCreator = { context -> ConnectedDisplayChip(context) }
 
     override fun toString(): String {
         return javaClass.simpleName
@@ -134,7 +132,8 @@
     }
 
     override fun shouldUpdateFromEvent(other: StatusEvent?): Boolean {
-        return other is PrivacyEvent && (other.privacyItems != privacyItems ||
+        return other is PrivacyEvent &&
+            (other.privacyItems != privacyItems ||
                 other.contentDescription != contentDescription ||
                 (other.forceVisible && !forceVisible))
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/ui/view/BatteryStatusEventComposeChip.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/ui/view/BatteryStatusEventComposeChip.kt
new file mode 100644
index 0000000..a90e3ff
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/ui/view/BatteryStatusEventComposeChip.kt
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF 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.events.ui.view
+
+import android.annotation.SuppressLint
+import android.content.Context
+import android.util.AttributeSet
+import android.view.View
+import android.widget.FrameLayout
+import android.widget.LinearLayout
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.width
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.ComposeView
+import com.android.systemui.res.R
+import com.android.systemui.statusbar.core.NewStatusBarIcons
+import com.android.systemui.statusbar.events.BackgroundAnimatableView
+import com.android.systemui.statusbar.pipeline.battery.domain.interactor.BatteryInteractor
+import com.android.systemui.statusbar.pipeline.battery.shared.ui.BatteryColors.LightThemeChargingColors
+import com.android.systemui.statusbar.pipeline.battery.shared.ui.BatteryFrame
+import com.android.systemui.statusbar.pipeline.battery.shared.ui.BatteryGlyph
+import com.android.systemui.statusbar.pipeline.battery.ui.composable.BatteryCanvas
+import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.BatteryViewModel
+import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.BatteryViewModel.Companion.glyphRepresentation
+
+/**
+ * [StatusEvent] chip for the battery plugged in status event. Shows the current battery level and
+ * charging state in the status bar via the system event animation.
+ *
+ * This chip will fully replace [BatteryStatusChip] when [NewStatusBarIcons] is rolled out
+ */
+@SuppressLint("ViewConstructor")
+class BatteryStatusEventComposeChip
+@JvmOverloads
+constructor(level: Int, context: Context, attrs: AttributeSet? = null) :
+    FrameLayout(context, attrs), BackgroundAnimatableView {
+    private val roundedContainer: LinearLayout
+    private val composeInner: ComposeView
+    override val contentView: View
+        get() = composeInner
+
+    init {
+        NewStatusBarIcons.assertInNewMode()
+
+        inflate(context, R.layout.status_bar_event_chip_compose, this)
+        roundedContainer = requireViewById(R.id.rounded_container)
+        composeInner = requireViewById(R.id.compose_view)
+        composeInner.apply {
+            setContent {
+                val isFull = BatteryInteractor.isBatteryFull(level)
+                BatteryCanvas(
+                    modifier =
+                        Modifier.width(BatteryViewModel.STATUS_BAR_BATTERY_WIDTH)
+                            .height(BatteryViewModel.STATUS_BAR_BATTERY_HEIGHT),
+                    path = BatteryFrame.pathSpec,
+                    // TODO(b/394659067): get a content description for this chip
+                    contentDescription = "",
+                    innerWidth = BatteryFrame.innerWidth,
+                    innerHeight = BatteryFrame.innerHeight,
+                    // This event only happens when plugged in, so we always show it as charging
+                    glyphs =
+                        if (isFull) listOf(BatteryGlyph.Bolt)
+                        else level.glyphRepresentation() + BatteryGlyph.Bolt,
+                    level = level,
+                    isFull = isFull,
+                    colorsProvider = { LightThemeChargingColors },
+                )
+            }
+        }
+        updateResources()
+    }
+
+    /**
+     * When animating as a chip in the status bar, we want to animate the width for the rounded
+     * container. We have to subtract our own top and left offset because the bounds come to us as
+     * absolute on-screen bounds.
+     */
+    override fun setBoundsForAnimation(l: Int, t: Int, r: Int, b: Int) {
+        roundedContainer.setLeftTopRightBottom(l - left, t - top, r - left, b - top)
+    }
+
+    @SuppressLint("UseCompatLoadingForDrawables")
+    private fun updateResources() {
+        roundedContainer.background = mContext.getDrawable(R.drawable.statusbar_chip_bg)
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ConversationNotifications.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ConversationNotifications.kt
index 89cb420..9bc5231 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ConversationNotifications.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ConversationNotifications.kt
@@ -69,7 +69,10 @@
         messagingStyle.conversationType =
             if (entry.ranking.channel.isImportantConversation)
                 Notification.MessagingStyle.CONVERSATION_TYPE_IMPORTANT
-            else Notification.MessagingStyle.CONVERSATION_TYPE_NORMAL
+            else if (entry.ranking.isConversation)
+                Notification.MessagingStyle.CONVERSATION_TYPE_NORMAL
+            else
+                Notification.MessagingStyle.CONVERSATION_TYPE_LEGACY
         entry.ranking.conversationShortcutInfo?.let { shortcutInfo ->
             logger.logAsyncTaskProgress(entry, "getting shortcut icon")
             messagingStyle.shortcutIcon = launcherApps.getShortcutIcon(shortcutInfo)
diff --git a/core/java/com/android/internal/app/IAppOpsCallback.aidl b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/BundleEntry.java
similarity index 61%
copy from core/java/com/android/internal/app/IAppOpsCallback.aidl
copy to packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/BundleEntry.java
index 3a9525c..37485fe 100644
--- a/core/java/com/android/internal/app/IAppOpsCallback.aidl
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/BundleEntry.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2013 The Android Open Source Project
+ * Copyright (C) 2025 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,10 +14,13 @@
  * limitations under the License.
  */
 
-package com.android.internal.app;
+package com.android.systemui.statusbar.notification.collection;
 
-// This interface is also used by native code, so must
-// be kept in sync with frameworks/native/libs/permission/include/binder/IAppOpsCallback.h
-oneway interface IAppOpsCallback {
-    void opChanged(int op, int uid, String packageName, String persistentDeviceId);
+/**
+ * Abstract class to represent notification section bundled by AI.
+ */
+public class BundleEntry extends PipelineEntry {
+
+    public class BundleEntryAdapter implements EntryAdapter {
+    }
 }
diff --git a/core/java/com/android/internal/app/IAppOpsCallback.aidl b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/EntryAdapter.java
similarity index 61%
copy from core/java/com/android/internal/app/IAppOpsCallback.aidl
copy to packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/EntryAdapter.java
index 3a9525c..b12b1c5 100644
--- a/core/java/com/android/internal/app/IAppOpsCallback.aidl
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/EntryAdapter.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2013 The Android Open Source Project
+ * Copyright (C) 2025 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,10 +14,10 @@
  * limitations under the License.
  */
 
-package com.android.internal.app;
+package com.android.systemui.statusbar.notification.collection;
 
-// This interface is also used by native code, so must
-// be kept in sync with frameworks/native/libs/permission/include/binder/IAppOpsCallback.h
-oneway interface IAppOpsCallback {
-    void opChanged(int op, int uid, String packageName, String persistentDeviceId);
+/**
+ * Adapter interface for UI to get relevant info.
+ */
+public interface EntryAdapter {
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/ListEntry.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/ListEntry.java
index 915057f..c8e3be4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/ListEntry.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/ListEntry.java
@@ -27,7 +27,7 @@
  * Abstract superclass for top-level entries, i.e. things that can appear in the final notification
  * list shown to users. In practice, this means either GroupEntries or NotificationEntries.
  */
-public abstract class ListEntry {
+public abstract class ListEntry extends PipelineEntry {
     private final String mKey;
     private final long mCreationTime;
 
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 9dc651e..7dd82a6 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
@@ -270,6 +270,9 @@
         setRanking(ranking);
     }
 
+    public class NotifEntryAdapter implements EntryAdapter {
+    }
+
     @Override
     public NotificationEntry getRepresentativeEntry() {
         return this;
diff --git a/core/java/com/android/internal/app/IAppOpsCallback.aidl b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/PipelineEntry.java
similarity index 61%
rename from core/java/com/android/internal/app/IAppOpsCallback.aidl
rename to packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/PipelineEntry.java
index 3a9525c..efedfef 100644
--- a/core/java/com/android/internal/app/IAppOpsCallback.aidl
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/PipelineEntry.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2013 The Android Open Source Project
+ * Copyright (C) 2025 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,10 +14,10 @@
  * limitations under the License.
  */
 
-package com.android.internal.app;
+package com.android.systemui.statusbar.notification.collection;
 
-// This interface is also used by native code, so must
-// be kept in sync with frameworks/native/libs/permission/include/binder/IAppOpsCallback.h
-oneway interface IAppOpsCallback {
-    void opChanged(int op, int uid, String packageName, String persistentDeviceId);
+/**
+ * Class to represent a notification, group, or bundle in the pipeline.
+ */
+public class PipelineEntry {
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationStackModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationStackModule.kt
deleted file mode 100644
index 6ceeb6a..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationStackModule.kt
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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.dagger
-
-import com.android.systemui.statusbar.notification.stack.NotificationStackRebindingHider
-import com.android.systemui.statusbar.notification.stack.NotificationStackRebindingHiderImpl
-import dagger.Binds
-import dagger.BindsOptionalOf
-import dagger.Module
-
-/**
- * This is meant to be bound in SystemUI variants with [NotificationStackScrollLayoutController].
- */
-@Module
-interface NotificationStackGoogleModule {
-    @Binds
-    fun bindNotificationStackRebindingHider(
-        impl: NotificationStackRebindingHiderImpl
-    ): NotificationStackRebindingHider
-}
-
-/** This is meant to be used by all SystemUI variants, also those without NSSL. */
-@Module
-interface NotificationStackModule {
-    @BindsOptionalOf
-    fun bindOptionalOfNotificationStackRebindingHider(): NotificationStackRebindingHider
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java
index e10825b..53d5dbc 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java
@@ -121,7 +121,6 @@
         NotificationMemoryModule.class,
         NotificationStatsLoggerModule.class,
         NotificationsLogModule.class,
-        NotificationStackModule.class,
 })
 public interface NotificationsModule {
     @Binds
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 96192b1..25deec3 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
@@ -391,7 +391,7 @@
         if (!notificationFooterBackgroundTintOptimization()) {
             if (notificationShadeBlur()) {
                 Color backgroundColor = Color.valueOf(
-                        SurfaceEffectColors.surfaceEffect0(getResources()));
+                        SurfaceEffectColors.surfaceEffect1(getResources()));
                 scHigh = ColorUtils.setAlphaComponent(backgroundColor.toArgb(), 0xFF);
                 // Apply alpha on background drawables.
                 int backgroundAlpha = (int) (backgroundColor.alpha() * 0xFF);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/AvalancheController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/AvalancheController.kt
index de113d3..ccc2dff 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/AvalancheController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/AvalancheController.kt
@@ -49,7 +49,7 @@
 ) : Dumpable {
 
     private val tag = "AvalancheController"
-    private val debug = Compile.IS_DEBUG
+    private val debug = Compile.IS_DEBUG && Log.isLoggable(tag, Log.DEBUG)
     var baseEntryMapStr: () -> String = { "baseEntryMapStr not initialized" }
 
     var enableAtRuntime = true
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 31375cc..c512b43 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
@@ -222,10 +222,6 @@
                 return@traceSection
             }
 
-            if (StatusBarConnectedDisplays.isEnabled) {
-                onIconUpdateRequiredListeners.onEach { it.onIconUpdateRequired(entry) }
-            }
-
             if (usingCache && !Flags.notificationsBackgroundIcons()) {
                 Log.wtf(
                     TAG,
@@ -238,6 +234,10 @@
                 entry.icons.peopleAvatarDescriptor = null
             }
 
+            if (StatusBarConnectedDisplays.isEnabled) {
+                onIconUpdateRequiredListeners.onEach { it.onIconUpdateRequired(entry) }
+            }
+
             val (normalIconDescriptor, sensitiveIconDescriptor) = getIconDescriptors(entry)
             val notificationContentDescription =
                 entry.sbn.notification?.let { iconBuilder.getIconContentDescription(it) }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/domain/interactor/NotificationIconsInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/domain/interactor/NotificationIconsInteractor.kt
index f02edee..18a1afa 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/domain/interactor/NotificationIconsInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/domain/interactor/NotificationIconsInteractor.kt
@@ -21,6 +21,7 @@
 import com.android.systemui.statusbar.notification.data.repository.NotificationsKeyguardViewStateRepository
 import com.android.systemui.statusbar.notification.domain.interactor.ActiveNotificationsInteractor
 import com.android.systemui.statusbar.notification.domain.interactor.HeadsUpNotificationIconInteractor
+import com.android.systemui.statusbar.notification.promoted.domain.interactor.AODPromotedNotificationInteractor
 import com.android.systemui.statusbar.notification.shared.ActiveNotificationModel
 import com.android.wm.shell.bubbles.Bubbles
 import java.util.Optional
@@ -30,6 +31,7 @@
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.flatMapLatest
+import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.flow.flowOn
 
 /** Domain logic related to notification icons. */
@@ -39,8 +41,21 @@
     private val activeNotificationsInteractor: ActiveNotificationsInteractor,
     private val bubbles: Optional<Bubbles>,
     private val headsUpNotificationIconInteractor: HeadsUpNotificationIconInteractor,
+    private val aodPromotedNotificationInteractor: AODPromotedNotificationInteractor,
     private val keyguardViewStateRepository: NotificationsKeyguardViewStateRepository,
 ) {
+    private val aodPromotedKeyToHide: Flow<String?> =
+        combine(
+            aodPromotedNotificationInteractor.content,
+            aodPromotedNotificationInteractor.isPresent,
+        ) { content, isPresent ->
+            when {
+                !isPresent -> null
+                content == null -> null
+                else -> content.identity.key
+            }
+        }
+
     /** Returns a subset of all active notifications based on the supplied filtration parameters. */
     fun filteredNotifSet(
         forceShowHeadsUp: Boolean = false,
@@ -49,12 +64,14 @@
         showDismissed: Boolean = true,
         showRepliedMessages: Boolean = true,
         showPulsing: Boolean = true,
+        showAodPromoted: Boolean = true,
     ): Flow<Set<ActiveNotificationModel>> {
         return combine(
             activeNotificationsInteractor.topLevelRepresentativeNotifications,
             headsUpNotificationIconInteractor.isolatedNotification,
+            if (showAodPromoted) flowOf(null) else aodPromotedKeyToHide,
             keyguardViewStateRepository.areNotificationsFullyHidden,
-        ) { notifications, isolatedNotifKey, notifsFullyHidden ->
+        ) { notifications, isolatedNotifKey, aodPromotedKeyToHide, notifsFullyHidden ->
             notifications
                 .asSequence()
                 .filter { model: ActiveNotificationModel ->
@@ -67,6 +84,7 @@
                         showRepliedMessages = showRepliedMessages,
                         showPulsing = showPulsing,
                         isolatedNotifKey = isolatedNotifKey,
+                        aodPromotedKeyToHide = aodPromotedKeyToHide,
                         notifsFullyHidden = notifsFullyHidden,
                     )
                 }
@@ -83,6 +101,7 @@
         showRepliedMessages: Boolean,
         showPulsing: Boolean,
         isolatedNotifKey: String?,
+        aodPromotedKeyToHide: String?,
         notifsFullyHidden: Boolean,
     ): Boolean {
         return when {
@@ -93,6 +112,7 @@
             !showRepliedMessages && model.isLastMessageFromReply -> false
             !showAmbient && model.isSuppressedFromStatusBar -> false
             !showPulsing && model.isPulsing && !notifsFullyHidden -> false
+            model.key == aodPromotedKeyToHide -> false
             bubbles.getOrNull()?.isBubbleExpanded(model.key) == true -> false
             else -> true
         }
@@ -115,6 +135,7 @@
                     showDismissed = false,
                     showRepliedMessages = false,
                     showPulsing = !isBypassEnabled,
+                    showAodPromoted = false,
                 )
             }
             .flowOn(bgContext)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/AODPromotedNotification.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/AODPromotedNotification.kt
index 7c75983..893570b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/AODPromotedNotification.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/AODPromotedNotification.kt
@@ -23,6 +23,7 @@
 import android.view.View
 import android.view.View.GONE
 import android.view.View.VISIBLE
+import android.view.ViewGroup.MarginLayoutParams
 import android.view.ViewStub
 import android.widget.Chronometer
 import android.widget.DateTimeView
@@ -38,7 +39,6 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.key
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.SolidColor
 import androidx.compose.ui.res.dimensionResource
 import androidx.compose.ui.unit.dp
@@ -164,8 +164,8 @@
     private var chronometerStub: ViewStub? = root.findViewById(R.id.chronometer)
     private var chronometer: Chronometer? = null
     private val closeButton: View? = root.findViewById(R.id.close_button)
-    private val conversationIconContainer: View? =
-        root.findViewById(R.id.conversation_icon_container)
+    private val conversationIconBadge: View? = root.findViewById(R.id.conversation_icon_badge)
+    private val conversationIcon: CachingIconView? = root.findViewById(R.id.conversation_icon)
     private val conversationText: TextView? = root.findViewById(R.id.conversation_text)
     private val expandButton: NotificationExpandButton? = root.findViewById(R.id.expand_button)
     private val headerText: TextView? = root.findViewById(R.id.header_text)
@@ -175,12 +175,13 @@
         root.findViewById(R.id.header_text_secondary_divider)
     private val icon: NotificationRowIconView? = root.findViewById(R.id.icon)
     private val leftIcon: ImageView? = root.findViewById(R.id.left_icon)
-    private val rightIcon: ImageView? = root.findViewById(R.id.right_icon)
+    private val mainColumn: View? = root.findViewById(R.id.notification_main_column)
     private val notificationProgressEndIcon: CachingIconView? =
         root.findViewById(R.id.notification_progress_end_icon)
     private val notificationProgressStartIcon: CachingIconView? =
         root.findViewById(R.id.notification_progress_start_icon)
     private val profileBadge: ImageView? = root.findViewById(R.id.profile_badge)
+    private val rightIcon: ImageView? = root.findViewById(R.id.right_icon)
     private val text: ImageFloatingTextView? = root.findViewById(R.id.text)
     private val time: DateTimeView? = root.findViewById(R.id.time)
     private val timeDivider: View? = root.findViewById(R.id.time_divider)
@@ -198,7 +199,7 @@
         alternateExpandTarget?.visibility = GONE
         bigPicture?.visibility = GONE
         closeButton?.visibility = GONE
-        conversationIconContainer?.visibility = GONE
+        conversationIconBadge?.visibility = GONE
         expandButton?.visibility = GONE
         leftIcon?.visibility = GONE
         notificationProgressEndIcon?.visibility = GONE
@@ -209,6 +210,16 @@
             ?.drawable
             ?.mutate()
             ?.setColorFilter(SecondaryText.colorInt, PorterDuff.Mode.SRC_IN)
+
+        if (Flags.notificationsRedesignTemplates()) {
+            (mainColumn?.layoutParams as? MarginLayoutParams)?.let { mainColumnMargins ->
+                mainColumnMargins.topMargin =
+                    Notification.Builder.getContentMarginTop(
+                        root.context,
+                        R.dimen.notification_2025_content_margin_top,
+                    )
+            }
+        }
     }
 
     fun update(content: PromotedNotificationContentModel, audiblyAlertedIconVisible: Boolean) {
@@ -229,15 +240,11 @@
         textView: ImageFloatingTextView? = null,
         showOldProgress: Boolean = true,
     ) {
-        // Icon binding must be called in this order
-        updateImageView(icon, content.smallIcon)
-        icon?.setBackgroundColor(Background.colorInt)
-        icon?.originalIconColor = PrimaryText.colorInt
-
         updateHeader(content, hideTitle = true)
 
         updateTitle(title, content)
         updateText(textView ?: text, content)
+        updateSmallIcon(icon, content)
         updateImageView(rightIcon, content.skeletonLargeIcon)
 
         if (showOldProgress) {
@@ -340,6 +347,8 @@
 
         updateImageView(verificationIcon, content.verificationIcon)
         updateTextView(verificationText, content.verificationText)
+
+        updateSmallIcon(conversationIcon, content)
     }
 
     private fun updateConversationHeaderDividers(
@@ -397,6 +406,19 @@
         }
     }
 
+    private fun updateSmallIcon(
+        smallIconView: CachingIconView?,
+        content: PromotedNotificationContentModel,
+    ) {
+        smallIconView ?: return
+
+        // Icon binding must be called in this order
+        updateImageView(smallIconView, content.smallIcon)
+        smallIconView.setImageLevel(content.iconLevel)
+        smallIconView.setBackgroundColor(Background.colorInt)
+        smallIconView.originalIconColor = PrimaryText.colorInt
+    }
+
     private fun inflateChronometer() {
         if (chronometer != null) {
             return
@@ -404,6 +426,8 @@
 
         chronometer = chronometerStub?.inflate() as Chronometer
         chronometerStub = null
+
+        chronometer?.appendFontFeatureSetting("tnum")
     }
 
     private fun inflateOldProgressBar() {
@@ -479,14 +503,16 @@
     }
 }
 
-private enum class AodPromotedNotificationColor(colorUInt: UInt) {
-    Background(0xFF000000u),
-    PrimaryText(0xFFFFFFFFu),
-    SecondaryText(0xFFCCCCCCu);
+private fun TextView.appendFontFeatureSetting(newSetting: String) {
+    fontFeatureSettings = (fontFeatureSettings?.let { "$it," } ?: "") + newSetting
+}
 
-    val colorInt = colorUInt.toInt()
-    val color = Color(colorInt)
-    val brush = SolidColor(color)
+private enum class AodPromotedNotificationColor(val colorInt: Int) {
+    Background(android.graphics.Color.BLACK),
+    PrimaryText(android.graphics.Color.WHITE),
+    SecondaryText(android.graphics.Color.WHITE);
+
+    val brush = SolidColor(androidx.compose.ui.graphics.Color(colorInt))
 }
 
 private val viewUpdaterTagId = systemuiR.id.aod_promoted_notification_view_updater_tag
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/PromotedNotificationContentExtractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/PromotedNotificationContentExtractor.kt
index cd78722..39c7df0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/PromotedNotificationContentExtractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/PromotedNotificationContentExtractor.kt
@@ -96,6 +96,7 @@
         contentBuilder.wasPromotedAutomatically =
             notification.extras.getBoolean(EXTRA_WAS_AUTOMATICALLY_PROMOTED, false)
         contentBuilder.smallIcon = notification.smallIconModel(imageModelProvider)
+        contentBuilder.iconLevel = notification.iconLevel
         contentBuilder.appName = notification.loadHeaderAppName(context)
         contentBuilder.subText = notification.subText()
         contentBuilder.time = notification.extractWhen()
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/domain/interactor/AODPromotedNotificationInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/domain/interactor/AODPromotedNotificationInteractor.kt
index 0f21514..393f95d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/domain/interactor/AODPromotedNotificationInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/domain/interactor/AODPromotedNotificationInteractor.kt
@@ -17,8 +17,11 @@
 package com.android.systemui.statusbar.notification.promoted.domain.interactor
 
 import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dump.DumpManager
 import com.android.systemui.statusbar.notification.domain.interactor.ActiveNotificationsInteractor
 import com.android.systemui.statusbar.notification.promoted.shared.model.PromotedNotificationContentModel
+import com.android.systemui.statusbar.notification.promoted.shared.model.PromotedNotificationContentModel.Style
+import com.android.systemui.util.kotlin.FlowDumperImpl
 import javax.inject.Inject
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.map
@@ -26,9 +29,17 @@
 @SysUISingleton
 class AODPromotedNotificationInteractor
 @Inject
-constructor(activeNotificationsInteractor: ActiveNotificationsInteractor) {
+constructor(
+    activeNotificationsInteractor: ActiveNotificationsInteractor,
+    dumpManager: DumpManager,
+) : FlowDumperImpl(dumpManager) {
     val content: Flow<PromotedNotificationContentModel?> =
         activeNotificationsInteractor.topLevelRepresentativeNotifications.map { notifs ->
             notifs.firstNotNullOfOrNull { it.promotedContent }
         }
+
+    val isPresent: Flow<Boolean> =
+        content
+            .map { (it != null) && (it.style != Style.Ineligible) }
+            .dumpWhileCollecting("isPresent")
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/shared/model/PromotedNotificationContentModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/shared/model/PromotedNotificationContentModel.kt
index af5a820..38d41e3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/shared/model/PromotedNotificationContentModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/shared/model/PromotedNotificationContentModel.kt
@@ -38,6 +38,7 @@
      */
     val wasPromotedAutomatically: Boolean,
     val smallIcon: ImageModel?,
+    val iconLevel: Int,
     val appName: CharSequence?,
     val subText: CharSequence?,
     val shortCriticalText: String?,
@@ -67,6 +68,7 @@
     class Builder(val key: String) {
         var wasPromotedAutomatically: Boolean = false
         var smallIcon: ImageModel? = null
+        var iconLevel: Int = 0
         var appName: CharSequence? = null
         var subText: CharSequence? = null
         var time: When? = null
@@ -94,6 +96,7 @@
                 identity = Identity(key, style),
                 wasPromotedAutomatically = wasPromotedAutomatically,
                 smallIcon = smallIcon,
+                iconLevel = iconLevel,
                 appName = appName,
                 subText = subText,
                 shortCriticalText = shortCriticalText,
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 a2d563a..d1d1ea9 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
@@ -47,6 +47,7 @@
 import android.os.SystemProperties;
 import android.os.Trace;
 import android.os.UserHandle;
+import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.util.FloatProperty;
 import android.util.IndentingPrintWriter;
@@ -81,6 +82,8 @@
 import com.android.internal.util.ContrastColorUtil;
 import com.android.internal.widget.CachingIconView;
 import com.android.internal.widget.CallLayout;
+import com.android.internal.widget.ConversationLayout;
+import com.android.internal.widget.MessagingLayout;
 import com.android.systemui.Flags;
 import com.android.systemui.flags.RefactorFlag;
 import com.android.systemui.plugins.FalsingManager;
@@ -97,6 +100,7 @@
 import com.android.systemui.statusbar.notification.ColorUpdateLogger;
 import com.android.systemui.statusbar.notification.FeedbackIcon;
 import com.android.systemui.statusbar.notification.LaunchAnimationParameters;
+import com.android.systemui.statusbar.notification.NmSummarizationUiFlag;
 import com.android.systemui.statusbar.notification.NotificationFadeAware;
 import com.android.systemui.statusbar.notification.NotificationTransitionAnimatorController;
 import com.android.systemui.statusbar.notification.NotificationUtils;
@@ -205,6 +209,7 @@
     private int mMaxSmallHeightBeforeN;
     private int mMaxSmallHeightBeforeP;
     private int mMaxSmallHeightBeforeS;
+    private int mMaxSmallHeightWithSummarization;
     private int mMaxSmallHeight;
     private int mMaxExpandedHeight;
     private int mMaxExpandedHeightForPromotedOngoing;
@@ -856,6 +861,8 @@
         int smallHeight;
 
         boolean isCallLayout = contractedView instanceof CallLayout;
+        boolean isMessagingLayout = contractedView instanceof MessagingLayout
+                || contractedView instanceof ConversationLayout;
 
         if (customView && beforeS && !mIsSummaryWithChildren) {
             if (beforeN) {
@@ -867,6 +874,10 @@
             }
         } else if (isCallLayout) {
             smallHeight = maxExpandedHeight;
+        } else if (NmSummarizationUiFlag.isEnabled()
+                && isMessagingLayout
+                && !TextUtils.isEmpty(mEntry.getRanking().getSummarization())) {
+            smallHeight = mMaxSmallHeightWithSummarization;
         } else {
             smallHeight = mMaxSmallHeight;
         }
@@ -2111,6 +2122,8 @@
             mMaxSmallHeight = NotificationUtils.getFontScaledHeight(mContext,
                     R.dimen.notification_min_height);
         }
+        mMaxSmallHeightWithSummarization = NotificationUtils.getFontScaledHeight(mContext,
+                com.android.internal.R.dimen.notification_collapsed_height_with_summarization);
         mMaxExpandedHeight = NotificationUtils.getFontScaledHeight(mContext,
                 R.dimen.notification_max_height);
         mMaxExpandedHeightForPromotedOngoing = NotificationUtils.getFontScaledHeight(mContext,
@@ -2727,6 +2740,11 @@
         invalidateOutline();
 
         mBackgroundNormal.setExpandAnimationSize(params.getWidth(), actualHeight);
+
+        if (Flags.notificationsLaunchRadius()) {
+            mBackgroundNormal.setRadius(params.getTopCornerRadius(),
+                    params.getBottomCornerRadius());
+        }
     }
 
     public void setExpandAnimationRunning(boolean expandAnimationRunning) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/MagicActionBackgroundDrawable.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/MagicActionBackgroundDrawable.kt
index 6aa5e40..7713580 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/MagicActionBackgroundDrawable.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/MagicActionBackgroundDrawable.kt
@@ -18,243 +18,126 @@
 
 import android.animation.ValueAnimator
 import android.content.Context
-import android.graphics.BlendMode
 import android.graphics.Canvas
-import android.graphics.Color
 import android.graphics.ColorFilter
-import android.graphics.LinearGradient
 import android.graphics.Paint
 import android.graphics.Path
 import android.graphics.PixelFormat
-import android.graphics.Rect
-import android.graphics.RuntimeShader
-import android.graphics.Shader
 import android.graphics.drawable.Drawable
-import android.widget.FrameLayout
-import androidx.compose.foundation.layout.size
-import androidx.compose.runtime.Composable
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.unit.dp
-import androidx.compose.ui.viewinterop.AndroidView
-import com.android.internal.graphics.ColorUtils
+import android.graphics.LinearGradient
+import android.graphics.Matrix
+import android.graphics.Rect
+import android.graphics.RectF
+import android.graphics.Shader
 import com.android.systemui.res.R
-import com.android.systemui.surfaceeffects.shaderutil.ShaderUtilLibrary
 import com.android.wm.shell.shared.animation.Interpolators
-import kotlin.math.min
 
-/**
- * A background style for smarter-smart-actions. The style is composed by a simplex3d noise,
- * overlaid with sparkles.
- */
 class MagicActionBackgroundDrawable(
     context: Context,
-    primaryContainer: Int? = null,
-    seed: Float = 0f,
 ) : Drawable() {
 
-    private val pixelDensity = context.resources.displayMetrics.density
-    private val cornerRadius =
-        context.resources.getDimensionPixelSize(R.dimen.smart_reply_button_corner_radius).toFloat()
-    private val outlineStrokeWidth =
-        context.resources
-            .getDimensionPixelSize(R.dimen.smart_action_button_outline_stroke_width)
-            .toFloat()
+    private val cornerRadius = context.resources.getDimension(R.dimen.magic_action_button_corner_radius)
+    private val outlineStrokeWidth = context.resources.getDimension(R.dimen.magic_action_button_outline_stroke_width)
+    private val insetVertical = 8 * context.resources.displayMetrics.density
+
     private val buttonShape = Path()
-    private val paddingVertical =
-        context.resources.getDimensionPixelSize(R.dimen.smart_action_button_icon_padding).toFloat()
-
-    /** The color of the button background. */
-    private val mainColor =
-        primaryContainer
-            ?: context.getColor(com.android.internal.R.color.materialColorPrimaryContainer)
-
-    /** Slightly brighter version of [mainColor] used on the simplex noise. */
-    private val effectColor: Int
-        get() {
-            val labColor = arrayOf(0.0, 0.0, 0.0).toDoubleArray()
-            ColorUtils.colorToLAB(mainColor, labColor)
-            val camColor = ColorUtils.colorToCAM(mainColor)
-            return ColorUtils.CAMToColor(
-                camColor.hue,
-                camColor.chroma,
-                min(100f, (labColor[0] + 10).toFloat()),
+    // Color and style
+    private val bgPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
+        val bgColor =
+            context.getColor(
+                com.android.internal.R.color.materialColorPrimaryContainer
             )
-        }
-
-    private val bgShader = MagicActionBackgroundShader()
-    private val bgPaint = Paint()
-    private val outlinePaint = Paint()
-    private val gradientAnimator =
-        ValueAnimator.ofFloat(0f, 1f).apply {
-            duration = 2500
-            interpolator = Interpolators.LINEAR
-            addUpdateListener { invalidateSelf() }
-        }
-    private val turbulenceAnimator =
-        ValueAnimator.ofFloat(seed, seed + TURBULENCE_MOVEMENT).apply {
-            duration = ANIMATION_DURATION
-            interpolator = Interpolators.LINEAR
-            addUpdateListener { invalidateSelf() }
-            start()
-        }
-    private val effectFadeAnimation =
-        ValueAnimator.ofFloat(0f, 1f).apply {
-            duration = 1000
-            startDelay = ANIMATION_DURATION - 1000L
-            interpolator = Interpolators.STANDARD_DECELERATE
-            addUpdateListener { invalidateSelf() }
-        }
+        color = bgColor
+        style = Paint.Style.FILL
+    }
+    private val outlinePaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
+        val outlineColor =
+            context.getColor(
+                com.android.internal.R.color.materialColorOutlineVariant
+            )
+        color = outlineColor
+        style = Paint.Style.STROKE
+        strokeWidth = outlineStrokeWidth
+    }
+    private val outlineStartColor =
+        context.getColor(
+            com.android.internal.R.color.materialColorTertiaryContainer
+        )
+    private val outlineMiddleColor =
+        context.getColor(
+            com.android.internal.R.color.materialColorPrimaryFixedDim
+        )
+    private val outlineEndColor =
+        context.getColor(
+            com.android.internal.R.color.materialColorPrimary
+        )
+    // Animation
+    private var gradientAnimator: ValueAnimator
+    private var rotationAngle = 20f // Start rotation at 20 degrees
 
     init {
-        bgShader.setColorUniform("in_color", mainColor)
-        bgShader.setColorUniform("in_effectColor", effectColor)
-        bgPaint.shader = bgShader
-        outlinePaint.style = Paint.Style.STROKE
-        // Stroke is doubled in width and then clipped, to avoid anti-aliasing artifacts at the edge
-        // of the rectangle.
-        outlinePaint.strokeWidth = outlineStrokeWidth * 2
-        outlinePaint.blendMode = BlendMode.SCREEN
-        outlinePaint.alpha = OUTLINE_ALPHA
-
-        animate()
-    }
-
-    private fun animate() {
-        turbulenceAnimator.start()
-        gradientAnimator.start()
-        effectFadeAnimation.start()
+        gradientAnimator = ValueAnimator.ofFloat(0f, 1f).apply {
+            duration = 5000 // 5 seconds
+            interpolator = Interpolators.LINEAR
+            repeatCount = 1
+            addUpdateListener { animator ->
+                val animatedValue = animator.animatedValue as Float
+                rotationAngle = 20f + animatedValue * 360f // Rotate in a spiral
+                invalidateSelf()
+            }
+            // TODO: Reset the outline color when animation ends.
+            start()
+        }
     }
 
     override fun draw(canvas: Canvas) {
-        updateShaders()
+        val boundsF = RectF(bounds)
+        boundsF.inset(0f, insetVertical)
+        buttonShape.reset()
+        buttonShape.addRoundRect(boundsF, cornerRadius, cornerRadius, Path.Direction.CW)
 
-        // We clip instead of drawing 2 rounded rects, otherwise there will be artifacts where
-        // around the button background and the outline.
         canvas.save()
+        // Draw background
         canvas.clipPath(buttonShape)
         canvas.drawPath(buttonShape, bgPaint)
+        // Apply gradient to outline
         canvas.drawPath(buttonShape, outlinePaint)
+        updateGradient(boundsF)
         canvas.restore()
     }
 
-    private fun updateShaders() {
-        val effectAlpha = 1f - effectFadeAnimation.animatedValue as Float
-        val turbulenceZ = turbulenceAnimator.animatedValue as Float
-        bgShader.setFloatUniform("in_sparkleMove", turbulenceZ * 1000)
-        bgShader.setFloatUniform("in_noiseMove", 0f, 0f, turbulenceZ)
-        bgShader.setFloatUniform("in_turbulenceAlpha", effectAlpha)
-        bgShader.setFloatUniform("in_spkarkleAlpha", SPARKLE_ALPHA * effectAlpha)
-        val gradientOffset = gradientAnimator.animatedValue as Float * bounds.width()
-        val outlineGradient =
-            LinearGradient(
-                gradientOffset + bounds.left.toFloat(),
-                0f,
-                gradientOffset + bounds.right.toFloat(),
-                0f,
-                mainColor,
-                ColorUtils.setAlphaComponent(mainColor, 0),
-                Shader.TileMode.MIRROR,
-            )
-        outlinePaint.shader = outlineGradient
+    private fun updateGradient(boundsF: RectF) {
+        val gradient = LinearGradient(
+            boundsF.left, boundsF.top,
+            boundsF.right, boundsF.bottom,
+            intArrayOf(outlineStartColor, outlineMiddleColor, outlineEndColor),
+            null,
+            Shader.TileMode.CLAMP
+        )
+        // Create a rotation matrix for the spiral effect
+        val matrix = Matrix()
+        matrix.setRotate(rotationAngle, boundsF.centerX(), boundsF.centerY())
+        gradient.setLocalMatrix(matrix)
+
+        outlinePaint.shader = gradient
     }
 
     override fun onBoundsChange(bounds: Rect) {
         super.onBoundsChange(bounds)
-
-        val width = bounds.width().toFloat()
-        val height = bounds.height().toFloat()
-        if (width == 0f || height == 0f) return
-
-        bgShader.setFloatUniform("in_gridNum", NOISE_SIZE)
-        bgShader.setFloatUniform("in_size", width, height)
-        bgShader.setFloatUniform("in_aspectRatio", width / height)
-        bgShader.setFloatUniform("in_pixelDensity", pixelDensity)
-
-        buttonShape.reset()
-        buttonShape.addRoundRect(
-            bounds.left.toFloat(),
-            bounds.top + paddingVertical,
-            bounds.right.toFloat(),
-            bounds.bottom - paddingVertical,
-            cornerRadius,
-            cornerRadius,
-            Path.Direction.CW,
-        )
+        invalidateSelf() // Redraw when size changes
     }
 
     override fun setAlpha(alpha: Int) {
         bgPaint.alpha = alpha
+        outlinePaint.alpha = alpha
         invalidateSelf()
     }
 
     override fun setColorFilter(colorFilter: ColorFilter?) {
         bgPaint.colorFilter = colorFilter
+        outlinePaint.colorFilter = colorFilter
         invalidateSelf()
     }
 
     override fun getOpacity(): Int = PixelFormat.TRANSLUCENT
-
-    companion object {
-        /** Smoothness of the turbulence. Larger numbers yield more detail. */
-        private const val NOISE_SIZE = 0.57f
-        /** Strength of the sparkles overlaid on the turbulence. */
-        private const val SPARKLE_ALPHA = 0.15f
-        /** Alpha (0..255) of the button outline */
-        private const val OUTLINE_ALPHA = 82
-        /** Turbulence grid size */
-        private const val TURBULENCE_MOVEMENT = 4.3f
-        /** Total animation duration in millis */
-        private const val ANIMATION_DURATION = 5000L
-    }
-}
-
-private class MagicActionBackgroundShader : RuntimeShader(SHADER) {
-
-    // language=AGSL
-    companion object {
-        private const val UNIFORMS =
-            """
-            uniform float in_gridNum;
-            uniform vec3 in_noiseMove;
-            uniform half in_sparkleMove;
-            uniform vec2 in_size;
-            uniform float in_aspectRatio;
-            uniform half in_pixelDensity;
-            uniform float in_turbulenceAlpha;
-            uniform float in_spkarkleAlpha;
-            layout(color) uniform vec4 in_color;
-            layout(color) uniform vec4 in_effectColor;
-        """
-        private const val MAIN_SHADER =
-            """vec4 main(vec2 p) {
-            vec2 uv = p / in_size.xy;
-            uv.x *= in_aspectRatio;
-            vec3 noiseP = vec3(uv + in_noiseMove.xy, in_noiseMove.z) * in_gridNum;
-            half luma = getLuminosity(half3(simplex3d(noiseP)));
-            half4 turbulenceColor = mix(in_color, in_effectColor, luma * in_turbulenceAlpha);
-            float sparkle = sparkles(p - mod(p, in_pixelDensity * 0.8), in_sparkleMove);
-            sparkle = min(sparkle * in_spkarkleAlpha, in_spkarkleAlpha);
-            return saturate(turbulenceColor + half4(sparkle));
-        }
-        """
-        private const val SHADER = UNIFORMS + ShaderUtilLibrary.SHADER_LIB + MAIN_SHADER
-    }
-}
-
-// @Preview
-@Composable
-fun DrawablePreview() {
-    AndroidView(
-        factory = { context ->
-            FrameLayout(context).apply {
-                background =
-                    MagicActionBackgroundDrawable(
-                        context = context,
-                        primaryContainer = Color.parseColor("#c5eae2"),
-                        seed = 0f,
-                    )
-            }
-        },
-        modifier = Modifier.size(100.dp, 50.dp),
-    )
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/MagicActionButton.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/MagicActionButton.kt
new file mode 100644
index 0000000..d735360
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/MagicActionButton.kt
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.notification.row
+
+import android.annotation.SuppressLint
+import android.content.Context
+import android.util.AttributeSet
+import android.widget.Button
+
+/**
+ * Custom Button for Magic Action Button, which includes the custom background and foreground.
+ */
+@SuppressLint("AppCompatCustomView")
+class MagicActionButton @JvmOverloads constructor(
+    context: Context,
+    attrs: AttributeSet? = null,
+    defStyleAttr: Int = 0,
+) : Button(context, attrs, defStyleAttr) {
+    init {
+        background = MagicActionBackgroundDrawable(context)
+    }
+}
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 73e8246..e311b53 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
@@ -55,6 +55,7 @@
 import com.android.systemui.statusbar.NotificationRemoteInputManager;
 import com.android.systemui.statusbar.notification.ConversationNotificationProcessor;
 import com.android.systemui.statusbar.notification.InflationException;
+import com.android.systemui.statusbar.notification.NmSummarizationUiFlag;
 import com.android.systemui.statusbar.notification.collection.NotificationEntry;
 import com.android.systemui.statusbar.notification.promoted.PromotedNotificationContentExtractor;
 import com.android.systemui.statusbar.notification.promoted.PromotedNotificationUiForceExpanded;
@@ -201,13 +202,13 @@
                 mNotifLayoutInflaterFactoryProvider,
                 mHeadsUpStyleProvider,
                 mLogger);
-
         result = inflateSmartReplyViews(result, reInflateFlags, entry, row.getContext(),
                 packageContext, row.getExistingSmartReplyState(), smartRepliesInflater, mLogger);
         boolean isConversation = entry.getRanking().isConversation();
         Notification.MessagingStyle messagingStyle = null;
-        if (isConversation && (AsyncHybridViewInflation.isEnabled()
-                || LockscreenOtpRedaction.isSingleLineViewEnabled())) {
+        if (NmSummarizationUiFlag.isEnabled()
+                || (isConversation && (AsyncHybridViewInflation.isEnabled()
+                || LockscreenOtpRedaction.isSingleLineViewEnabled()))) {
             messagingStyle = mConversationProcessor
                     .processNotification(entry, builder, mLogger);
         }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java
index 430e5e4..6e638f5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java
@@ -18,22 +18,13 @@
 import static android.app.AppOpsManager.OP_CAMERA;
 import static android.app.AppOpsManager.OP_RECORD_AUDIO;
 import static android.app.AppOpsManager.OP_SYSTEM_ALERT_WINDOW;
-import static android.service.notification.Adjustment.KEY_SUMMARIZATION;
-import static android.service.notification.Adjustment.KEY_TYPE;
-import static android.service.notification.NotificationAssistantService.ACTION_NOTIFICATION_ASSISTANT_FEEDBACK_SETTINGS;
-import static android.service.notification.NotificationAssistantService.EXTRA_NOTIFICATION_ADJUSTMENT;
-import static android.service.notification.NotificationAssistantService.EXTRA_NOTIFICATION_KEY;
 
-import android.annotation.FlaggedApi;
 import android.app.INotificationManager;
 import android.app.NotificationChannel;
-import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
-import android.content.pm.ActivityInfo;
 import android.content.pm.LauncherApps;
 import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
 import android.content.pm.ShortcutManager;
 import android.net.Uri;
 import android.os.Bundle;
@@ -41,7 +32,6 @@
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.provider.Settings;
-import android.service.notification.NotificationAssistantService;
 import android.service.notification.StatusBarNotification;
 import android.util.ArraySet;
 import android.util.IconDrawableFactory;
@@ -81,13 +71,14 @@
 import com.android.systemui.statusbar.notification.collection.render.NotifGutsViewListener;
 import com.android.systemui.statusbar.notification.collection.render.NotifGutsViewManager;
 import com.android.systemui.statusbar.notification.headsup.HeadsUpManager;
+import com.android.systemui.statusbar.notification.row.icon.AppIconProvider;
+import com.android.systemui.statusbar.notification.row.icon.NotificationIconStyleProvider;
 import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
 import com.android.systemui.statusbar.phone.CentralSurfaces;
 import com.android.systemui.statusbar.policy.DeviceProvisionedController;
 import com.android.systemui.util.kotlin.JavaAdapter;
 import com.android.systemui.wmshell.BubblesManager;
 
-import java.util.List;
 import java.util.Optional;
 
 import javax.inject.Inject;
@@ -131,6 +122,8 @@
     private final Optional<BubblesManager> mBubblesManagerOptional;
     private Runnable mOpenRunnable;
     private final INotificationManager mNotificationManager;
+    private final AppIconProvider mAppIconProvider;
+    private final NotificationIconStyleProvider mIconStyleProvider;
     private final PeopleSpaceWidgetManager mPeopleSpaceWidgetManager;
 
     private final UserManager mUserManager;
@@ -154,6 +147,8 @@
             AccessibilityManager accessibilityManager,
             HighPriorityProvider highPriorityProvider,
             INotificationManager notificationManager,
+            AppIconProvider appIconProvider,
+            NotificationIconStyleProvider iconStyleProvider,
             UserManager userManager,
             PeopleSpaceWidgetManager peopleSpaceWidgetManager,
             LauncherApps launcherApps,
@@ -180,6 +175,8 @@
         mAccessibilityManager = accessibilityManager;
         mHighPriorityProvider = highPriorityProvider;
         mNotificationManager = notificationManager;
+        mAppIconProvider = appIconProvider;
+        mIconStyleProvider = iconStyleProvider;
         mUserManager = userManager;
         mPeopleSpaceWidgetManager = peopleSpaceWidgetManager;
         mLauncherApps = launcherApps;
@@ -427,6 +424,8 @@
         notificationInfoView.bindNotification(
                 pmUser,
                 mNotificationManager,
+                mAppIconProvider,
+                mIconStyleProvider,
                 mOnUserInteractionCallback,
                 mChannelEditorDialogController,
                 packageName,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java
index 49b682d..6611225 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java
@@ -16,6 +16,7 @@
 
 package com.android.systemui.statusbar.notification.row;
 
+import static android.app.Flags.notificationsRedesignThemedAppIcons;
 import static android.app.Notification.EXTRA_BUILDER_APPLICATION_INFO;
 import static android.app.NotificationChannel.SYSTEM_RESERVED_IDS;
 import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
@@ -25,11 +26,13 @@
 import static android.service.notification.Adjustment.KEY_TYPE;
 
 import static com.android.app.animation.Interpolators.FAST_OUT_SLOW_IN;
+import static com.android.systemui.Flags.notificationsRedesignGuts;
 
 import static java.lang.annotation.RetentionPolicy.SOURCE;
 
 import android.annotation.IntDef;
 import android.annotation.Nullable;
+import android.annotation.SuppressLint;
 import android.app.Flags;
 import android.app.INotificationManager;
 import android.app.Notification;
@@ -70,8 +73,9 @@
 import com.android.systemui.Dependency;
 import com.android.systemui.res.R;
 import com.android.systemui.statusbar.notification.AssistantFeedbackController;
-import com.android.systemui.statusbar.notification.NmSummarizationUiFlag;
 import com.android.systemui.statusbar.notification.collection.NotificationEntry;
+import com.android.systemui.statusbar.notification.row.icon.AppIconProvider;
+import com.android.systemui.statusbar.notification.row.icon.NotificationIconStyleProvider;
 
 import java.lang.annotation.Retention;
 import java.util.List;
@@ -88,6 +92,8 @@
     private TextView mAutomaticDescriptionView;
 
     private INotificationManager mINotificationManager;
+    private AppIconProvider mAppIconProvider;
+    private NotificationIconStyleProvider mIconStyleProvider;
     private OnUserInteractionCallback mOnUserInteractionCallback;
     private PackageManager mPm;
     private MetricsLogger mMetricsLogger;
@@ -183,6 +189,8 @@
     public void bindNotification(
             PackageManager pm,
             INotificationManager iNotificationManager,
+            AppIconProvider appIconProvider,
+            NotificationIconStyleProvider iconStyleProvider,
             OnUserInteractionCallback onUserInteractionCallback,
             ChannelEditorDialogController channelEditorDialogController,
             String pkg,
@@ -200,6 +208,8 @@
             OnClickListener onCloseClick)
             throws RemoteException {
         mINotificationManager = iNotificationManager;
+        mAppIconProvider = appIconProvider;
+        mIconStyleProvider = iconStyleProvider;
         mMetricsLogger = metricsLogger;
         mOnUserInteractionCallback = onUserInteractionCallback;
         mChannelEditorDialogController = channelEditorDialogController;
@@ -290,23 +300,39 @@
         applyAlertingBehavior(behavior, false /* userTriggered */);
     }
 
+    @SuppressLint("WrongThread")
     private void bindHeader() {
-        // Package name
         mPkgIcon = null;
         // filled in if missing during notification inflation, which must have happened if
         // we have a notification to long press on
         ApplicationInfo info =
                 mSbn.getNotification().extras.getParcelable(EXTRA_BUILDER_APPLICATION_INFO,
                         ApplicationInfo.class);
-        if (info != null) {
-            try {
-                mAppName = String.valueOf(mPm.getApplicationLabel(info));
-                mPkgIcon = mPm.getApplicationIcon(info);
-            } catch (Exception ignored) {}
-        }
-        if (mPkgIcon == null) {
-            // app is gone, just show package name and generic icon
-            mPkgIcon = mPm.getDefaultActivityIcon();
+        if (notificationsRedesignGuts()) {
+            if (info != null) {
+                try {
+                    mAppName = String.valueOf(mPm.getApplicationLabel(info));
+                    // The app icon is likely already in the cache, so let's use it
+                    boolean withWorkProfileBadge =
+                            mIconStyleProvider.shouldShowWorkProfileBadge(mSbn, getContext());
+                    mPkgIcon = mAppIconProvider.getOrFetchAppIcon(info.packageName, getContext(),
+                            withWorkProfileBadge,
+                            /* themed = */ notificationsRedesignThemedAppIcons());
+                } catch (Exception ignored) {
+                }
+            }
+        } else {
+            if (info != null) {
+                try {
+                    mAppName = String.valueOf(mPm.getApplicationLabel(info));
+                    mPkgIcon = mPm.getApplicationIcon(info);
+                } catch (Exception ignored) {
+                }
+            }
+            if (mPkgIcon == null) {
+                // app is gone, just show package name and generic icon
+                mPkgIcon = mPm.getDefaultActivityIcon();
+            }
         }
         ((ImageView) findViewById(R.id.pkg_icon)).setImageDrawable(mPkgIcon);
         ((TextView) findViewById(R.id.pkg_name)).setText(mAppName);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImpl.kt
index 589e5b8..517fc3a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImpl.kt
@@ -48,6 +48,7 @@
 import com.android.systemui.statusbar.NotificationRemoteInputManager
 import com.android.systemui.statusbar.notification.ConversationNotificationProcessor
 import com.android.systemui.statusbar.notification.InflationException
+import com.android.systemui.statusbar.notification.NmSummarizationUiFlag
 import com.android.systemui.statusbar.notification.collection.NotificationEntry
 import com.android.systemui.statusbar.notification.promoted.PromotedNotificationContentExtractor
 import com.android.systemui.statusbar.notification.promoted.shared.model.PromotedNotificationContentModel
@@ -700,7 +701,7 @@
 
             // process conversations and extract the messaging style
             val messagingStyle =
-                if (entry.ranking.isConversation) {
+                if (NmSummarizationUiFlag.isEnabled || entry.ranking.isConversation) {
                     conversationProcessor.processNotification(entry, builder, logger)
                 } else null
 
@@ -730,9 +731,8 @@
                         builder = builder,
                         systemUiContext = systemUiContext,
                         redactText = false,
-                        summarization = entry.sbn.notification.extras.getCharSequence(
-                            EXTRA_SUMMARIZED_CONTENT,
-                        )
+                        summarization =
+                            entry.sbn.notification.extras.getCharSequence(EXTRA_SUMMARIZED_CONTENT),
                     )
                 } else null
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PromotedNotificationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PromotedNotificationInfo.java
index 93b2a2d..6ff711d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PromotedNotificationInfo.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PromotedNotificationInfo.java
@@ -31,6 +31,8 @@
 import com.android.systemui.res.R;
 import com.android.systemui.statusbar.notification.AssistantFeedbackController;
 import com.android.systemui.statusbar.notification.collection.NotificationEntry;
+import com.android.systemui.statusbar.notification.row.icon.AppIconProvider;
+import com.android.systemui.statusbar.notification.row.icon.NotificationIconStyleProvider;
 
 /**
  * The guts of a notification revealed when performing a long press, specifically
@@ -40,6 +42,7 @@
 public class PromotedNotificationInfo extends NotificationInfo {
     private static final String TAG = "PromotedNotifInfoGuts";
     private INotificationManager mNotificationManager;
+    private NotificationGuts mGutsContainer;
 
     public PromotedNotificationInfo(Context context, AttributeSet attrs) {
         super(context, attrs);
@@ -49,6 +52,8 @@
     public void bindNotification(
             PackageManager pm,
             INotificationManager iNotificationManager,
+            AppIconProvider appIconProvider,
+            NotificationIconStyleProvider iconStyleProvider,
             OnUserInteractionCallback onUserInteractionCallback,
             ChannelEditorDialogController channelEditorDialogController,
             String pkg,
@@ -63,40 +68,35 @@
             boolean wasShownHighPriority,
             AssistantFeedbackController assistantFeedbackController,
             MetricsLogger metricsLogger, OnClickListener onCloseClick) throws RemoteException {
-        super.bindNotification(pm, iNotificationManager, onUserInteractionCallback,
-                channelEditorDialogController, pkg, notificationChannel, entry, onSettingsClick,
-                onAppSettingsClick, feedbackClickListener, uiEventLogger, isDeviceProvisioned,
-                isNonblockable, wasShownHighPriority, assistantFeedbackController, metricsLogger,
-                onCloseClick);
+        super.bindNotification(pm, iNotificationManager, appIconProvider, iconStyleProvider,
+                onUserInteractionCallback, channelEditorDialogController, pkg, notificationChannel,
+                entry, onSettingsClick, onAppSettingsClick, feedbackClickListener, uiEventLogger,
+                isDeviceProvisioned, isNonblockable, wasShownHighPriority,
+                assistantFeedbackController, metricsLogger, onCloseClick);
 
         mNotificationManager = iNotificationManager;
 
-        bindDismiss(entry.getSbn(), onCloseClick);
         bindDemote(entry.getSbn(), pkg);
     }
 
-
-    protected void bindDismiss(StatusBarNotification sbn,
-            View.OnClickListener onCloseClick) {
-        View dismissButton = findViewById(R.id.promoted_dismiss);
-
-        dismissButton.setOnClickListener(onCloseClick);
-        dismissButton.setVisibility(!sbn.isNonDismissable()
-                && dismissButton.hasOnClickListeners() ? VISIBLE : GONE);
-
-    }
-
     protected void bindDemote(StatusBarNotification sbn, String packageName) {
         View demoteButton = findViewById(R.id.promoted_demote);
         demoteButton.setOnClickListener(getDemoteClickListener(sbn, packageName));
         demoteButton.setVisibility(demoteButton.hasOnClickListeners() ? VISIBLE : GONE);
     }
 
+    @Override
+    public void setGutsParent(NotificationGuts guts) {
+        mGutsContainer = guts;
+        super.setGutsParent(guts);
+    }
+
     private OnClickListener getDemoteClickListener(StatusBarNotification sbn, String packageName) {
-        return ((View unusedView) -> {
+        return ((View v) -> {
             try {
                 // TODO(b/391661009): Signal AutomaticPromotionCoordinator here
                 mNotificationManager.setCanBePromoted(packageName, sbn.getUid(), false, true);
+                mGutsContainer.closeControls(v, true);
             } catch (RemoteException e) {
                 Log.e(TAG, "Couldn't revoke live update permission", e);
             }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/AppIconProvider.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/AppIconProvider.kt
index 52a0f6f..33d9433 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/AppIconProvider.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/AppIconProvider.kt
@@ -58,7 +58,7 @@
         packageName: String,
         context: Context,
         withWorkProfileBadge: Boolean = false,
-        themed: Boolean = true,
+        themed: Boolean = false,
     ): Drawable
 
     /**
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java
index e9eecdd8..e8affaa 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java
@@ -31,6 +31,7 @@
 import android.view.animation.Interpolator;
 import android.view.animation.PathInterpolator;
 import android.widget.DateTimeView;
+import android.widget.FrameLayout;
 import android.widget.ImageButton;
 import android.widget.ImageView;
 import android.widget.TextView;
@@ -41,6 +42,7 @@
 import com.android.internal.widget.CachingIconView;
 import com.android.internal.widget.NotificationCloseButton;
 import com.android.internal.widget.NotificationExpandButton;
+import com.android.systemui.Flags;
 import com.android.systemui.res.R;
 import com.android.systemui.statusbar.TransformableView;
 import com.android.systemui.statusbar.ViewTransformationHelper;
@@ -67,6 +69,7 @@
     private CachingIconView mIcon;
     private NotificationCloseButton mCloseButton;
     private NotificationExpandButton mExpandButton;
+    private FrameLayout mExpandButtonSpacer;
     private View mAltExpandTarget;
     private View mIconContainer;
     protected NotificationHeaderView mNotificationHeader;
@@ -154,6 +157,10 @@
         mHeaderText = mView.findViewById(com.android.internal.R.id.header_text);
         mAppNameText = mView.findViewById(com.android.internal.R.id.app_name_text);
         mExpandButton = mView.findViewById(com.android.internal.R.id.expand_button);
+        if (Flags.uiRichOngoingForceExpanded()) {
+            mExpandButtonSpacer =
+                    mView.findViewById(com.android.internal.R.id.expand_button_spacer);
+        }
         mAltExpandTarget = mView.findViewById(com.android.internal.R.id.alternate_expand_target);
         mIconContainer = mView.findViewById(com.android.internal.R.id.conversation_icon_container);
         mWorkProfileImage = mView.findViewById(com.android.internal.R.id.profile_badge);
@@ -295,6 +302,9 @@
             boolean expandable,
             View.OnClickListener onClickListener,
             boolean requestLayout) {
+        if (Flags.uiRichOngoingForceExpanded() && mExpandButtonSpacer != null) {
+            mExpandButtonSpacer.setVisibility(expandable ? GONE : VISIBLE);
+        }
         mExpandButton.setVisibility(expandable ? VISIBLE : GONE);
         mExpandButton.setOnClickListener(expandable ? onClickListener : null);
         if (mAltExpandTarget != null) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/MagneticNotificationRowManagerImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/MagneticNotificationRowManagerImpl.kt
index 5a29a69..a507c4c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/MagneticNotificationRowManagerImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/MagneticNotificationRowManagerImpl.kt
@@ -190,7 +190,8 @@
         currentMagneticListeners.forEachIndexed { i, target ->
             target?.let {
                 if (i != currentMagneticListeners.size / 2) {
-                    snapBack(it, velocity)
+                    val velocityMultiplier = MAGNETIC_TRANSLATION_MULTIPLIERS[i]
+                    snapBack(it, velocity?.times(velocityMultiplier))
                 }
             }
         }
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 42d02e1..b9352bf 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
@@ -52,6 +52,9 @@
 import android.graphics.Paint;
 import android.graphics.Path;
 import android.graphics.Rect;
+import android.graphics.RenderEffect;
+import android.graphics.RenderNode;
+import android.graphics.Shader;
 import android.os.Bundle;
 import android.os.SystemClock;
 import android.os.Trace;
@@ -513,6 +516,13 @@
     /** The clip path defining where we are NOT allowed to draw. */
     private final Path mNegativeRoundedClipPath = new Path();
 
+    /** RenderNode to blur notifications which will be reused (redrawn) whenever NSSL is drawn. */
+    private final RenderNode mBlurNode = new RenderNode("BlurNode");
+
+    /** Radius of the blur effect applied to the content of the NSSL. */
+    private float mBlurRadius = 0f;
+    @Nullable private RenderEffect mBlurEffect = null;
+
     /**
      * The clip Path used to clip the launching notification. This may be different
      * from the normal path, as the views launch animation could start clipped.
@@ -896,6 +906,7 @@
         mOverflingDistance = configuration.getScaledOverflingDistance();
 
         Resources res = context.getResources();
+        mSwipeHelper.updateResourceProperties(res);
         final boolean isSmallScreenLandscape = res.getBoolean(R.bool.is_small_screen_landscape);
         boolean useSmallLandscapeLockscreenResources = mIsSmallLandscapeLockscreenEnabled
                 && isSmallScreenLandscape;
@@ -2073,8 +2084,6 @@
         Resources res = getResources();
         updateSplitNotificationShade();
         mStatusBarHeight = SystemBarUtils.getStatusBarHeight(mContext);
-        float densityScale = res.getDisplayMetrics().density;
-        mSwipeHelper.setDensityScale(densityScale);
         float pagingTouchSlop = ViewConfiguration.get(getContext()).getScaledPagingTouchSlop();
         mSwipeHelper.setPagingTouchSlop(pagingTouchSlop);
         reinitView();
@@ -5974,6 +5983,24 @@
         invalidate();
     }
 
+    @Override
+    public void setBlurRadius(float blurRadius) {
+        if (mBlurRadius != blurRadius) {
+            mBlurRadius = blurRadius;
+            updateBlurEffect();
+            invalidate();
+        }
+    }
+
+    private void updateBlurEffect() {
+        if (mBlurRadius > 0) {
+            mBlurEffect =
+                    RenderEffect.createBlurEffect(mBlurRadius, mBlurRadius, Shader.TileMode.CLAMP);
+        } else {
+            mBlurEffect = null;
+        }
+    }
+
     /**
      * Set rounded rect clipping bounds on this view.
      */
@@ -6144,26 +6171,64 @@
 
     @Override
     protected void dispatchDraw(@NonNull Canvas canvas) {
-        if (!mLaunchingNotification) {
-            // When launching notifications, we're clipping the children individually instead of in
-            // dispatchDraw
-            if (mShouldUseRoundedRectClipping) {
-                // Let's clip rounded.
-                canvas.clipPath(mRoundedClipPath);
+        if (mBlurEffect != null) {
+            // reuse the cached RenderNode to blur
+            mBlurNode.setPosition(0, 0, canvas.getWidth(), canvas.getHeight());
+            mBlurNode.setRenderEffect(mBlurEffect);
+            Canvas blurCanvas = mBlurNode.beginRecording();
+            // draw all the children (except HUNs) on the blurred canvas
+            super.dispatchDraw(blurCanvas);
+            mBlurNode.endRecording();
+            // apply clipping to the canvas
+            int saveCount = canvas.save();
+            applyClipToCanvas(canvas);
+            // draw the blurred content to the clipped canvas
+            canvas.drawRenderNode(mBlurNode);
+            // restore the canvas, so it doesn't clip anymore
+            canvas.restoreToCount(saveCount);
+            // draw the children that were left out during the dispatchDraw phase
+            for (int i = 0; i < getChildCount(); i++) {
+                // TODO(b/388469101) draw these children in z-order
+                ExpandableView child = getChildAtIndex(i);
+                if (shouldSkipBlurForChild(child)) {
+                    super.drawChild(canvas, child, getDrawingTime());
+                }
             }
-            if (mShouldUseNegativeRoundedRectClipping) {
-                // subtract the negative path if it is defined
-                canvas.clipOutPath(mNegativeRoundedClipPath);
+        } else {
+            if (!mLaunchingNotification) {
+                // When launching notifications, we're clipping the children individually instead
+                //  of in dispatchDraw
+                applyClipToCanvas(canvas);
             }
+            super.dispatchDraw(canvas);
         }
-        super.dispatchDraw(canvas);
+    }
+
+    private void applyClipToCanvas(Canvas canvas) {
+        if (mShouldUseRoundedRectClipping) {
+            // clip by the positive path if it is defined
+            canvas.clipPath(mRoundedClipPath);
+        }
+        if (mShouldUseNegativeRoundedRectClipping) {
+            // subtract the negative path if it is defined
+            canvas.clipOutPath(mNegativeRoundedClipPath);
+        }
     }
 
     @Override
     protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
         boolean shouldUseClipping =
                 mShouldUseRoundedRectClipping || mShouldUseNegativeRoundedRectClipping;
-        if (mLaunchingNotification && shouldUseClipping) {
+        if (mBlurEffect != null) {
+            if (shouldSkipBlurForChild(child)) {
+                // skip drawing this child during the regular dispatchDraw pass
+                return false;
+            } else {
+                // draw the child as if nothing happened, non-blurred elements shouldn't be
+                // affected by clipping either
+                return super.drawChild(canvas, child, drawingTime);
+            }
+        } else if (mLaunchingNotification && shouldUseClipping) {
             // Let's clip children individually during notification launch
             canvas.save();
             ExpandableView expandableView = (ExpandableView) child;
@@ -6194,6 +6259,14 @@
         }
     }
 
+    private boolean shouldSkipBlurForChild(View child) {
+        if (child instanceof ExpandableView row) {
+            return row.isHeadsUpState();
+        } else {
+            return false;
+        }
+    }
+
     /**
      * Calculate the total translation needed when dismissing.
      */
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 810d0b4..888c8cc 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
@@ -382,9 +382,15 @@
 
             // Only animate if in a non-sensitive state (not screen sharing)
             boolean shouldAnimate = animate && !isSensitiveContentProtectionActive;
+            mLogger.logUpdateSensitivenessWithAnimation(shouldAnimate,
+                    isSensitive,
+                    isSensitiveContentProtectionActive,
+                    isAnyProfilePublic);
             mView.updateSensitiveness(shouldAnimate, isSensitive);
         } else {
-            mView.updateSensitiveness(animate, mLockscreenUserManager.isAnyProfilePublicMode());
+            boolean anyProfilePublicMode = mLockscreenUserManager.isAnyProfilePublicMode();
+            mLogger.logUpdateSensitivenessWithAnimation(animate, anyProfilePublicMode);
+            mView.updateSensitiveness(animate, anyProfilePublicMode);
         }
         Trace.endSection();
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLogger.kt
index 3396306..30658710 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLogger.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLogger.kt
@@ -156,6 +156,44 @@
                 { "removeTransientRow from NSSL: childKey: $str1" }
         )
     }
+
+    fun logUpdateSensitivenessWithAnimation(
+        shouldAnimate: Boolean,
+        isSensitive: Boolean,
+        isSensitiveContentProtectionActive: Boolean,
+        isAnyProfilePublic: Boolean,
+    ) {
+        notificationRenderBuffer.log(
+            TAG,
+            INFO,
+            {
+                bool1 = shouldAnimate
+                bool2 = isSensitive
+                bool3 = isSensitiveContentProtectionActive
+                bool4 = isAnyProfilePublic
+            },
+            {
+                "updateSensitivenessWithAnimation from NSSL: shouldAnimate=$bool1 " +
+                        "isSensitive(hideSensitive)=$bool2 isSensitiveContentProtectionActive=$bool3 " +
+                        "isAnyProfilePublic=$bool4"
+            },
+        )
+    }
+
+    fun logUpdateSensitivenessWithAnimation(animate: Boolean, anyProfilePublicMode: Boolean) {
+        notificationRenderBuffer.log(
+            TAG,
+            INFO,
+            {
+                bool1 = animate
+                bool2 = anyProfilePublicMode
+            },
+            {
+                "updateSensitivenessWithAnimation from NSSL: animate=$bool1 " +
+                        "anyProfilePublicMode(hideSensitive)=$bool2"
+            },
+        )
+    }
 }
 
-private const val TAG = "NotificationStackScroll"
\ No newline at end of file
+private const val TAG = "NotificationStackScroll"
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java
index 6f4047f..c5a846e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java
@@ -534,12 +534,6 @@
     }
 
     @Override
-    public void setDensityScale(float densityScale) {
-        super.setDensityScale(densityScale);
-        mCallback.onDensityScaleChange(densityScale);
-    }
-
-    @Override
     public void resetTouchState() {
         super.resetTouchState();
         mCallback.resetMagneticStates();
@@ -565,8 +559,6 @@
          */
         float getTotalTranslationLength(View animView);
 
-        void onDensityScaleChange(float density);
-
         boolean handleSwipeableViewTranslation(SwipeableView view, float translate);
 
         // Reset any ongoing magnetic interactions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/view/NotificationScrollView.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/view/NotificationScrollView.kt
index 5fec096..a7305f7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/view/NotificationScrollView.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/view/NotificationScrollView.kt
@@ -58,6 +58,13 @@
      */
     fun setNegativeClippingShape(shape: ShadeScrimShape?)
 
+    /**
+     * Sets a blur effect on the view. A radius of 0 means no blur.
+     *
+     * @param radius blur radius in pixels
+     */
+    fun setBlurRadius(radius: Float)
+
     /** set the y position in px of the top of the stack in this view's coordinates */
     fun setStackTop(stackTop: Float)
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationScrollViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationScrollViewBinder.kt
index 43a552b..a4e39cb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationScrollViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationScrollViewBinder.kt
@@ -94,6 +94,7 @@
                 }
             }
             launch { viewModel.qsExpandFraction.collectTraced { view.setQsExpandFraction(it) } }
+            launch { viewModel.blurRadius(maxBlurRadius).collect(view::setBlurRadius) }
             launch {
                 viewModel.isShowingStackOnLockscreen.collectTraced {
                     view.setShowingStackOnLockscreen(it)
@@ -146,6 +147,10 @@
             }
         }
 
+    /** blur radius to be applied when the QS panel is fully expanded */
+    private val maxBlurRadius: Flow<Int> =
+        configuration.getDimensionPixelSize(R.dimen.max_shade_content_blur_radius)
+
     /** 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/viewmodel/NotificationScrollViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationScrollViewModel.kt
index 7f016a1..08d98a1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationScrollViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationScrollViewModel.kt
@@ -15,6 +15,8 @@
  *
  */
 
+@file:OptIn(ExperimentalCoroutinesApi::class)
+
 package com.android.systemui.statusbar.notification.stack.ui.viewmodel
 
 import com.android.compose.animation.scene.ContentKey
@@ -46,11 +48,14 @@
 import dagger.Lazy
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
+import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.combineTransform
 import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.flatMapLatest
 import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.mapNotNull
@@ -193,6 +198,37 @@
     val qsExpandFraction: Flow<Float> =
         shadeInteractor.qsExpansion.dumpWhileCollecting("qsExpandFraction")
 
+    /** Blur radius to be applied to Notifications. */
+    fun blurRadius(maxBlurRadius: Flow<Int>) =
+        combine(blurFraction, maxBlurRadius) { fraction, maxRadius -> fraction * maxRadius }
+
+    /**
+     * Scale of the blur effect that should be applied to Notifications.
+     *
+     * 0 -> don't blur (default, removes all blur render effects) 1 -> do the full blur (apply a
+     * render effect with the max blur radius)
+     */
+    private val blurFraction: Flow<Float> =
+        if (SceneContainerFlag.isEnabled) {
+            shadeModeInteractor.shadeMode.flatMapLatest { shadeMode ->
+                when (shadeMode) {
+                    ShadeMode.Dual ->
+                        combineTransform(
+                            shadeInteractor.shadeExpansion,
+                            shadeInteractor.qsExpansion,
+                        ) { notificationShadeExpansion, qsExpansion ->
+                            if (notificationShadeExpansion == 0f) {
+                                // Blur out notifications as the QS overlay panel expands
+                                emit(qsExpansion)
+                            }
+                        }
+                    else -> flowOf(0f)
+                }
+            }
+        } else {
+            flowOf(0f)
+        }
+
     /** Whether we should close any open notification guts. */
     val shouldCloseGuts: Flow<Boolean> = stackAppearanceInteractor.shouldCloseGuts
 
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 54efa4a..2c8c7a1 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
@@ -48,6 +48,7 @@
 import com.android.systemui.keyguard.ui.viewmodel.AodToLockscreenTransitionViewModel
 import com.android.systemui.keyguard.ui.viewmodel.AodToOccludedTransitionViewModel
 import com.android.systemui.keyguard.ui.viewmodel.AodToPrimaryBouncerTransitionViewModel
+import com.android.systemui.keyguard.ui.viewmodel.DozingToDreamingTransitionViewModel
 import com.android.systemui.keyguard.ui.viewmodel.DozingToGlanceableHubTransitionViewModel
 import com.android.systemui.keyguard.ui.viewmodel.DozingToLockscreenTransitionViewModel
 import com.android.systemui.keyguard.ui.viewmodel.DozingToOccludedTransitionViewModel
@@ -136,6 +137,7 @@
     private val aodToLockscreenTransitionViewModel: AodToLockscreenTransitionViewModel,
     private val aodToOccludedTransitionViewModel: AodToOccludedTransitionViewModel,
     private val aodToPrimaryBouncerTransitionViewModel: AodToPrimaryBouncerTransitionViewModel,
+    private val dozingToDreamingTransitionViewModel: DozingToDreamingTransitionViewModel,
     dozingToGlanceableHubTransitionViewModel: DozingToGlanceableHubTransitionViewModel,
     private val dozingToLockscreenTransitionViewModel: DozingToLockscreenTransitionViewModel,
     private val dozingToOccludedTransitionViewModel: DozingToOccludedTransitionViewModel,
@@ -572,6 +574,7 @@
             aodToLockscreenTransitionViewModel.notificationAlpha,
             aodToOccludedTransitionViewModel.lockscreenAlpha(viewState),
             aodToPrimaryBouncerTransitionViewModel.notificationAlpha,
+            dozingToDreamingTransitionViewModel.notificationAlpha,
             dozingToLockscreenTransitionViewModel.lockscreenAlpha,
             dozingToOccludedTransitionViewModel.lockscreenAlpha(viewState),
             dozingToPrimaryBouncerTransitionViewModel.notificationAlpha,
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 04dedb6..9aa4c54 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
@@ -275,7 +275,8 @@
             DozeScrimController dozeScrimController,
             KeyguardViewMediator keyguardViewMediator,
             NotificationShadeWindowController notificationShadeWindowController,
-            KeyguardStateController keyguardStateController, Handler handler,
+            KeyguardStateController keyguardStateController,
+            @Main Handler handler,
             KeyguardUpdateMonitor keyguardUpdateMonitor,
             @Main Resources resources,
             KeyguardBypassController keyguardBypassController,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
index 58326db..fa4fe46 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
@@ -47,6 +47,7 @@
 import com.android.systemui.battery.BatteryMeterView;
 import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver;
 import com.android.systemui.res.R;
+import com.android.systemui.statusbar.core.NewStatusBarIcons;
 import com.android.systemui.statusbar.layout.StatusBarContentInsetsProvider;
 import com.android.systemui.statusbar.phone.SysuiDarkIconDispatcher.DarkChange;
 import com.android.systemui.statusbar.phone.ui.TintedIconManager;
@@ -79,7 +80,7 @@
 
     private TextView mCarrierLabel;
     private ImageView mMultiUserAvatar;
-    private BatteryMeterView mBatteryView;
+    @Nullable private BatteryMeterView mBatteryView;
     private StatusIconContainer mStatusIconContainer;
     private StatusBarUserSwitcherContainer mUserSwitcherContainer;
 
@@ -131,6 +132,11 @@
         mMultiUserAvatar = findViewById(R.id.multi_user_avatar);
         mCarrierLabel = findViewById(R.id.keyguard_carrier_text);
         mBatteryView = mSystemIconsContainer.findViewById(R.id.battery);
+        if (NewStatusBarIcons.isEnabled()) {
+            // When this flag is rolled forward, this whole view can be removed
+            mBatteryView.setVisibility(View.GONE);
+            mBatteryView = null;
+        }
         mCutoutSpace = findViewById(R.id.cutout_space_view);
         mStatusIconArea = findViewById(R.id.status_icon_area);
         mStatusIconContainer = findViewById(R.id.statusIcons);
@@ -259,7 +265,10 @@
                 mMultiUserAvatar.setVisibility(View.GONE);
             }
         }
-        mBatteryView.setForceShowPercent(mBatteryCharging && mShowPercentAvailable);
+
+        if (mBatteryView != null) {
+            mBatteryView.setForceShowPercent(mBatteryCharging && mShowPercentAvailable);
+        }
     }
 
     private void updateSystemIconsLayoutParams() {
@@ -442,7 +451,9 @@
 
     /** Should only be called from {@link KeyguardStatusBarViewController}. */
     void onThemeChanged(TintedIconManager iconManager) {
-        mBatteryView.setColorsFromContext(mContext);
+        if (mBatteryView != null) {
+            mBatteryView.setColorsFromContext(mContext);
+        }
         updateIconsAndTextColors(iconManager);
     }
 
@@ -450,7 +461,9 @@
     void onOverlayChanged() {
         final int carrierTheme = R.style.TextAppearance_StatusBar_Clock;
         mCarrierLabel.setTextAppearance(carrierTheme);
-        mBatteryView.updatePercentView();
+        if (mBatteryView != null) {
+            mBatteryView.updatePercentView();
+        }
 
         final int userSwitcherTheme = R.style.TextAppearance_StatusBar_UserChip;
         TextView userSwitcherName = mUserSwitcherContainer.findViewById(R.id.current_user_name);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java
index 40245ae..de72154 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java
@@ -34,10 +34,12 @@
 import android.util.MathUtils;
 import android.view.DisplayCutout;
 import android.view.View;
+import android.view.ViewGroup;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
+import androidx.compose.ui.platform.ComposeView;
 import androidx.core.animation.Animator;
 import androidx.core.animation.AnimatorListenerAdapter;
 import androidx.core.animation.ValueAnimator;
@@ -62,6 +64,7 @@
 import com.android.systemui.statusbar.CommandQueue;
 import com.android.systemui.statusbar.StatusBarState;
 import com.android.systemui.statusbar.SysuiStatusBarStateController;
+import com.android.systemui.statusbar.core.NewStatusBarIcons;
 import com.android.systemui.statusbar.data.repository.StatusBarContentInsetsProviderStore;
 import com.android.systemui.statusbar.disableflags.DisableStateTracker;
 import com.android.systemui.statusbar.events.SystemStatusAnimationCallback;
@@ -71,10 +74,13 @@
 import com.android.systemui.statusbar.notification.PropertyAnimator;
 import com.android.systemui.statusbar.notification.stack.AnimationProperties;
 import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
+import com.android.systemui.statusbar.phone.domain.interactor.DarkIconInteractor;
 import com.android.systemui.statusbar.phone.fragment.StatusBarIconBlocklistKt;
 import com.android.systemui.statusbar.phone.fragment.StatusBarSystemEventDefaultAnimator;
 import com.android.systemui.statusbar.phone.ui.StatusBarIconController;
 import com.android.systemui.statusbar.phone.ui.TintedIconManager;
+import com.android.systemui.statusbar.pipeline.battery.ui.binder.UnifiedBatteryViewBinder;
+import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.BatteryViewModel;
 import com.android.systemui.statusbar.policy.BatteryController;
 import com.android.systemui.statusbar.policy.ConfigurationController;
 import com.android.systemui.statusbar.policy.KeyguardStateController;
@@ -125,6 +131,7 @@
     private final StatusBarIconController mStatusBarIconController;
     private final TintedIconManager.Factory mTintedIconManagerFactory;
     private final BatteryMeterViewController mBatteryMeterViewController;
+    private final BatteryViewModel.Factory mBatteryViewModelFactory;
     private final ShadeViewStateProvider mShadeViewStateProvider;
     private final KeyguardStateController mKeyguardStateController;
     private final KeyguardBypassController mKeyguardBypassController;
@@ -145,7 +152,7 @@
     private final GlanceableHubToLockscreenTransitionViewModel mHubToLockscreenTransitionViewModel;
     private final LockscreenToGlanceableHubTransitionViewModel mLockscreenToHubTransitionViewModel;
 
-    private View mSystemIconsContainer;
+    private ViewGroup mSystemIconsContainer;
     private final StatusOverlayHoverListenerFactory mStatusOverlayHoverListenerFactory;
 
     private final ConfigurationController.ConfigurationListener mConfigurationListener =
@@ -327,6 +334,7 @@
             StatusBarIconController statusBarIconController,
             TintedIconManager.Factory tintedIconManagerFactory,
             BatteryMeterViewController batteryMeterViewController,
+            BatteryViewModel.Factory batteryViewModelFactory,
             ShadeViewStateProvider shadeViewStateProvider,
             KeyguardStateController keyguardStateController,
             KeyguardBypassController bypassController,
@@ -360,6 +368,7 @@
         mStatusBarIconController = statusBarIconController;
         mTintedIconManagerFactory = tintedIconManagerFactory;
         mBatteryMeterViewController = batteryMeterViewController;
+        mBatteryViewModelFactory = batteryViewModelFactory;
         mShadeViewStateProvider = shadeViewStateProvider;
         mKeyguardStateController = keyguardStateController;
         mKeyguardBypassController = bypassController;
@@ -417,7 +426,9 @@
     protected void onInit() {
         super.onInit();
         mCarrierTextController.init();
-        mBatteryMeterViewController.init();
+        if (!NewStatusBarIcons.isEnabled()) {
+            mBatteryMeterViewController.init();
+        }
         if (isMigrationEnabled()) {
             KeyguardStatusBarViewBinder.bind(mView, mKeyguardStatusBarViewModel);
         }
@@ -469,6 +480,15 @@
                 mToGlanceableHubStatusBarAlphaConsumer, mCoroutineDispatcher);
         collectFlow(mView, mHubToLockscreenTransitionViewModel.getStatusBarAlpha(),
                 mFromGlanceableHubStatusBarAlphaConsumer, mCoroutineDispatcher);
+        if (NewStatusBarIcons.isEnabled()) {
+            ComposeView batteryComposeView = new ComposeView(mContext);
+            UnifiedBatteryViewBinder.bind(
+                    batteryComposeView,
+                    mBatteryViewModelFactory,
+                    DarkIconInteractor.toIsAreaDark(mView.darkChangeFlow()));
+
+            mSystemIconsContainer.addView(batteryComposeView, -1);
+        }
     }
 
     @Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
index 4d222fd..66f0d4a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
@@ -81,6 +81,9 @@
 import com.android.systemui.util.kotlin.JavaAdapter;
 import com.android.systemui.util.wakelock.DelayedWakeLock;
 import com.android.systemui.util.wakelock.WakeLock;
+import com.android.systemui.window.domain.interactor.WindowRootViewBlurInteractor;
+
+import dagger.Lazy;
 
 import kotlinx.coroutines.CoroutineDispatcher;
 
@@ -89,6 +92,7 @@
 import java.lang.annotation.RetentionPolicy;
 import java.util.concurrent.Executor;
 import java.util.function.Consumer;
+import java.util.function.Supplier;
 
 import javax.inject.Inject;
 
@@ -164,6 +168,27 @@
      */
     @FloatRange(from = 0, to = 1)
     private float mBouncerHiddenFraction = KeyguardBouncerConstants.EXPANSION_HIDDEN;
+    private boolean mIsBlurSupported = false;
+
+    private float getDefaultScrimAlpha(boolean ignoreCurrentState) {
+        if (Flags.bouncerUiRevamp() && mIsBlurSupported) {
+            // Hack to not make the shade transparent when shade blur is not enabled.
+            if (!Flags.notificationShadeBlur() && !ignoreCurrentState) {
+                // When we expand directly to full quick settings, shade state is KEYGUARD
+                if (mState == ScrimState.SHADE_LOCKED || (mState == ScrimState.KEYGUARD
+                        && mQsExpansion == 1)) {
+                    return BUSY_SCRIM_ALPHA;
+                }
+            }
+            return TRANSPARENT_BOUNCER_SCRIM_ALPHA;
+        } else {
+            return BUSY_SCRIM_ALPHA;
+        }
+    }
+
+    private float getDefaultScrimAlpha() {
+        return getDefaultScrimAlpha(false);
+    }
 
     @IntDef(prefix = {"VISIBILITY_"}, value = {
             TRANSPARENT,
@@ -226,7 +251,6 @@
     private float mScrimBehindAlphaKeyguard = KEYGUARD_SCRIM_ALPHA;
 
     static final float TRANSPARENT_BOUNCER_SCRIM_ALPHA = 0.54f;
-    private final float mDefaultScrimAlpha;
 
     private float mRawPanelExpansionFraction;
     private float mPanelScrimMinFraction;
@@ -257,6 +281,7 @@
     private final TriConsumer<ScrimState, Float, GradientColors> mScrimStateListener;
     private final LargeScreenShadeInterpolator mLargeScreenShadeInterpolator;
     private final BlurConfig mBlurConfig;
+    private final Lazy<WindowRootViewBlurInteractor> mWindowRootViewBlurInteractor;
     private Consumer<Integer> mScrimVisibleListener;
     private boolean mBlankScreen;
     private boolean mScreenBlankingCallbackCalled;
@@ -324,7 +349,7 @@
             DozeParameters dozeParameters,
             KeyguardStateController keyguardStateController,
             DelayedWakeLock.Factory delayedWakeLockFactory,
-            Handler handler,
+            @Main Handler handler,
             KeyguardUpdateMonitor keyguardUpdateMonitor,
             DockManager dockManager,
             ConfigurationController configurationController,
@@ -339,14 +364,12 @@
             KeyguardInteractor keyguardInteractor,
             @Main CoroutineDispatcher mainDispatcher,
             LargeScreenShadeInterpolator largeScreenShadeInterpolator,
-            BlurConfig blurConfig) {
+            BlurConfig blurConfig,
+            Lazy<WindowRootViewBlurInteractor> windowRootViewBlurInteractor) {
         mScrimStateListener = lightBarController::setScrimState;
         mLargeScreenShadeInterpolator = largeScreenShadeInterpolator;
         mBlurConfig = blurConfig;
-        // All scrims default alpha need to match bouncer background alpha to make sure the
-        // transitions involving the bouncer are smooth and don't overshoot the bouncer alpha.
-        mDefaultScrimAlpha =
-                Flags.bouncerUiRevamp() ? TRANSPARENT_BOUNCER_SCRIM_ALPHA : BUSY_SCRIM_ALPHA;
+        mWindowRootViewBlurInteractor = windowRootViewBlurInteractor;
 
         mKeyguardStateController = keyguardStateController;
         mDarkenWhileDragging = !mKeyguardStateController.canDismissLockScreen();
@@ -407,9 +430,10 @@
 
         final ScrimState[] states = ScrimState.values();
         for (int i = 0; i < states.length; i++) {
-            states[i].init(mScrimInFront, mScrimBehind, mDozeParameters, mDockManager, mBlurConfig);
+            states[i].init(mScrimInFront, mScrimBehind, mDozeParameters, mDockManager,
+                    this::isBlurCurrentlySupported);
             states[i].setScrimBehindAlphaKeyguard(mScrimBehindAlphaKeyguard);
-            states[i].setDefaultScrimAlpha(mDefaultScrimAlpha);
+            states[i].setDefaultScrimAlpha(getDefaultScrimAlpha());
         }
 
         mTransparentScrimBackground = notificationsScrim.getResources()
@@ -485,6 +509,41 @@
                         Edge.Companion.create(Scenes.Communal, LOCKSCREEN),
                         Edge.Companion.create(GLANCEABLE_HUB, LOCKSCREEN)),
                 mGlanceableHubConsumer, mMainDispatcher);
+
+        if (Flags.bouncerUiRevamp() || Flags.notificationShadeBlur()) {
+            collectFlow(behindScrim,
+                    mWindowRootViewBlurInteractor.get().isBlurCurrentlySupported(),
+                    this::handleBlurSupportedChanged);
+        }
+    }
+
+    private void updateDefaultScrimAlphas() {
+        for (ScrimState state : ScrimState.values()) {
+            state.setDefaultScrimAlpha(getDefaultScrimAlpha(true));
+        }
+        applyAndDispatchState();
+    }
+
+    private boolean isBlurCurrentlySupported() {
+        return mWindowRootViewBlurInteractor.get()
+                .isBlurCurrentlySupported()
+                .getValue();
+    }
+
+    private void handleBlurSupportedChanged(boolean isBlurSupported) {
+        this.mIsBlurSupported = isBlurSupported;
+        if (Flags.bouncerUiRevamp()) {
+            updateDefaultScrimAlphas();
+            if (isBlurSupported) {
+                ScrimState.BOUNCER_SCRIMMED.setNotifBlurRadius(mBlurConfig.getMaxBlurRadiusPx());
+            } else {
+                ScrimState.BOUNCER_SCRIMMED.setNotifBlurRadius(0f);
+            }
+        }
+        if (Flags.notificationShadeBlur()) {
+            mState.prepare(mState);
+            applyAndDispatchState();
+        }
     }
 
     // TODO(b/270984686) recompute scrim height accurately, based on shade contents.
@@ -962,7 +1021,7 @@
                     float behindFraction = getInterpolatedFraction();
                     behindFraction = (float) Math.pow(behindFraction, 0.8f);
                     mBehindAlpha = 1;
-                    mNotificationsAlpha = behindFraction * mDefaultScrimAlpha;
+                    mNotificationsAlpha = behindFraction * getDefaultScrimAlpha();
                 } else {
                     if (Flags.notificationShadeBlur()) {
                         // TODO (b/390730594): match any spec for controlling alpha based on shade
@@ -973,7 +1032,7 @@
                         mNotificationsTint = mState.getNotifTint();
                     } else {
                         mBehindAlpha = mLargeScreenShadeInterpolator.getBehindScrimAlpha(
-                                mPanelExpansionFraction * mDefaultScrimAlpha);
+                                mPanelExpansionFraction * getDefaultScrimAlpha());
                         mNotificationsAlpha =
                                 mLargeScreenShadeInterpolator.getNotificationScrimAlpha(
                                         mPanelExpansionFraction);
@@ -989,7 +1048,7 @@
                 final float interpolatedFraction =
                         BouncerPanelExpansionCalculator.aboutToShowBouncerProgress(
                                 mBouncerHiddenFraction);
-                mBehindAlpha = MathUtils.lerp(mDefaultScrimAlpha, mBehindAlpha,
+                mBehindAlpha = MathUtils.lerp(getDefaultScrimAlpha(), mBehindAlpha,
                         interpolatedFraction);
                 mBehindTint = ColorUtils.blendARGB(ScrimState.BOUNCER.getBehindTint(),
                         mBehindTint,
@@ -1079,7 +1138,7 @@
         float behindAlpha;
         int behindTint = state.getBehindTint();
         if (mDarkenWhileDragging) {
-            behindAlpha = MathUtils.lerp(mDefaultScrimAlpha, stateBehind,
+            behindAlpha = MathUtils.lerp(getDefaultScrimAlpha(), stateBehind,
                     interpolatedFract);
         } else {
             behindAlpha = MathUtils.lerp(0 /* start */, stateBehind,
@@ -1095,7 +1154,7 @@
             }
         }
         if (mQsExpansion > 0) {
-            behindAlpha = MathUtils.lerp(behindAlpha, mDefaultScrimAlpha, mQsExpansion);
+            behindAlpha = MathUtils.lerp(behindAlpha, getDefaultScrimAlpha(), mQsExpansion);
             float tintProgress = mQsExpansion;
             if (mStatusBarKeyguardViewManager.isPrimaryBouncerInTransit()) {
                 // this is case of - on lockscreen - going from expanded QS to bouncer.
@@ -1612,7 +1671,7 @@
         pw.println(mTransitionToLockScreenFullShadeNotificationsProgress);
 
         pw.print("  mDefaultScrimAlpha=");
-        pw.println(mDefaultScrimAlpha);
+        pw.println(getDefaultScrimAlpha());
         pw.print("  mPanelExpansionFraction=");
         pw.println(mPanelExpansionFraction);
         pw.print("  mExpansionAffectsAlpha=");
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
index 5f423cf..2282b97 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
@@ -17,19 +17,19 @@
 package com.android.systemui.statusbar.phone;
 
 import static com.android.systemui.statusbar.phone.ScrimController.BUSY_SCRIM_ALPHA;
-import static com.android.systemui.statusbar.phone.ScrimController.TRANSPARENT_BOUNCER_SCRIM_ALPHA;
 
 import android.graphics.Color;
 
 import com.android.app.tracing.coroutines.TrackTracer;
 import com.android.systemui.Flags;
 import com.android.systemui.dock.DockManager;
-import com.android.systemui.keyguard.ui.transitions.BlurConfig;
 import com.android.systemui.res.R;
 import com.android.systemui.scrim.ScrimView;
 import com.android.systemui.shade.ui.ShadeColors;
 import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
 
+import java.util.function.Supplier;
+
 import kotlinx.coroutines.ExperimentalCoroutinesApi;
 
 /**
@@ -90,7 +90,8 @@
             }
             if (Flags.notificationShadeBlur()) {
                 mBehindTint = Color.TRANSPARENT;
-                mNotifTint = ShadeColors.notificationScrim(mScrimBehind.getResources());
+                mNotifTint = ShadeColors.notificationScrim(mScrimBehind.getResources(),
+                        mIsBlurSupported.get());
                 mBehindAlpha = 0.0f;
                 mNotifAlpha = 0.0f;
                 mFrontAlpha = 0.0f;
@@ -116,8 +117,8 @@
         @Override
         public void prepare(ScrimState previousState) {
             if (Flags.bouncerUiRevamp()) {
-                mBehindAlpha = mClipQsScrim ? 0.0f : TRANSPARENT_BOUNCER_SCRIM_ALPHA;
-                mNotifAlpha = mClipQsScrim ? TRANSPARENT_BOUNCER_SCRIM_ALPHA : 0;
+                mBehindAlpha = mDefaultScrimAlpha;
+                mNotifAlpha = 0f;
                 mBehindTint = mNotifTint = mSurfaceColor;
                 mFrontAlpha = 0f;
                 return;
@@ -150,15 +151,16 @@
         @Override
         public void prepare(ScrimState previousState) {
             if (Flags.bouncerUiRevamp()) {
-                if (previousState == SHADE_LOCKED) {
+                // Add unlocked here because scrim state is unlocked when there is an app on top of
+                // the lockscreen and shade is pulled over it.
+                if (previousState == SHADE_LOCKED || previousState == UNLOCKED) {
                     mBehindAlpha = previousState.getBehindAlpha();
                     mNotifAlpha = previousState.getNotifAlpha();
-                    mNotifBlurRadius = mBlurConfig.getMaxBlurRadiusPx();
                 } else {
                     mNotifAlpha = 0f;
                     mBehindAlpha = 0f;
                 }
-                mFrontAlpha = TRANSPARENT_BOUNCER_SCRIM_ALPHA;
+                mFrontAlpha = mDefaultScrimAlpha;
                 mFrontTint = mSurfaceColor;
                 return;
             }
@@ -187,12 +189,23 @@
         @Override
         public void prepare(ScrimState previousState) {
             if (Flags.notificationShadeBlur()) {
-                mBehindTint = ShadeColors.shadePanel(mScrimBehind.getResources());
+                mBehindTint = ShadeColors.shadePanel(mScrimBehind.getResources(),
+                        mIsBlurSupported.get());
                 mBehindAlpha = Color.alpha(mBehindTint) / 255.0f;
-                mNotifTint = ShadeColors.notificationScrim(mScrimBehind.getResources());
+                mNotifTint = ShadeColors.notificationScrim(mScrimBehind.getResources(),
+                        mIsBlurSupported.get());
                 mNotifAlpha = Color.alpha(mNotifTint) / 255.0f;
                 mFrontAlpha = 0.0f;
             } else {
+                if (Flags.bouncerUiRevamp()) {
+                    // This is only required until shade blur flag is fully enabled, shade is always
+                    // opaque when shade blur is not enabled, and mClipQsScrim is always false.
+                    mBehindAlpha = 1f;
+                    mNotifAlpha = 1f;
+                    mFrontAlpha = 0f;
+                    mBehindTint = mBackgroundColor;
+                    return;
+                }
                 mBehindAlpha = mClipQsScrim ? 1 : mDefaultScrimAlpha;
                 mNotifAlpha = 1f;
                 mFrontAlpha = 0f;
@@ -308,9 +321,11 @@
                 mBehindTint = mBackgroundColor;
                 mBlankScreen = true;
             } else if (Flags.notificationShadeBlur()) {
-                mBehindTint = ShadeColors.shadePanel(mScrimBehind.getResources());
+                mBehindTint = ShadeColors.shadePanel(mScrimBehind.getResources(),
+                        mIsBlurSupported.get());
                 mBehindAlpha = Color.alpha(mBehindTint) / 255.0f;
-                mNotifTint = ShadeColors.notificationScrim(mScrimBehind.getResources());
+                mNotifTint = ShadeColors.notificationScrim(mScrimBehind.getResources(),
+                        mIsBlurSupported.get());
                 mNotifAlpha = Color.alpha(mNotifTint) / 255.0f;
                 mFrontAlpha = 0.0f;
                 return;
@@ -403,7 +418,7 @@
     DozeParameters mDozeParameters;
     DockManager mDockManager;
     boolean mDisplayRequiresBlanking;
-    protected BlurConfig mBlurConfig;
+    protected Supplier<Boolean> mIsBlurSupported;
     boolean mLaunchingAffordanceWithPreview;
     boolean mOccludeAnimationPlaying;
     boolean mWakeLockScreenSensorActive;
@@ -417,7 +432,7 @@
     protected float mNotifBlurRadius = 0.0f;
 
     public void init(ScrimView scrimInFront, ScrimView scrimBehind, DozeParameters dozeParameters,
-            DockManager dockManager, BlurConfig blurConfig) {
+            DockManager dockManager, Supplier<Boolean> isBlurSupported) {
         mBackgroundColor = scrimBehind.getContext().getColor(R.color.shade_scrim_background_dark);
         mScrimInFront = scrimInFront;
         mScrimBehind = scrimBehind;
@@ -425,7 +440,7 @@
         mDozeParameters = dozeParameters;
         mDockManager = dockManager;
         mDisplayRequiresBlanking = dozeParameters.getDisplayNeedsBlanking();
-        mBlurConfig = blurConfig;
+        mIsBlurSupported = isBlurSupported;
     }
 
     /** Prepare state for transition. */
@@ -536,4 +551,8 @@
     public float getNotifBlurRadius() {
         return mNotifBlurRadius;
     }
+
+    public void setNotifBlurRadius(float value) {
+        mNotifBlurRadius = value;
+    }
 }
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 01de925..bc29769 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
@@ -46,7 +46,6 @@
 
 import com.android.internal.util.LatencyTracker;
 import com.android.internal.widget.LockPatternUtils;
-import com.android.keyguard.KeyguardMessageAreaController;
 import com.android.keyguard.KeyguardSecurityModel;
 import com.android.keyguard.KeyguardUpdateMonitor;
 import com.android.keyguard.KeyguardUpdateMonitorCallback;
@@ -56,7 +55,6 @@
 import com.android.systemui.DejankUtils;
 import com.android.systemui.Flags;
 import com.android.systemui.animation.back.FlingOnBackAnimationCallback;
-import com.android.systemui.biometrics.domain.interactor.UdfpsOverlayInteractor;
 import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor;
 import com.android.systemui.bouncer.domain.interactor.BouncerInteractor;
 import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerCallbackInteractor;
@@ -158,7 +156,6 @@
     private final ConfigurationController mConfigurationController;
     private final NavigationModeController mNavigationModeController;
     private final NotificationShadeWindowController mNotificationShadeWindowController;
-    private final KeyguardMessageAreaController.Factory mKeyguardMessageAreaFactory;
     private final DreamOverlayStateController mDreamOverlayStateController;
     @Nullable
     private final FoldAodAnimationController mFoldAodAnimationController;
@@ -328,7 +325,6 @@
     private float mQsExpansion;
 
     final Set<KeyguardViewManagerCallback> mCallbacks = new HashSet<>();
-    private final UdfpsOverlayInteractor mUdfpsOverlayInteractor;
     private final ActivityStarter mActivityStarter;
 
     private OnDismissAction mAfterKeyguardGoneAction;
@@ -386,7 +382,6 @@
             DockManager dockManager,
             NotificationShadeWindowController notificationShadeWindowController,
             KeyguardStateController keyguardStateController,
-            KeyguardMessageAreaController.Factory keyguardMessageAreaFactory,
             Optional<SysUIUnfoldComponent> sysUIUnfoldComponent,
             Lazy<ShadeController> shadeController,
             LatencyTracker latencyTracker,
@@ -395,7 +390,6 @@
             PrimaryBouncerInteractor primaryBouncerInteractor,
             BouncerView primaryBouncerView,
             AlternateBouncerInteractor alternateBouncerInteractor,
-            UdfpsOverlayInteractor udfpsOverlayInteractor,
             ActivityStarter activityStarter,
             KeyguardTransitionInteractor keyguardTransitionInteractor,
             KeyguardDismissTransitionInteractor keyguardDismissTransitionInteractor,
@@ -423,7 +417,6 @@
         mKeyguardUpdateManager = keyguardUpdateMonitor;
         mStatusBarStateController = sysuiStatusBarStateController;
         mDockManager = dockManager;
-        mKeyguardMessageAreaFactory = keyguardMessageAreaFactory;
         mShadeController = shadeController;
         mLatencyTracker = latencyTracker;
         mKeyguardSecurityModel = keyguardSecurityModel;
@@ -434,7 +427,6 @@
                 .map(SysUIUnfoldComponent::getFoldAodAnimationController).orElse(null);
         mAlternateBouncerInteractor = alternateBouncerInteractor;
         mBouncerInteractor = bouncerInteractor;
-        mUdfpsOverlayInteractor = udfpsOverlayInteractor;
         mActivityStarter = activityStarter;
         mKeyguardTransitionInteractor = keyguardTransitionInteractor;
         mKeyguardDismissTransitionInteractor = keyguardDismissTransitionInteractor;
@@ -1581,6 +1573,7 @@
                 && mPrimaryBouncerView.getDelegate().dispatchBackKeyEventPreIme();
     }
 
+    @Override
     public void readyForKeyguardDone() {
         mViewMediatorCallback.readyForKeyguardDone();
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java
index ded964d..6c8e182 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java
@@ -57,6 +57,7 @@
 import com.android.systemui.assist.AssistManager;
 import com.android.systemui.dagger.SysUISingleton;
 import com.android.systemui.dagger.qualifiers.Background;
+import com.android.systemui.dagger.qualifiers.Main;
 import com.android.systemui.plugins.ActivityStarter;
 import com.android.systemui.power.domain.interactor.PowerInteractor;
 import com.android.systemui.settings.UserTracker;
@@ -155,7 +156,7 @@
     @Inject
     StatusBarNotificationActivityStarter(
             @ShadeDisplayAware Context context,
-            Handler mainThreadHandler,
+            @Main Handler mainThreadHandler,
             @Background Executor uiBgExecutor,
             NotificationVisibilityProvider visibilityProvider,
             HeadsUpManager headsUpManager,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt
index 76f10b1..0d43789 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt
@@ -20,6 +20,7 @@
 import com.android.systemui.DejankUtils
 import com.android.systemui.Flags.lightRevealMigration
 import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Main
 import com.android.systemui.keyguard.KeyguardViewMediator
 import com.android.systemui.keyguard.WakefulnessLifecycle
 import com.android.systemui.shade.ShadeViewController
@@ -71,7 +72,7 @@
     private val powerManager: PowerManager,
     private val shadeLockscreenInteractorLazy: Lazy<ShadeLockscreenInteractor>,
     private val panelExpansionInteractorLazy: Lazy<PanelExpansionInteractor>,
-    private val handler: Handler = Handler(),
+    @Main private val handler: Handler,
 ) : WakefulnessLifecycle.Observer, ScreenOffAnimation {
     private lateinit var centralSurfaces: CentralSurfaces
     /**
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/HomeStatusBarComponent.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/HomeStatusBarComponent.java
index 7207d0a..4d531b5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/HomeStatusBarComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/HomeStatusBarComponent.java
@@ -20,6 +20,7 @@
 import com.android.systemui.dagger.qualifiers.DisplaySpecific;
 import com.android.systemui.dagger.qualifiers.RootView;
 import com.android.systemui.plugins.DarkIconDispatcher;
+import com.android.systemui.statusbar.core.NewStatusBarIcons;
 import com.android.systemui.statusbar.data.repository.StatusBarConfigurationController;
 import com.android.systemui.statusbar.layout.StatusBarBoundsProvider;
 import com.android.systemui.statusbar.notification.shared.NotificationsLiveDataStoreRefactor;
@@ -85,7 +86,9 @@
     default void init() {
         // No one accesses these controllers, so we need to make sure we reference them here so they
         // do get initialized.
-        getBatteryMeterViewController().init();
+        if (!NewStatusBarIcons.isEnabled()) {
+            getBatteryMeterViewController().init();
+        }
         getHeadsUpAppearanceController().init();
         getPhoneStatusBarViewController().init();
         if (!NotificationsLiveDataStoreRefactor.isEnabled()) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/battery/domain/interactor/BatteryInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/battery/domain/interactor/BatteryInteractor.kt
index 8fdb6ee..d53cbab 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/battery/domain/interactor/BatteryInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/battery/domain/interactor/BatteryInteractor.kt
@@ -29,7 +29,7 @@
     val level = repo.level.filterNotNull()
 
     /** Whether the battery has been fully charged */
-    val isFull = level.map { it >= 100 }
+    val isFull = level.map { isBatteryFull(it) }
 
     /**
      * For the sake of battery views, consider it to be "charging" if plugged in. This allows users
@@ -82,6 +82,8 @@
     companion object {
         /** Level below which we consider to be critically low */
         private const val CRITICAL_LEVEL = 20
+
+        fun isBatteryFull(level: Int) = level >= 100
     }
 }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/battery/ui/binder/UnifiedBatteryViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/battery/ui/binder/UnifiedBatteryViewBinder.kt
index 903844e..9665c33 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/battery/ui/binder/UnifiedBatteryViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/battery/ui/binder/UnifiedBatteryViewBinder.kt
@@ -16,7 +16,10 @@
 
 package com.android.systemui.statusbar.pipeline.battery.ui.binder
 
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.width
 import androidx.compose.runtime.getValue
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.platform.ComposeView
 import androidx.compose.ui.platform.ViewCompositionStrategy
 import androidx.core.view.isVisible
@@ -27,6 +30,8 @@
 import com.android.systemui.statusbar.phone.domain.interactor.IsAreaDark
 import com.android.systemui.statusbar.pipeline.battery.ui.composable.UnifiedBattery
 import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.BatteryViewModel
+import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.BatteryViewModel.Companion.STATUS_BAR_BATTERY_HEIGHT
+import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.BatteryViewModel.Companion.STATUS_BAR_BATTERY_WIDTH
 import kotlinx.coroutines.flow.Flow
 
 /** In cases where the battery needs to be bound to an existing android view */
@@ -47,7 +52,13 @@
                     )
                     setContent {
                         val isDark by isAreaDark.collectAsStateWithLifecycle(IsAreaDark { true })
-                        UnifiedBattery(viewModelFactory = viewModelFactory, isDark = isDark)
+                        UnifiedBattery(
+                            modifier =
+                                Modifier.height(STATUS_BAR_BATTERY_HEIGHT)
+                                    .width(STATUS_BAR_BATTERY_WIDTH),
+                            viewModelFactory = viewModelFactory,
+                            isDark = isDark,
+                        )
                     }
                 }
             }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/battery/ui/composable/BatteryWithEstimate.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/battery/ui/composable/BatteryWithEstimate.kt
index 2ee86ee..ac793a9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/battery/ui/composable/BatteryWithEstimate.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/battery/ui/composable/BatteryWithEstimate.kt
@@ -54,7 +54,7 @@
         )
         if (showEstimate) {
             viewModel.batteryTimeRemainingEstimate?.let {
-                Spacer(modifier.width(2.dp))
+                Spacer(modifier.width(4.dp))
                 Text(text = it, color = Color.White)
             }
         }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/battery/ui/viewmodel/BatteryViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/battery/ui/viewmodel/BatteryViewModel.kt
index d0d099e7..afd4bb1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/battery/ui/viewmodel/BatteryViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/battery/ui/viewmodel/BatteryViewModel.kt
@@ -18,6 +18,7 @@
 
 import android.content.Context
 import androidx.compose.runtime.getValue
+import androidx.compose.ui.unit.dp
 import com.android.systemui.common.shared.model.ContentDescription
 import com.android.systemui.dagger.qualifiers.Application
 import com.android.systemui.lifecycle.ExclusiveActivatable
@@ -223,6 +224,10 @@
     }
 
     companion object {
+        // Status bar battery height, based on a 21x12 base canvas
+        val STATUS_BAR_BATTERY_HEIGHT = 13.dp
+        val STATUS_BAR_BATTERY_WIDTH = 22.75.dp
+
         fun Int.glyphRepresentation(): List<BatteryGlyph> = toString().map { it.toGlyph() }
 
         private fun Char.toGlyph(): BatteryGlyph =
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/icons/shared/BindableIconsRegistry.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/icons/shared/BindableIconsRegistry.kt
index 8400fb0..701dae1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/icons/shared/BindableIconsRegistry.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/icons/shared/BindableIconsRegistry.kt
@@ -18,6 +18,7 @@
 
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.statusbar.pipeline.icons.shared.model.BindableIcon
+import com.android.systemui.statusbar.pipeline.mobile.ui.StackedMobileBindableIcon
 import com.android.systemui.statusbar.pipeline.satellite.ui.DeviceBasedSatelliteBindableIcon
 import javax.inject.Inject
 
@@ -40,11 +41,12 @@
 @Inject
 constructor(
     /** Bindables go here */
-    oemSatellite: DeviceBasedSatelliteBindableIcon
+    oemSatellite: DeviceBasedSatelliteBindableIcon,
+    stackedMobile: StackedMobileBindableIcon,
 ) : BindableIconsRegistry {
     /**
      * Adding the injected bindables to this list will get them registered with
      * StatusBarIconController
      */
-    override val bindableIcons: List<BindableIcon> = listOf(oemSatellite)
+    override val bindableIcons: List<BindableIcon> = listOf(oemSatellite, stackedMobile)
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconsInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconsInteractor.kt
index ac3728d..c52536d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconsInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconsInteractor.kt
@@ -21,6 +21,7 @@
 import android.telephony.SubscriptionManager
 import android.telephony.SubscriptionManager.PROFILE_CLASS_PROVISIONING
 import com.android.settingslib.SignalIcon.MobileIconGroup
+import com.android.settingslib.flags.Flags
 import com.android.settingslib.mobile.TelephonyIcons
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Background
@@ -28,6 +29,7 @@
 import com.android.systemui.flags.Flags.FILTER_PROVISIONING_NETWORK_SUBSCRIPTIONS
 import com.android.systemui.log.table.TableLogBuffer
 import com.android.systemui.log.table.logDiffsForTable
+import com.android.systemui.statusbar.core.StatusBarRootModernization
 import com.android.systemui.statusbar.pipeline.dagger.MobileSummaryLog
 import com.android.systemui.statusbar.pipeline.mobile.data.model.SubscriptionModel
 import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileConnectionRepository
@@ -39,6 +41,7 @@
 import java.lang.ref.WeakReference
 import javax.inject.Inject
 import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.SharingStarted
@@ -79,6 +82,9 @@
      */
     val icons: StateFlow<List<MobileIconInteractor>>
 
+    /** Whether the mobile icons can be stacked vertically. */
+    val isStackable: StateFlow<Boolean>
+
     /** True if the active mobile data subscription has data enabled */
     val activeDataConnectionHasDataEnabled: StateFlow<Boolean>
 
@@ -126,6 +132,7 @@
     fun getMobileConnectionInteractorForSubId(subId: Int): MobileIconInteractor
 }
 
+@OptIn(ExperimentalCoroutinesApi::class)
 @Suppress("EXPERIMENTAL_IS_NOT_ENABLED")
 @SysUISingleton
 class MobileIconsInteractorImpl
@@ -290,6 +297,18 @@
             }
             .stateIn(scope, SharingStarted.WhileSubscribed(), emptyList())
 
+    override val isStackable =
+        if (Flags.newStatusBarIcons() && StatusBarRootModernization.isEnabled) {
+                icons.flatMapLatest { icons ->
+                    combine(icons.map { it.isNonTerrestrial }) {
+                        it.size == 2 && it.none { isNonTerrestrial -> isNonTerrestrial }
+                    }
+                }
+            } else {
+                flowOf(false)
+            }
+            .stateIn(scope, SharingStarted.WhileSubscribed(), false)
+
     /**
      * Copied from the old pipeline. We maintain a 2s period of time where we will keep the
      * validated bit from the old active network (A) while data is changing to the new one (B).
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/MobileUiAdapter.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/MobileUiAdapter.kt
index 30cc2c5..abd543d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/MobileUiAdapter.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/MobileUiAdapter.kt
@@ -16,6 +16,7 @@
 
 package com.android.systemui.statusbar.pipeline.mobile.ui
 
+import com.android.app.tracing.coroutines.launchTraced as launch
 import com.android.systemui.CoreStartable
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Application
@@ -27,7 +28,7 @@
 import javax.inject.Inject
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.flow.collectLatest
-import com.android.app.tracing.coroutines.launchTraced as launch
+import kotlinx.coroutines.flow.combine
 
 /**
  * This class is intended to provide a context to collect on the
@@ -56,12 +57,23 @@
         // Start notifying the icon controller of subscriptions
         scope.launch {
             isCollecting = true
-            mobileIconsViewModel.subscriptionIdsFlow.collectLatest {
-                logger.logUiAdapterSubIdsSentToIconController(it)
-                lastValue = it
-                iconController.setNewMobileIconSubIds(it)
-                shadeCarrierGroupController?.updateModernMobileIcons(it)
-            }
+            combine(
+                    mobileIconsViewModel.subscriptionIdsFlow,
+                    mobileIconsViewModel.isStackable,
+                    ::Pair,
+                )
+                .collectLatest { (subIds, isStackable) ->
+                    logger.logUiAdapterSubIdsSentToIconController(subIds, isStackable)
+                    lastValue = subIds
+                    if (isStackable) {
+                        // Passing an empty list to remove pre-existing mobile icons.
+                        // StackedMobileBindableIcon will show the stacked icon instead.
+                        iconController.setNewMobileIconSubIds(emptyList())
+                    } else {
+                        iconController.setNewMobileIconSubIds(subIds)
+                    }
+                    shadeCarrierGroupController?.updateModernMobileIcons(subIds)
+                }
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/MobileViewLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/MobileViewLogger.kt
index 2af6795b..4c2849d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/MobileViewLogger.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/MobileViewLogger.kt
@@ -31,22 +31,24 @@
 @SysUISingleton
 class MobileViewLogger
 @Inject
-constructor(
-    @MobileViewLog private val buffer: LogBuffer,
-    dumpManager: DumpManager,
-) : Dumpable {
+constructor(@MobileViewLog private val buffer: LogBuffer, dumpManager: DumpManager) : Dumpable {
     init {
         dumpManager.registerNormalDumpable(this)
     }
 
     private val collectionStatuses = mutableMapOf<String, Boolean>()
 
-    fun logUiAdapterSubIdsSentToIconController(subs: List<Int>) {
+    fun logUiAdapterSubIdsSentToIconController(subs: List<Int>, isStackable: Boolean) {
         buffer.log(
             TAG,
             LogLevel.INFO,
-            { str1 = subs.toString() },
-            { "Sub IDs in MobileUiAdapter being sent to icon controller: $str1" },
+            {
+                str1 = subs.toString()
+                bool1 = isStackable
+            },
+            {
+                "Sub IDs in MobileUiAdapter being sent to icon controller: $str1, isStackable=$bool1"
+            },
         )
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/StackedMobileBindableIcon.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/StackedMobileBindableIcon.kt
new file mode 100644
index 0000000..fa9fa4c
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/StackedMobileBindableIcon.kt
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.pipeline.mobile.ui
+
+import android.content.Context
+import com.android.settingslib.flags.Flags
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.statusbar.core.StatusBarRootModernization
+import com.android.systemui.statusbar.pipeline.icons.shared.model.BindableIcon
+import com.android.systemui.statusbar.pipeline.icons.shared.model.ModernStatusBarViewCreator
+import com.android.systemui.statusbar.pipeline.mobile.ui.binder.StackedMobileIconBinder
+import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsViewModel
+import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.StackedMobileIconViewModel
+import com.android.systemui.statusbar.pipeline.shared.ui.view.SingleBindableStatusBarComposeIconView
+import javax.inject.Inject
+
+@SysUISingleton
+class StackedMobileBindableIcon
+@Inject
+constructor(
+    context: Context,
+    mobileIconsViewModel: MobileIconsViewModel,
+    viewModelFactory: StackedMobileIconViewModel.Factory,
+) : BindableIcon {
+    override val slot: String =
+        context.getString(com.android.internal.R.string.status_bar_stacked_mobile)
+
+    override val initializer = ModernStatusBarViewCreator { context ->
+        SingleBindableStatusBarComposeIconView.createView(context).also { view ->
+            view.initView(slot) {
+                StackedMobileIconBinder.bind(view, mobileIconsViewModel, viewModelFactory)
+            }
+        }
+    }
+
+    override val shouldBindIcon: Boolean =
+        Flags.newStatusBarIcons() && StatusBarRootModernization.isEnabled
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/MobileIconBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/MobileIconBinder.kt
index 788f041..0eef2e1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/MobileIconBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/MobileIconBinder.kt
@@ -45,6 +45,7 @@
 import com.android.systemui.statusbar.pipeline.shared.ui.binder.ModernStatusBarViewVisibilityHelper
 import com.android.systemui.statusbar.pipeline.shared.ui.binder.StatusBarViewBinderConstants.ALPHA_ACTIVE
 import com.android.systemui.statusbar.pipeline.shared.ui.binder.StatusBarViewBinderConstants.ALPHA_INACTIVE
+import com.android.systemui.util.kotlin.pairwiseBy
 import kotlinx.coroutines.awaitCancellation
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.distinctUntilChanged
@@ -131,19 +132,37 @@
 
                     // Set the icon for the triangle
                     launch {
-                        viewModel.icon.distinctUntilChanged().collect { icon ->
-                            viewModel.verboseLogger?.logBinderReceivedSignalIcon(
-                                view,
-                                viewModel.subscriptionId,
-                                icon,
-                            )
-                            if (icon is SignalIconModel.Cellular) {
-                                iconView.setImageDrawable(mobileDrawable)
-                                mobileDrawable.level = icon.toSignalDrawableState()
-                            } else if (icon is SignalIconModel.Satellite) {
-                                IconViewBinder.bind(icon.icon, iconView)
+                        viewModel.icon
+                            .pairwiseBy(initialValue = null) { oldIcon, newIcon ->
+                                // Make sure we requestLayout if the number of levels changes
+                                val shouldRequestLayout =
+                                    when {
+                                        oldIcon == null -> true
+                                        oldIcon is SignalIconModel.Cellular &&
+                                            newIcon is SignalIconModel.Cellular -> {
+                                            oldIcon.numberOfLevels != newIcon.numberOfLevels
+                                        }
+                                        else -> false
+                                    }
+                                Pair(shouldRequestLayout, newIcon)
                             }
-                        }
+                            .collect { (shouldRequestLayout, newIcon) ->
+                                viewModel.verboseLogger?.logBinderReceivedSignalIcon(
+                                    view,
+                                    viewModel.subscriptionId,
+                                    newIcon,
+                                )
+                                if (newIcon is SignalIconModel.Cellular) {
+                                    iconView.setImageDrawable(mobileDrawable)
+                                    mobileDrawable.level = newIcon.toSignalDrawableState()
+                                } else if (newIcon is SignalIconModel.Satellite) {
+                                    IconViewBinder.bind(newIcon.icon, iconView)
+                                }
+
+                                if (shouldRequestLayout) {
+                                    iconView.requestLayout()
+                                }
+                            }
                     }
 
                     launch {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/StackedMobileIconBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/StackedMobileIconBinder.kt
new file mode 100644
index 0000000..c9fc53e
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/StackedMobileIconBinder.kt
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.pipeline.mobile.ui.binder
+
+import androidx.compose.material3.LocalContentColor
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.ViewCompositionStrategy
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.repeatOnLifecycle
+import com.android.systemui.lifecycle.rememberViewModel
+import com.android.systemui.lifecycle.repeatWhenAttached
+import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsViewModel
+import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.StackedMobileIconViewModel
+import com.android.systemui.statusbar.pipeline.shared.ui.binder.ModernStatusBarViewBinding
+import com.android.systemui.statusbar.pipeline.shared.ui.composable.StackedMobileIcon
+import com.android.systemui.statusbar.pipeline.shared.ui.view.SingleBindableStatusBarComposeIconView
+
+object StackedMobileIconBinder {
+    fun bind(
+        view: SingleBindableStatusBarComposeIconView,
+        mobileIconsViewModel: MobileIconsViewModel,
+        viewModelFactory: StackedMobileIconViewModel.Factory,
+    ): ModernStatusBarViewBinding {
+        return SingleBindableStatusBarComposeIconView.withDefaultBinding(
+            view = view,
+            shouldBeVisible = { mobileIconsViewModel.isStackable.value },
+        ) { _, tint ->
+            view.repeatWhenAttached {
+                repeatOnLifecycle(Lifecycle.State.STARTED) {
+                    view.composeView.apply {
+                        setViewCompositionStrategy(
+                            ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed
+                        )
+                        setContent {
+                            val viewModel =
+                                rememberViewModel("StackedMobileIconBinder") {
+                                    viewModelFactory.create()
+                                }
+                            if (viewModel.isIconVisible) {
+                                CompositionLocalProvider(LocalContentColor provides Color(tint())) {
+                                    StackedMobileIcon(viewModel)
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/view/ModernStatusBarMobileView.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/view/ModernStatusBarMobileView.kt
index fd5ab13..4458b22 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/view/ModernStatusBarMobileView.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/view/ModernStatusBarMobileView.kt
@@ -20,18 +20,16 @@
 import android.util.AttributeSet
 import android.view.LayoutInflater
 import android.widget.ImageView
-import com.android.settingslib.flags.Flags.newStatusBarIcons
 import com.android.systemui.res.R
 import com.android.systemui.statusbar.StatusBarIconView.getVisibleStateString
+import com.android.systemui.statusbar.core.NewStatusBarIcons
 import com.android.systemui.statusbar.pipeline.mobile.ui.MobileViewLogger
 import com.android.systemui.statusbar.pipeline.mobile.ui.binder.MobileIconBinder
 import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.LocationBasedMobileViewModel
 import com.android.systemui.statusbar.pipeline.shared.ui.view.ModernStatusBarView
 
-class ModernStatusBarMobileView(
-    context: Context,
-    attrs: AttributeSet?,
-) : ModernStatusBarView(context, attrs) {
+class ModernStatusBarMobileView(context: Context, attrs: AttributeSet?) :
+    ModernStatusBarView(context, attrs) {
 
     var subId: Int = -1
 
@@ -62,9 +60,7 @@
                     as ModernStatusBarMobileView)
                 .also {
                     // Flag-specific configuration
-                    if (newStatusBarIcons()) {
-                        // New icon (with no embedded whitespace) is slightly shorter
-                        // (but actually taller)
+                    if (NewStatusBarIcons.isEnabled) {
                         val iconView = it.requireViewById<ImageView>(R.id.mobile_signal)
                         val lp = iconView.layoutParams
                         lp.height =
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconsViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconsViewModel.kt
index 22feb7c..6176a3e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconsViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconsViewModel.kt
@@ -70,15 +70,20 @@
             }
             .stateIn(scope, SharingStarted.WhileSubscribed(), listOf())
 
-    private val firstMobileSubViewModel: StateFlow<MobileIconViewModelCommon?> =
+    val mobileSubViewModels: StateFlow<List<MobileIconViewModelCommon>> =
         subscriptionIdsFlow
+            .map { ids -> ids.map { commonViewModelForSub(it) } }
+            .stateIn(scope, SharingStarted.WhileSubscribed(), emptyList())
+
+    private val firstMobileSubViewModel: StateFlow<MobileIconViewModelCommon?> =
+        mobileSubViewModels
             .map {
                 if (it.isEmpty()) {
                     null
                 } else {
                     // Mobile icons get reversed by [StatusBarIconController], so the last element
                     // in this list will show up visually first.
-                    commonViewModelForSub(it.last())
+                    it.last()
                 }
             }
             .stateIn(scope, SharingStarted.WhileSubscribed(), null)
@@ -94,6 +99,8 @@
             }
             .stateIn(scope, SharingStarted.WhileSubscribed(), false)
 
+    val isStackable: StateFlow<Boolean> = interactor.isStackable
+
     init {
         scope.launch { subscriptionIdsFlow.collect { invalidateCaches(it) } }
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/StackedMobileIconViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/StackedMobileIconViewModel.kt
new file mode 100644
index 0000000..a2c2a3c
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/StackedMobileIconViewModel.kt
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel
+
+import androidx.compose.runtime.derivedStateOf
+import androidx.compose.runtime.getValue
+import com.android.systemui.common.shared.model.Icon
+import com.android.systemui.lifecycle.ExclusiveActivatable
+import com.android.systemui.lifecycle.Hydrator
+import com.android.systemui.statusbar.pipeline.mobile.domain.model.SignalIconModel
+import dagger.assisted.AssistedFactory
+import dagger.assisted.AssistedInject
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.flatMapLatest
+import kotlinx.coroutines.flow.flowOf
+
+@OptIn(ExperimentalCoroutinesApi::class)
+class StackedMobileIconViewModel
+@AssistedInject
+constructor(mobileIconsViewModel: MobileIconsViewModel) : ExclusiveActivatable() {
+    private val hydrator = Hydrator("StackedMobileIconViewModel")
+
+    private val isStackable: Boolean by
+        hydrator.hydratedStateOf(
+            traceName = "isStackable",
+            source = mobileIconsViewModel.isStackable,
+            initialValue = false,
+        )
+
+    private val iconViewModelFlow: StateFlow<List<MobileIconViewModelCommon>> =
+        mobileIconsViewModel.mobileSubViewModels
+
+    val dualSim: DualSim? by
+        hydrator.hydratedStateOf(
+            traceName = "dualSim",
+            source =
+                iconViewModelFlow.flatMapLatest { viewModels ->
+                    combine(viewModels.map { it.icon }) { icons ->
+                        icons
+                            .toList()
+                            .filterIsInstance<SignalIconModel.Cellular>()
+                            .takeIf { it.size == 2 }
+                            ?.let { DualSim(it[0], it[1]) }
+                    }
+                },
+            initialValue = null,
+        )
+
+    val networkTypeIcon: Icon.Resource? by
+        hydrator.hydratedStateOf(
+            traceName = "networkTypeIcon",
+            source =
+                iconViewModelFlow.flatMapLatest { viewModels ->
+                    viewModels.firstOrNull()?.networkTypeIcon ?: flowOf(null)
+                },
+            initialValue = null,
+        )
+
+    val isIconVisible: Boolean by derivedStateOf { isStackable && dualSim != null }
+
+    override suspend fun onActivated(): Nothing {
+        hydrator.activate()
+    }
+
+    @AssistedFactory
+    interface Factory {
+        fun create(): StackedMobileIconViewModel
+    }
+
+    data class DualSim(
+        val primary: SignalIconModel.Cellular,
+        val secondary: SignalIconModel.Cellular,
+    )
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/binder/HomeStatusBarViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/binder/HomeStatusBarViewBinder.kt
index 9c9d41e..cd320a1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/binder/HomeStatusBarViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/binder/HomeStatusBarViewBinder.kt
@@ -93,10 +93,11 @@
 
         // CollapsedStatusBarFragment doesn't need this
         if (StatusBarRootModernization.isEnabled) {
-            primaryChipView.isVisible = false
-            systemInfoView.isVisible = false
-            clockView.isVisible = false
-            notificationIconsArea.isVisible = false
+            // GONE because this shouldn't take space in the layout
+            primaryChipView.hideInitially(state = View.GONE)
+            systemInfoView.hideInitially()
+            clockView.hideInitially()
+            notificationIconsArea.hideInitially()
         }
 
         view.repeatWhenAttached {
@@ -365,6 +366,17 @@
         }
     }
 
+    /**
+     * Hide the view for initialization, but skip if it's already hidden and does not cancel
+     * animations.
+     */
+    private fun View.hideInitially(state: Int = View.INVISIBLE) {
+        if (visibility == View.INVISIBLE || visibility == View.GONE) {
+            return
+        }
+        visibility = state
+    }
+
     // See CollapsedStatusBarFragment#hide.
     private fun View.hide(state: Int = View.INVISIBLE, shouldAnimateChange: Boolean) {
         if (visibility == View.INVISIBLE || visibility == View.GONE) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StackedMobileIcon.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StackedMobileIcon.kt
new file mode 100644
index 0000000..465a43f
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StackedMobileIcon.kt
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.pipeline.shared.ui.composable
+
+import androidx.compose.foundation.Canvas
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.material3.LocalContentColor
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.CornerRadius
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.Size
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.drawscope.DrawScope
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.unit.TextUnit
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import com.android.compose.modifiers.height
+import com.android.compose.modifiers.width
+import com.android.systemui.common.ui.compose.Icon
+import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.StackedMobileIconViewModel
+import com.android.systemui.statusbar.pipeline.shared.ui.composable.StackedMobileIconDimensions.BarBaseHeightFiveBarsSp
+import com.android.systemui.statusbar.pipeline.shared.ui.composable.StackedMobileIconDimensions.BarBaseHeightFourBarsSp
+import com.android.systemui.statusbar.pipeline.shared.ui.composable.StackedMobileIconDimensions.BarsLevelIncrementSp
+import com.android.systemui.statusbar.pipeline.shared.ui.composable.StackedMobileIconDimensions.BarsVerticalPaddingSp
+import com.android.systemui.statusbar.pipeline.shared.ui.composable.StackedMobileIconDimensions.HorizontalPaddingFiveBarsSp
+import com.android.systemui.statusbar.pipeline.shared.ui.composable.StackedMobileIconDimensions.HorizontalPaddingFourBarsSp
+import com.android.systemui.statusbar.pipeline.shared.ui.composable.StackedMobileIconDimensions.IconHeightSp
+import com.android.systemui.statusbar.pipeline.shared.ui.composable.StackedMobileIconDimensions.IconWidthFiveBarsSp
+import com.android.systemui.statusbar.pipeline.shared.ui.composable.StackedMobileIconDimensions.IconWidthFourBarsSp
+import com.android.systemui.statusbar.pipeline.shared.ui.composable.StackedMobileIconDimensions.SecondaryBarHeightSp
+import kotlin.math.max
+
+/**
+ * The dual sim icon that shows both connections stacked vertically with the active connection on
+ * top
+ */
+@Composable
+fun StackedMobileIcon(viewModel: StackedMobileIconViewModel, modifier: Modifier = Modifier) {
+    val dualSim = viewModel.dualSim ?: return
+
+    val contentColor = LocalContentColor.current
+
+    Row(verticalAlignment = Alignment.CenterVertically, modifier = modifier) {
+        viewModel.networkTypeIcon?.let {
+            Icon(
+                it,
+                tint = contentColor,
+                modifier =
+                    Modifier.height { IconHeightSp.roundToPx() }.padding(start = 1.dp, end = 2.dp),
+            )
+        }
+
+        StackedMobileIcon(dualSim, contentColor)
+    }
+}
+
+@Composable
+private fun StackedMobileIcon(
+    viewModel: StackedMobileIconViewModel.DualSim,
+    color: Color,
+    modifier: Modifier = Modifier,
+) {
+    val maxNumberOfLevels =
+        max(viewModel.primary.numberOfLevels, viewModel.secondary.numberOfLevels)
+    val dimensions = if (maxNumberOfLevels == 6) FiveBarsDimensions else FourBarsDimensions
+    val iconSize =
+        with(LocalDensity.current) { dimensions.totalWidth.toDp() to IconHeightSp.toDp() }
+
+    Canvas(modifier.size(width = iconSize.first, height = iconSize.second)) {
+        val verticalPaddingPx = BarsVerticalPaddingSp.roundToPx()
+        val horizontalPaddingPx = dimensions.barsHorizontalPadding.roundToPx()
+        val totalPaddingWidthPx = horizontalPaddingPx * (maxNumberOfLevels - 1)
+
+        val barWidthPx = (size.width - totalPaddingWidthPx) / maxNumberOfLevels
+        val dotHeightPx = SecondaryBarHeightSp.toPx()
+        val baseBarHeightPx = dimensions.barBaseHeight.toPx()
+
+        var xOffsetPx = 0f
+        for (bar in 1..maxNumberOfLevels) {
+            // Bottom dots representing secondary sim
+            val dotYOffsetPx = size.height - dotHeightPx
+            if (bar <= viewModel.secondary.numberOfLevels) {
+                drawMobileIconBar(
+                    level = viewModel.secondary.level,
+                    bar = bar,
+                    topLeft = Offset(xOffsetPx, dotYOffsetPx),
+                    size = Size(barWidthPx, dotHeightPx),
+                    activeColor = color,
+                )
+            }
+
+            // Top bars representing primary sim
+            if (bar <= viewModel.primary.numberOfLevels) {
+                val barHeightPx = baseBarHeightPx + (BarsLevelIncrementSp.toPx() * (bar - 1))
+                val barYOffsetPx = dotYOffsetPx - verticalPaddingPx - barHeightPx
+                drawMobileIconBar(
+                    level = viewModel.primary.level,
+                    bar = bar,
+                    topLeft = Offset(xOffsetPx, barYOffsetPx),
+                    size = Size(barWidthPx, barHeightPx),
+                    activeColor = color,
+                )
+            }
+
+            xOffsetPx += barWidthPx + horizontalPaddingPx
+        }
+    }
+}
+
+private fun DrawScope.drawMobileIconBar(
+    level: Int,
+    bar: Int,
+    topLeft: Offset,
+    size: Size,
+    activeColor: Color,
+    inactiveColor: Color = activeColor.copy(alpha = .3f),
+    cornerRadius: CornerRadius = CornerRadius(size.width / 2),
+) {
+    drawRoundRect(
+        color = if (level >= bar) activeColor else inactiveColor,
+        topLeft = topLeft,
+        size = size,
+        cornerRadius = cornerRadius,
+    )
+}
+
+private abstract class BarsDependentDimensions(
+    val totalWidth: TextUnit,
+    val barsHorizontalPadding: TextUnit,
+    val barBaseHeight: TextUnit,
+)
+
+private object FourBarsDimensions :
+    BarsDependentDimensions(
+        IconWidthFourBarsSp,
+        HorizontalPaddingFourBarsSp,
+        BarBaseHeightFourBarsSp,
+    )
+
+private object FiveBarsDimensions :
+    BarsDependentDimensions(
+        IconWidthFiveBarsSp,
+        HorizontalPaddingFiveBarsSp,
+        BarBaseHeightFiveBarsSp,
+    )
+
+private object StackedMobileIconDimensions {
+    // Common dimensions
+    val IconHeightSp = 12.sp
+    val BarsVerticalPaddingSp = 1.5.sp
+    val BarsLevelIncrementSp = 1.sp
+    val SecondaryBarHeightSp = 3.sp
+
+    // Dimensions dependant on the number of total bars
+    val IconWidthFiveBarsSp = 18.5.sp
+    val IconWidthFourBarsSp = 16.sp
+    val HorizontalPaddingFiveBarsSp = 1.5.sp
+    val HorizontalPaddingFourBarsSp = 2.sp
+    val BarBaseHeightFiveBarsSp = 3.5.sp
+    val BarBaseHeightFourBarsSp = 4.5.sp
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StatusBarRoot.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StatusBarRoot.kt
index 9d72daf..a961713 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StatusBarRoot.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StatusBarRoot.kt
@@ -23,6 +23,8 @@
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.width
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.getValue
 import androidx.compose.ui.Alignment
@@ -34,15 +36,20 @@
 import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import com.android.compose.theme.PlatformTheme
 import com.android.keyguard.AlphaOptimizedLinearLayout
+import com.android.systemui.lifecycle.rememberViewModel
 import com.android.systemui.plugins.DarkIconDispatcher
 import com.android.systemui.res.R
 import com.android.systemui.statusbar.chips.ui.compose.OngoingActivityChips
+import com.android.systemui.statusbar.core.NewStatusBarIcons
+import com.android.systemui.statusbar.core.StatusBarConnectedDisplays
 import com.android.systemui.statusbar.core.StatusBarRootModernization
 import com.android.systemui.statusbar.data.repository.DarkIconDispatcherStore
 import com.android.systemui.statusbar.events.domain.interactor.SystemStatusEventAnimationInteractor
 import com.android.systemui.statusbar.featurepods.popups.StatusBarPopupChips
 import com.android.systemui.statusbar.featurepods.popups.ui.compose.StatusBarPopupChipsContainer
+import com.android.systemui.statusbar.notification.icon.ui.viewbinder.ConnectedDisplaysStatusBarNotificationIconViewStore
 import com.android.systemui.statusbar.notification.icon.ui.viewbinder.NotificationIconContainerStatusBarViewBinder
+import com.android.systemui.statusbar.notification.icon.ui.viewbinder.NotificationIconContainerViewBinder
 import com.android.systemui.statusbar.phone.NotificationIconContainer
 import com.android.systemui.statusbar.phone.PhoneStatusBarView
 import com.android.systemui.statusbar.phone.StatusBarLocation
@@ -51,6 +58,9 @@
 import com.android.systemui.statusbar.phone.ongoingcall.StatusBarChipsModernization
 import com.android.systemui.statusbar.phone.ui.DarkIconManager
 import com.android.systemui.statusbar.phone.ui.StatusBarIconController
+import com.android.systemui.statusbar.pipeline.battery.ui.composable.UnifiedBattery
+import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.BatteryViewModel.Companion.STATUS_BAR_BATTERY_HEIGHT
+import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.BatteryViewModel.Companion.STATUS_BAR_BATTERY_WIDTH
 import com.android.systemui.statusbar.pipeline.shared.ui.binder.HomeStatusBarIconBlockListBinder
 import com.android.systemui.statusbar.pipeline.shared.ui.binder.HomeStatusBarViewBinder
 import com.android.systemui.statusbar.pipeline.shared.ui.model.VisibilityModel
@@ -65,6 +75,7 @@
     private val homeStatusBarViewModelFactory: HomeStatusBarViewModelFactory,
     private val homeStatusBarViewBinder: HomeStatusBarViewBinder,
     private val notificationIconsBinder: NotificationIconContainerStatusBarViewBinder,
+    private val iconViewStoreFactory: ConnectedDisplaysStatusBarNotificationIconViewStore.Factory,
     private val darkIconManagerFactory: DarkIconManager.Factory,
     private val iconController: StatusBarIconController,
     private val ongoingCallController: OngoingCallController,
@@ -73,16 +84,16 @@
 ) {
     fun create(root: ViewGroup, andThen: (ViewGroup) -> Unit): ComposeView {
         val composeView = ComposeView(root.context)
-        val displayId = root.context.displayId
         val darkIconDispatcher =
             darkIconDispatcherStore.forDisplay(root.context.displayId) ?: return composeView
         composeView.apply {
             setContent {
                 StatusBarRoot(
                     parent = root,
-                    statusBarViewModel = homeStatusBarViewModelFactory.create(displayId),
+                    statusBarViewModelFactory = homeStatusBarViewModelFactory,
                     statusBarViewBinder = homeStatusBarViewBinder,
                     notificationIconsBinder = notificationIconsBinder,
+                    iconViewStoreFactory = iconViewStoreFactory,
                     darkIconManagerFactory = darkIconManagerFactory,
                     iconController = iconController,
                     ongoingCallController = ongoingCallController,
@@ -110,9 +121,10 @@
 @Composable
 fun StatusBarRoot(
     parent: ViewGroup,
-    statusBarViewModel: HomeStatusBarViewModel,
+    statusBarViewModelFactory: HomeStatusBarViewModelFactory,
     statusBarViewBinder: HomeStatusBarViewBinder,
     notificationIconsBinder: NotificationIconContainerStatusBarViewBinder,
+    iconViewStoreFactory: ConnectedDisplaysStatusBarNotificationIconViewStore.Factory,
     darkIconManagerFactory: DarkIconManager.Factory,
     iconController: StatusBarIconController,
     ongoingCallController: OngoingCallController,
@@ -120,6 +132,18 @@
     eventAnimationInteractor: SystemStatusEventAnimationInteractor,
     onViewCreated: (ViewGroup) -> Unit,
 ) {
+    val displayId = parent.context.displayId
+    val statusBarViewModel =
+        rememberViewModel("HomeStatusBar") { statusBarViewModelFactory.create(displayId) }
+    val iconViewStore: NotificationIconContainerViewBinder.IconViewStore? =
+        if (StatusBarConnectedDisplays.isEnabled) {
+            rememberViewModel("HomeStatusBar.IconViewStore[$displayId]") {
+                iconViewStoreFactory.create(displayId)
+            }
+        } else {
+            null
+        }
+
     Box(Modifier.fillMaxSize()) {
         // TODO(b/364360986): remove this before rolling the flag forward
         if (StatusBarRootModernization.SHOW_DISAMBIGUATION) {
@@ -159,16 +183,15 @@
                                         LinearLayout.LayoutParams.WRAP_CONTENT,
                                     )
 
-                                setViewCompositionStrategy(
-                                    ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed
-                                )
-
                                 setContent {
                                     PlatformTheme {
                                         val chips by
                                             statusBarViewModel.ongoingActivityChips
                                                 .collectAsStateWithLifecycle()
-                                        OngoingActivityChips(chips = chips)
+                                        OngoingActivityChips(
+                                            chips = chips,
+                                            iconViewStore = iconViewStore,
+                                        )
                                     }
                                 }
                             }
@@ -241,6 +264,12 @@
                         endSideContent.addView(composeView, 0)
                     }
 
+                    // If the flag is enabled, create and add a compose battery view to the end
+                    // of the system_icons container
+                    if (NewStatusBarIcons.isEnabled) {
+                        addBatteryComposable(phoneStatusBarView, statusBarViewModel)
+                    }
+
                     notificationIconsBinder.bindWhileAttached(
                         notificationIconContainer,
                         context.displayId,
@@ -263,6 +292,27 @@
     }
 }
 
+/** Create a new [UnifiedBattery] and add it to the end of the system_icons container */
+private fun addBatteryComposable(
+    phoneStatusBarView: PhoneStatusBarView,
+    statusBarViewModel: HomeStatusBarViewModel,
+) {
+    val batteryComposeView =
+        ComposeView(phoneStatusBarView.context).apply {
+            setContent {
+                UnifiedBattery(
+                    modifier =
+                        Modifier.height(STATUS_BAR_BATTERY_HEIGHT).width(STATUS_BAR_BATTERY_WIDTH),
+                    viewModelFactory = statusBarViewModel.batteryViewModelFactory,
+                    isDark = statusBarViewModel.areaDark,
+                )
+            }
+        }
+    phoneStatusBarView.findViewById<ViewGroup>(R.id.system_icons).apply {
+        addView(batteryComposeView, -1)
+    }
+}
+
 /**
  * This is our analog of the flexi "ribbon", which just shows some text so we know if the flag is on
  */
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/view/SingleBindableStatusBarComposeIconView.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/view/SingleBindableStatusBarComposeIconView.kt
new file mode 100644
index 0000000..8076040
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/view/SingleBindableStatusBarComposeIconView.kt
@@ -0,0 +1,155 @@
+/*
+ * 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.pipeline.shared.ui.view
+
+import android.content.Context
+import android.graphics.Color
+import android.util.AttributeSet
+import android.view.LayoutInflater
+import android.view.View
+import androidx.compose.ui.platform.ComposeView
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.LifecycleOwner
+import androidx.lifecycle.lifecycleScope
+import androidx.lifecycle.repeatOnLifecycle
+import com.android.app.tracing.coroutines.launchTraced as launch
+import com.android.systemui.lifecycle.repeatWhenAttached
+import com.android.systemui.res.R
+import com.android.systemui.statusbar.StatusBarIconView
+import com.android.systemui.statusbar.StatusBarIconView.STATE_HIDDEN
+import com.android.systemui.statusbar.pipeline.shared.ui.binder.ModernStatusBarViewBinding
+import com.android.systemui.statusbar.pipeline.shared.ui.binder.ModernStatusBarViewVisibilityHelper
+import kotlinx.coroutines.awaitCancellation
+import kotlinx.coroutines.flow.MutableStateFlow
+
+/** Compose view that is bound to bindable_status_bar_compose_icon.xml */
+class SingleBindableStatusBarComposeIconView(context: Context, attrs: AttributeSet?) :
+    ModernStatusBarView(context, attrs) {
+
+    internal lateinit var composeView: ComposeView
+    internal lateinit var dotView: StatusBarIconView
+
+    override fun toString(): String {
+        return "SingleBindableStatusBarComposeIcon(" +
+            "slot='$slot', " +
+            "isCollecting=${binding.isCollecting()}, " +
+            "visibleState=${StatusBarIconView.getVisibleStateString(visibleState)}); " +
+            "viewString=${super.toString()}"
+    }
+
+    override fun initView(slot: String, bindingCreator: () -> ModernStatusBarViewBinding) {
+        super.initView(slot, bindingCreator)
+
+        composeView = requireViewById(R.id.compose_view)
+        dotView = requireViewById(R.id.status_bar_dot)
+    }
+
+    companion object {
+        fun createView(context: Context): SingleBindableStatusBarComposeIconView {
+            return LayoutInflater.from(context)
+                .inflate(R.layout.bindable_status_bar_compose_icon, null)
+                as SingleBindableStatusBarComposeIconView
+        }
+
+        /**
+         * Using a given binding [block], create the necessary scaffolding to handle the general
+         * case of a single status bar icon. This includes eliding into a dot view when there is not
+         * enough space, and handling tint.
+         *
+         * [block] should be a simple [launch] call that handles updating the single icon view with
+         * its new view. Currently there is no simple way to e.g., extend to handle multiple tints
+         * for dual-layered icons, and any more complex logic should probably find a way to return
+         * its own version of [ModernStatusBarViewBinding].
+         */
+        fun withDefaultBinding(
+            view: SingleBindableStatusBarComposeIconView,
+            shouldBeVisible: () -> Boolean,
+            block: suspend LifecycleOwner.(View, () -> Int) -> Unit,
+        ): ModernStatusBarViewBinding {
+            @StatusBarIconView.VisibleState
+            val visibilityState: MutableStateFlow<Int> = MutableStateFlow(STATE_HIDDEN)
+
+            val iconTint: MutableStateFlow<Int> = MutableStateFlow(Color.WHITE)
+            val decorTint: MutableStateFlow<Int> = MutableStateFlow(Color.WHITE)
+
+            var isCollecting: Boolean = false
+
+            view.repeatWhenAttached {
+                // Child binding
+                block(view) { iconTint.value }
+
+                lifecycleScope.launch {
+                    repeatOnLifecycle(Lifecycle.State.STARTED) {
+                        // isVisible controls the visibility state of the outer group, and thus it
+                        // needs to run in the CREATED lifecycle so it can continue to watch while
+                        // invisible. See (b/291031862) for details
+                        launch {
+                            visibilityState.collect { visibilityState ->
+                                // for b/296864006, we can not hide all the child views if
+                                // visibilityState is STATE_HIDDEN. Because hiding all child views
+                                // would cause the getWidth() of this view return 0, and that would
+                                // cause the translation calculation fails in StatusIconContainer.
+                                // Therefore, like class MobileIconBinder, instead of set the child
+                                // views visibility to View.GONE, we set their visibility to
+                                // View.INVISIBLE to make them invisible but keep the width.
+                                ModernStatusBarViewVisibilityHelper.setVisibilityState(
+                                    visibilityState,
+                                    view.composeView,
+                                    view.dotView,
+                                )
+                            }
+                        }
+
+                        launch { iconTint.collect { tint -> view.dotView.setDecorColor(tint) } }
+
+                        launch {
+                            decorTint.collect { decorTint -> view.dotView.setDecorColor(decorTint) }
+                        }
+
+                        try {
+                            awaitCancellation()
+                        } finally {
+                            isCollecting = false
+                        }
+                    }
+                }
+            }
+
+            return object : ModernStatusBarViewBinding {
+                override fun getShouldIconBeVisible(): Boolean {
+                    return shouldBeVisible()
+                }
+
+                override fun onVisibilityStateChanged(state: Int) {
+                    visibilityState.value = state
+                }
+
+                override fun onIconTintChanged(newTint: Int, contrastTint: Int) {
+                    iconTint.value = newTint
+                }
+
+                override fun onDecorTintChanged(newTint: Int) {
+                    decorTint.value = newTint
+                }
+
+                override fun isCollecting(): Boolean {
+                    return isCollecting
+                }
+            }
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModel.kt
index 1bc45a9..f396cbf 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModel.kt
@@ -19,6 +19,7 @@
 import android.annotation.ColorInt
 import android.graphics.Rect
 import android.view.View
+import androidx.compose.runtime.getValue
 import com.android.systemui.dagger.qualifiers.Background
 import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
 import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
@@ -28,6 +29,8 @@
 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.TransitionState
+import com.android.systemui.lifecycle.ExclusiveActivatable
+import com.android.systemui.lifecycle.Hydrator
 import com.android.systemui.log.table.TableLogBufferFactory
 import com.android.systemui.log.table.logDiffsForTable
 import com.android.systemui.plugins.DarkIconDispatcher
@@ -55,8 +58,10 @@
 import com.android.systemui.statusbar.notification.headsup.PinnedStatus
 import com.android.systemui.statusbar.notification.shared.NotificationsLiveDataStoreRefactor
 import com.android.systemui.statusbar.phone.domain.interactor.DarkIconInteractor
+import com.android.systemui.statusbar.phone.domain.interactor.IsAreaDark
 import com.android.systemui.statusbar.phone.domain.interactor.LightsOutInteractor
 import com.android.systemui.statusbar.phone.ongoingcall.StatusBarChipsModernization
+import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.BatteryViewModel
 import com.android.systemui.statusbar.pipeline.shared.domain.interactor.HomeStatusBarIconBlockListInteractor
 import com.android.systemui.statusbar.pipeline.shared.domain.interactor.HomeStatusBarInteractor
 import com.android.systemui.statusbar.pipeline.shared.ui.model.SystemInfoCombinedVisibilityModel
@@ -90,6 +95,9 @@
  * so that it's all in one place and easily testable outside of the fragment.
  */
 interface HomeStatusBarViewModel {
+    /** Factory to create the view model for the battery icon */
+    val batteryViewModelFactory: BatteryViewModel.Factory
+
     /**
      * True if the device is currently transitioning from lockscreen to occluded and false
      * otherwise.
@@ -171,6 +179,9 @@
      */
     val areaTint: Flow<StatusBarTintColor>
 
+    /** [IsAreaDark] applicable for this status bar's display and content area */
+    val areaDark: IsAreaDark
+
     /** Interface for the assisted factory, to allow for providing a fake in tests */
     interface HomeStatusBarViewModelFactory {
         fun create(displayId: Int): HomeStatusBarViewModel
@@ -181,6 +192,7 @@
 @AssistedInject
 constructor(
     @Assisted thisDisplayId: Int,
+    override val batteryViewModelFactory: BatteryViewModel.Factory,
     tableLoggerFactory: TableLogBufferFactory,
     homeStatusBarInteractor: HomeStatusBarInteractor,
     homeStatusBarIconBlockListInteractor: HomeStatusBarIconBlockListInteractor,
@@ -201,7 +213,9 @@
     statusBarContentInsetsViewModelStore: StatusBarContentInsetsViewModelStore,
     @Background bgScope: CoroutineScope,
     @Background bgDispatcher: CoroutineDispatcher,
-) : HomeStatusBarViewModel {
+) : HomeStatusBarViewModel, ExclusiveActivatable() {
+
+    private val hydrator = Hydrator(traceName = "HomeStatusBarViewModel.hydrator")
 
     val tableLogger = tableLoggerFactory.getOrCreate(tableLogBufferName(thisDisplayId), 200)
 
@@ -294,6 +308,13 @@
             .distinctUntilChanged()
             .flowOn(bgDispatcher)
 
+    override val areaDark: IsAreaDark by
+        hydrator.hydratedStateOf(
+            traceName = "areaDark",
+            initialValue = IsAreaDark { true },
+            source = darkIconInteractor.isAreaDark(thisDisplayId),
+        )
+
     /**
      * True if the current SysUI state can show the home status bar (aka this status bar), and false
      * if we shouldn't be showing any part of the home status bar.
@@ -473,6 +494,10 @@
     @View.Visibility
     private fun Boolean.toVisibleOrInvisible(): Int = if (this) View.VISIBLE else View.INVISIBLE
 
+    override suspend fun onActivated(): Nothing {
+        hydrator.activate()
+    }
+
     /** Inject this to create the display-dependent view model */
     @AssistedFactory
     interface HomeStatusBarViewModelFactoryImpl :
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
index ccd7560..dd742ff 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
@@ -55,6 +55,7 @@
 import com.android.systemui.res.R;
 import com.android.systemui.settings.UserTracker;
 import com.android.systemui.statusbar.CommandQueue;
+import com.android.systemui.statusbar.core.StatusBarRootModernization;
 import com.android.systemui.statusbar.phone.ui.StatusBarIconController;
 import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener;
 import com.android.systemui.tuner.TunerService;
@@ -216,7 +217,9 @@
 
         // Make sure we update to the current time
         updateClock();
-        updateClockVisibility();
+        if (!StatusBarRootModernization.isEnabled()) {
+            updateClockVisibility();
+        }
         updateShowSeconds();
     }
 
@@ -275,19 +278,25 @@
 
     @Override
     public void setVisibility(int visibility) {
-        if (visibility == View.VISIBLE && !shouldBeVisible()) {
-            return;
+        if (!StatusBarRootModernization.isEnabled()) {
+            if (visibility == View.VISIBLE && !shouldBeVisible()) {
+                return;
+            }
         }
 
         super.setVisibility(visibility);
     }
 
-    public void setClockVisibleByUser(boolean visible) {
+    private void setClockVisibleByUser(boolean visible) {
+        StatusBarRootModernization.assertInLegacyMode();
+
         mClockVisibleByUser = visible;
         updateClockVisibility();
     }
 
-    public void setClockVisibilityByPolicy(boolean visible) {
+    private void setClockVisibilityByPolicy(boolean visible) {
+        StatusBarRootModernization.assertInLegacyMode();
+
         mClockVisibleByPolicy = visible;
         updateClockVisibility();
     }
@@ -297,6 +306,8 @@
     }
 
     private void updateClockVisibility() {
+        StatusBarRootModernization.assertInLegacyMode();
+
         boolean visible = shouldBeVisible();
         int visibility = visible ? View.VISIBLE : View.GONE;
         super.setVisibility(visibility);
@@ -346,15 +357,23 @@
         if (CLOCK_SECONDS.equals(key)) {
             mShowSeconds = TunerService.parseIntegerSwitch(newValue, false);
             updateShowSeconds();
-        } else if (StatusBarIconController.ICON_HIDE_LIST.equals(key)) {
-            setClockVisibleByUser(!StatusBarIconController.getIconHideList(getContext(), newValue)
-                    .contains("clock"));
-            updateClockVisibility();
+        } else if (!StatusBarRootModernization.isEnabled()) {
+            if (StatusBarIconController.ICON_HIDE_LIST.equals(key)) {
+                setClockVisibleByUser(
+                        !StatusBarIconController
+                                .getIconHideList(getContext(), newValue)
+                                .contains("clock"));
+                updateClockVisibility();
+            }
         }
     }
 
     @Override
     public void disable(int displayId, int state1, int state2, boolean animate) {
+        if (StatusBarRootModernization.isEnabled()) {
+            return;
+        }
+
         if (displayId != getDisplay().getDisplayId()) {
             return;
         }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java
index 9ad8619..1d1826d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java
@@ -17,7 +17,6 @@
 package com.android.systemui.statusbar.policy;
 
 import android.app.AlarmManager;
-import android.app.Flags;
 import android.app.NotificationManager;
 import android.content.BroadcastReceiver;
 import android.content.ContentResolver;
@@ -175,11 +174,7 @@
 
     @Override
     public void setZen(int zen, Uri conditionId, String reason) {
-        if (Flags.modesApi()) {
-            mNoMan.setZenMode(zen, conditionId, reason, /* fromUser= */ true);
-        } else {
-            mNoMan.setZenMode(zen, conditionId, reason);
-        }
+        mNoMan.setZenMode(zen, conditionId, reason, /* fromUser= */ true);
     }
 
     @Override
diff --git a/packages/SystemUI/src/com/android/systemui/unfold/DisplaySwitchLatencyTracker.kt b/packages/SystemUI/src/com/android/systemui/unfold/DisplaySwitchLatencyTracker.kt
index cd401d5..e1640cd 100644
--- a/packages/SystemUI/src/com/android/systemui/unfold/DisplaySwitchLatencyTracker.kt
+++ b/packages/SystemUI/src/com/android/systemui/unfold/DisplaySwitchLatencyTracker.kt
@@ -214,7 +214,12 @@
 
     private suspend fun waitForScreenTurnedOn() {
         traceAsync(TAG, "waitForScreenTurnedOn()") {
-            powerInteractor.screenPowerState.filter { it == ScreenPowerState.SCREEN_ON }.first()
+            // dropping first as it's stateFlow and will always emit latest value but we're
+            // only interested in new states
+            powerInteractor.screenPowerState
+                .drop(1)
+                .filter { it == ScreenPowerState.SCREEN_ON }
+                .first()
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/unfold/NoCooldownDisplaySwitchLatencyTracker.kt b/packages/SystemUI/src/com/android/systemui/unfold/NoCooldownDisplaySwitchLatencyTracker.kt
index 6ac0bb1..91f1426 100644
--- a/packages/SystemUI/src/com/android/systemui/unfold/NoCooldownDisplaySwitchLatencyTracker.kt
+++ b/packages/SystemUI/src/com/android/systemui/unfold/NoCooldownDisplaySwitchLatencyTracker.kt
@@ -50,6 +50,7 @@
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.TimeoutCancellationException
 import kotlinx.coroutines.asCoroutineDispatcher
+import kotlinx.coroutines.flow.drop
 import kotlinx.coroutines.flow.filter
 import kotlinx.coroutines.flow.first
 import kotlinx.coroutines.flow.flatMapLatest
@@ -160,7 +161,12 @@
 
     private suspend fun waitForScreenTurnedOn() {
         traceAsync(TAG, "waitForScreenTurnedOn()") {
-            powerInteractor.screenPowerState.filter { it == ScreenPowerState.SCREEN_ON }.first()
+            // dropping first as it's stateFlow and will always emit latest value but we're
+            // only interested in new states
+            powerInteractor.screenPowerState
+                .drop(1)
+                .filter { it == ScreenPowerState.SCREEN_ON }
+                .first()
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/util/concurrency/GlobalConcurrencyModule.java b/packages/SystemUI/src/com/android/systemui/util/concurrency/GlobalConcurrencyModule.java
index 70774f13..c43e763 100644
--- a/packages/SystemUI/src/com/android/systemui/util/concurrency/GlobalConcurrencyModule.java
+++ b/packages/SystemUI/src/com/android/systemui/util/concurrency/GlobalConcurrencyModule.java
@@ -65,15 +65,6 @@
     }
 
     /**
-     * @deprecated Use @Main Handler.
-     */
-    @Deprecated
-    @Provides
-    public static Handler provideHandler() {
-        return new Handler();
-    }
-
-    /**
      * Provide an Executor specifically for running UI operations on a separate thread.
      *
      * Keep submitted runnables short and to the point, just as with any other UI code.
diff --git a/packages/SystemUI/src/com/android/systemui/util/concurrency/SysUIConcurrencyModule.kt b/packages/SystemUI/src/com/android/systemui/util/concurrency/SysUIConcurrencyModule.kt
index a7abb6b..5b5f85c 100644
--- a/packages/SystemUI/src/com/android/systemui/util/concurrency/SysUIConcurrencyModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/util/concurrency/SysUIConcurrencyModule.kt
@@ -53,6 +53,14 @@
     private const val NOTIFICATION_INFLATION_SLOW_DISPATCH_THRESHOLD = 1000L
     private const val NOTIFICATION_INFLATION_SLOW_DELIVERY_THRESHOLD = 1000L
 
+    /**
+     * Choreographer instance for the main thread.
+     * TODO(b/395887935): Lets move this to @Main and provide thread-local references
+     */
+    @Provides
+    @SysUISingleton
+    fun providesChoreographer(): Choreographer = Choreographer.getInstance()
+
     /** Background Looper */
     @Provides
     @SysUISingleton
@@ -99,10 +107,7 @@
     @Provides
     @SysUISingleton
     @NotifInflation
-    fun provideNotifInflationLooper(@Background bgLooper: Looper): Looper {
-        if (!Flags.dedicatedNotifInflationThread()) {
-            return bgLooper
-        }
+    fun provideNotifInflationLooper(): Looper {
         val thread = HandlerThread("NotifInflation", Process.THREAD_PRIORITY_BACKGROUND)
         thread.start()
         val looper = thread.getLooper()
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/dagger/module/VolumeDialogModule.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/dagger/module/VolumeDialogModule.kt
index 025e269..7b08317 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/dialog/dagger/module/VolumeDialogModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/dagger/module/VolumeDialogModule.kt
@@ -18,8 +18,13 @@
 
 import com.android.systemui.volume.dialog.ringer.data.repository.VolumeDialogRingerFeedbackRepository
 import com.android.systemui.volume.dialog.ringer.data.repository.VolumeDialogRingerFeedbackRepositoryImpl
+import com.android.systemui.volume.dialog.ringer.ui.binder.VolumeDialogRingerViewBinder
+import com.android.systemui.volume.dialog.settings.ui.binder.VolumeDialogSettingsButtonViewBinder
+import com.android.systemui.volume.dialog.sliders.ui.VolumeDialogSlidersViewBinder
+import com.android.systemui.volume.dialog.ui.binder.ViewBinder
 import dagger.Binds
 import dagger.Module
+import dagger.Provides
 
 /** Dagger module for volume dialog code in the volume package */
 @Module
@@ -29,4 +34,14 @@
     fun bindVolumeDialogRingerFeedbackRepository(
         ringerFeedbackRepository: VolumeDialogRingerFeedbackRepositoryImpl
     ): VolumeDialogRingerFeedbackRepository
+
+    companion object {
+
+        @Provides
+        fun provideViewBinders(
+            slidersViewBinder: VolumeDialogSlidersViewBinder,
+            ringerViewBinder: VolumeDialogRingerViewBinder,
+            settingsButtonViewBinder: VolumeDialogSettingsButtonViewBinder,
+        ): List<ViewBinder> = listOf(slidersViewBinder, ringerViewBinder, settingsButtonViewBinder)
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/binder/VolumeDialogRingerViewBinder.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/binder/VolumeDialogRingerViewBinder.kt
index 92ec4f5..ef75057 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/binder/VolumeDialogRingerViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/binder/VolumeDialogRingerViewBinder.kt
@@ -39,6 +39,7 @@
 import com.android.systemui.volume.dialog.ringer.ui.viewmodel.RingerViewModel
 import com.android.systemui.volume.dialog.ringer.ui.viewmodel.RingerViewModelState
 import com.android.systemui.volume.dialog.ringer.ui.viewmodel.VolumeDialogRingerDrawerViewModel
+import com.android.systemui.volume.dialog.ui.binder.ViewBinder
 import com.android.systemui.volume.dialog.ui.utils.suspendAnimate
 import com.android.systemui.volume.dialog.ui.viewmodel.VolumeDialogViewModel
 import javax.inject.Inject
@@ -60,7 +61,7 @@
 constructor(
     private val viewModel: VolumeDialogRingerDrawerViewModel,
     private val dialogViewModel: VolumeDialogViewModel,
-) {
+) : ViewBinder {
     private val roundnessSpringForce =
         SpringForce(1F).apply {
             stiffness = 800F
@@ -73,10 +74,11 @@
         }
     private val rgbEvaluator = ArgbEvaluator()
 
-    fun CoroutineScope.bind(view: View) {
+    override fun CoroutineScope.bind(view: View) {
         val volumeDialogBackgroundView = view.requireViewById<View>(R.id.volume_dialog_background)
         val ringerBackgroundView = view.requireViewById<View>(R.id.ringer_buttons_background)
         val drawerContainer = view.requireViewById<MotionLayout>(R.id.volume_ringer_drawer)
+
         val unselectedButtonUiModel = RingerButtonUiModel.getUnselectedButton(view.context)
         val selectedButtonUiModel = RingerButtonUiModel.getSelectedButton(view.context)
         val volumeDialogBgSmallRadius =
@@ -120,7 +122,7 @@
         drawerContainer.setTransitionListener(ringerDrawerTransitionListener)
         volumeDialogBackgroundView.background = volumeDialogBackgroundView.background.mutate()
         ringerBackgroundView.background = ringerBackgroundView.background.mutate()
-        launch { dialogViewModel.addTouchableBounds(drawerContainer) }
+        launch { dialogViewModel.addTouchableBounds(ringerBackgroundView) }
 
         viewModel.ringerViewModel
             .mapLatest { ringerState ->
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/settings/ui/binder/VolumeDialogSettingsButtonViewBinder.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/settings/ui/binder/VolumeDialogSettingsButtonViewBinder.kt
index a330685..54f04e2 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/dialog/settings/ui/binder/VolumeDialogSettingsButtonViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/settings/ui/binder/VolumeDialogSettingsButtonViewBinder.kt
@@ -21,6 +21,7 @@
 import com.android.systemui.res.R
 import com.android.systemui.volume.dialog.dagger.scope.VolumeDialogScope
 import com.android.systemui.volume.dialog.settings.ui.viewmodel.VolumeDialogSettingsButtonViewModel
+import com.android.systemui.volume.dialog.ui.binder.ViewBinder
 import com.android.systemui.volume.dialog.ui.viewmodel.VolumeDialogViewModel
 import javax.inject.Inject
 import kotlinx.coroutines.CoroutineScope
@@ -34,9 +35,9 @@
 constructor(
     private val viewModel: VolumeDialogSettingsButtonViewModel,
     private val dialogViewModel: VolumeDialogViewModel,
-) {
+) : ViewBinder {
 
-    fun CoroutineScope.bind(view: View) {
+    override fun CoroutineScope.bind(view: View) {
         val button = view.requireViewById<ImageButton>(R.id.volume_dialog_settings)
         launch { dialogViewModel.addTouchableBounds(button) }
         viewModel.isVisible
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderViewBinder.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderViewBinder.kt
index a51e33a..2c9ee54 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderViewBinder.kt
@@ -19,7 +19,6 @@
 import android.graphics.drawable.Drawable
 import android.view.View
 import androidx.compose.animation.AnimatedVisibility
-import androidx.compose.animation.core.Animatable
 import androidx.compose.animation.core.tween
 import androidx.compose.animation.fadeIn
 import androidx.compose.animation.fadeOut
@@ -61,11 +60,9 @@
 import javax.inject.Inject
 import kotlin.math.round
 import kotlin.math.roundToInt
-import kotlinx.coroutines.Job
 import kotlinx.coroutines.coroutineScope
 import kotlinx.coroutines.currentCoroutineContext
 import kotlinx.coroutines.isActive
-import kotlinx.coroutines.launch
 
 @VolumeDialogSliderScope
 class VolumeDialogSliderViewBinder
@@ -116,10 +113,6 @@
 
     val steps = with(sliderStateModel.valueRange) { endInclusive - start - 1 }.toInt()
 
-    var animateJob: Job? = null
-    val animatedSliderValue =
-        remember(sliderStateModel.value) { Animatable(sliderStateModel.value) }
-
     val interactionSource = remember { MutableInteractionSource() }
     val hapticsViewModel: SliderHapticsViewModel? =
         hapticsViewModelFactory?.let {
@@ -149,16 +142,7 @@
                         hapticsViewModel?.onValueChangeEnded()
                     }
                     sliderState.onValueChange = { newValue ->
-                        if (newValue != animatedSliderValue.targetValue) {
-                            animateJob?.cancel()
-                            animateJob =
-                                coroutineScope.launch {
-                                    animatedSliderValue.animateTo(newValue) {
-                                        sliderState.value = value
-                                    }
-                                }
-                        }
-
+                        sliderState.value = newValue
                         hapticsViewModel?.addVelocityDataPoint(newValue)
                         overscrollViewModel.setSlider(
                             value = sliderState.value,
@@ -173,7 +157,7 @@
     var lastDiscreteStep by remember { mutableFloatStateOf(round(sliderStateModel.value)) }
     LaunchedEffect(sliderStateModel.value) {
         val value = sliderStateModel.value
-        launch { animatedSliderValue.animateTo(value) }
+        sliderState.value = value
         if (value != lastDiscreteStep) {
             lastDiscreteStep = value
             hapticsViewModel?.onValueChange(value)
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSlidersViewBinder.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSlidersViewBinder.kt
index 7f58c83..0d970e5 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSlidersViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSlidersViewBinder.kt
@@ -25,6 +25,7 @@
 import com.android.systemui.volume.dialog.dagger.scope.VolumeDialogScope
 import com.android.systemui.volume.dialog.sliders.dagger.VolumeDialogSliderComponent
 import com.android.systemui.volume.dialog.sliders.ui.viewmodel.VolumeDialogSlidersViewModel
+import com.android.systemui.volume.dialog.ui.binder.ViewBinder
 import com.android.systemui.volume.dialog.ui.viewmodel.VolumeDialogViewModel
 import javax.inject.Inject
 import kotlinx.coroutines.CoroutineScope
@@ -38,16 +39,16 @@
 constructor(
     private val viewModel: VolumeDialogSlidersViewModel,
     private val dialogViewModel: VolumeDialogViewModel,
-) {
+) : ViewBinder {
 
-    fun CoroutineScope.bind(view: View) {
+    override fun CoroutineScope.bind(view: View) {
         val floatingSlidersContainer: ViewGroup =
             view.requireViewById(R.id.volume_dialog_floating_sliders_container)
         val mainSliderContainer: View =
             view.requireViewById(R.id.volume_dialog_main_slider_container)
         val background: View = view.requireViewById(R.id.volume_dialog_background)
-        val settingsButton: View = view.requireViewById(R.id.volume_dialog_settings)
-        val ringerDrawer: View = view.requireViewById(R.id.volume_ringer_drawer)
+        val bottomSection: View = view.requireViewById(R.id.volume_dialog_bottom_section_container)
+        val topSection: View = view.requireViewById(R.id.volume_dialog_top_section_container)
 
         launch { dialogViewModel.addTouchableBounds(mainSliderContainer, floatingSlidersContainer) }
         viewModel.sliders
@@ -55,7 +56,7 @@
                 bindSlider(
                     uiModel.sliderComponent,
                     mainSliderContainer,
-                    arrayOf(mainSliderContainer, background, settingsButton, ringerDrawer),
+                    arrayOf(mainSliderContainer, background, bottomSection, topSection),
                 )
 
                 val floatingSliderViewBinders = uiModel.floatingSliderComponent
diff --git a/core/java/com/android/internal/app/IAppOpsCallback.aidl b/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/binder/ViewBinder.kt
similarity index 61%
copy from core/java/com/android/internal/app/IAppOpsCallback.aidl
copy to packages/SystemUI/src/com/android/systemui/volume/dialog/ui/binder/ViewBinder.kt
index 3a9525c..4d1af0d 100644
--- a/core/java/com/android/internal/app/IAppOpsCallback.aidl
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/binder/ViewBinder.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2013 The Android Open Source Project
+ * Copyright (C) 2025 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,10 +14,12 @@
  * limitations under the License.
  */
 
-package com.android.internal.app;
+package com.android.systemui.volume.dialog.ui.binder
 
-// This interface is also used by native code, so must
-// be kept in sync with frameworks/native/libs/permission/include/binder/IAppOpsCallback.h
-oneway interface IAppOpsCallback {
-    void opChanged(int op, int uid, String packageName, String persistentDeviceId);
+import android.view.View
+import kotlinx.coroutines.CoroutineScope
+
+interface ViewBinder {
+
+    fun CoroutineScope.bind(view: View)
 }
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/binder/VolumeDialogViewBinder.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/binder/VolumeDialogViewBinder.kt
index 7cc4bcc..98042d5 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/binder/VolumeDialogViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/binder/VolumeDialogViewBinder.kt
@@ -17,28 +17,28 @@
 package com.android.systemui.volume.dialog.ui.binder
 
 import android.app.Dialog
-import android.content.res.Resources
 import android.view.View
 import android.view.ViewTreeObserver
 import android.view.WindowInsets
+import androidx.compose.ui.util.lerp
 import androidx.constraintlayout.motion.widget.MotionLayout
 import androidx.core.view.updatePadding
+import androidx.dynamicanimation.animation.DynamicAnimation
+import androidx.dynamicanimation.animation.FloatValueHolder
+import androidx.dynamicanimation.animation.SpringAnimation
+import androidx.dynamicanimation.animation.SpringForce
 import com.android.internal.view.RotationPolicy
 import com.android.systemui.common.ui.view.onApplyWindowInsets
-import com.android.systemui.dagger.qualifiers.Main
 import com.android.systemui.res.R
 import com.android.systemui.util.kotlin.awaitCancellationThenDispose
-import com.android.systemui.volume.SystemUIInterpolators
 import com.android.systemui.volume.dialog.dagger.scope.VolumeDialogScope
-import com.android.systemui.volume.dialog.ringer.ui.binder.VolumeDialogRingerViewBinder
-import com.android.systemui.volume.dialog.settings.ui.binder.VolumeDialogSettingsButtonViewBinder
 import com.android.systemui.volume.dialog.shared.model.VolumeDialogVisibilityModel
-import com.android.systemui.volume.dialog.sliders.ui.VolumeDialogSlidersViewBinder
 import com.android.systemui.volume.dialog.ui.utils.JankListenerFactory
 import com.android.systemui.volume.dialog.ui.utils.suspendAnimate
 import com.android.systemui.volume.dialog.ui.viewmodel.VolumeDialogViewModel
 import com.android.systemui.volume.dialog.utils.VolumeTracer
 import javax.inject.Inject
+import kotlin.math.ceil
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.Flow
@@ -50,26 +50,25 @@
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.suspendCancellableCoroutine
 
+private const val SPRING_STIFFNESS = 700f
+private const val SPRING_DAMPING_RATIO = 0.9f
+
+private const val FRACTION_HIDE = 0f
+private const val FRACTION_SHOW = 1f
+private const val ANIMATION_MINIMUM_VISIBLE_CHANGE = 0.01f
+
 /** Binds the root view of the Volume Dialog. */
 @OptIn(ExperimentalCoroutinesApi::class)
 @VolumeDialogScope
 class VolumeDialogViewBinder
 @Inject
 constructor(
-    @Main resources: Resources,
     private val viewModel: VolumeDialogViewModel,
     private val jankListenerFactory: JankListenerFactory,
     private val tracer: VolumeTracer,
-    private val volumeDialogRingerViewBinder: VolumeDialogRingerViewBinder,
-    private val slidersViewBinder: VolumeDialogSlidersViewBinder,
-    private val settingsButtonViewBinder: VolumeDialogSettingsButtonViewBinder,
+    private val viewBinders: List<@JvmSuppressWildcards ViewBinder>,
 ) {
 
-    private val dialogShowAnimationDurationMs =
-        resources.getInteger(R.integer.config_dialogShowAnimationDurationMs).toLong()
-    private val dialogHideAnimationDurationMs =
-        resources.getInteger(R.integer.config_dialogHideAnimationDurationMs).toLong()
-
     fun CoroutineScope.bind(dialog: Dialog) {
         val insets: MutableStateFlow<WindowInsets> =
             MutableStateFlow(WindowInsets.Builder().build())
@@ -105,9 +104,9 @@
                 .awaitCancellationThenDispose()
         }
 
-        with(volumeDialogRingerViewBinder) { bind(root) }
-        with(slidersViewBinder) { bind(root) }
-        with(settingsButtonViewBinder) { bind(root) }
+        for (viewBinder in viewBinders) {
+            with(viewBinder) { bind(root) }
+        }
     }
 
     private fun CoroutineScope.animateVisibility(
@@ -115,22 +114,35 @@
         dialog: Dialog,
         visibilityModel: Flow<VolumeDialogVisibilityModel>,
     ) {
+        view.applyAnimationProgress(FRACTION_HIDE)
+        val animationValueHolder = FloatValueHolder(FRACTION_HIDE)
+        val animation: SpringAnimation =
+            SpringAnimation(animationValueHolder)
+                .setSpring(
+                    SpringForce()
+                        .setStiffness(SPRING_STIFFNESS)
+                        .setDampingRatio(SPRING_DAMPING_RATIO)
+                )
+                .setMinimumVisibleChange(ANIMATION_MINIMUM_VISIBLE_CHANGE)
+                .addUpdateListener { _, value, _ -> view.applyAnimationProgress(value) }
+        var junkListener: DynamicAnimation.OnAnimationUpdateListener? = null
+
         visibilityModel
             .mapLatest {
                 when (it) {
                     is VolumeDialogVisibilityModel.Visible -> {
                         tracer.traceVisibilityEnd(it)
-                        view.animateShow(
-                            duration = dialogShowAnimationDurationMs,
-                            translationX = calculateTranslationX(view),
-                        )
+                        junkListener?.let(animation::removeUpdateListener)
+                        junkListener =
+                            jankListenerFactory.show(view).also(animation::addUpdateListener)
+                        animation.suspendAnimate(FRACTION_SHOW)
                     }
                     is VolumeDialogVisibilityModel.Dismissed -> {
                         tracer.traceVisibilityEnd(it)
-                        view.animateHide(
-                            duration = dialogHideAnimationDurationMs,
-                            translationX = calculateTranslationX(view),
-                        )
+                        junkListener?.let(animation::removeUpdateListener)
+                        junkListener =
+                            jankListenerFactory.dismiss(view).also(animation::addUpdateListener)
+                        animation.suspendAnimate(FRACTION_HIDE)
                         dialog.dismiss()
                     }
                     is VolumeDialogVisibilityModel.Invisible -> {
@@ -141,37 +153,21 @@
             .launchIn(this)
     }
 
-    private fun calculateTranslationX(view: View): Float? {
-        return if (view.display.rotation == RotationPolicy.NATURAL_ROTATION) {
-            if (view.isLayoutRtl) {
-                -1
+    /**
+     * @param fraction in range [0, 1]. 0 corresponds to the dialog being hidden and 1 - visible.
+     */
+    private fun View.applyAnimationProgress(fraction: Float) {
+        alpha = ceil(fraction)
+        if (display.rotation == RotationPolicy.NATURAL_ROTATION) {
+                if (isLayoutRtl) {
+                    -1
+                } else {
+                    1
+                } * width / 2f
             } else {
-                1
-            } * view.width / 2f
-        } else {
-            null
-        }
-    }
-
-    private suspend fun View.animateShow(duration: Long, translationX: Float?) {
-        translationX?.let { setTranslationX(translationX) }
-        alpha = 0f
-        animate()
-            .alpha(1f)
-            .translationX(0f)
-            .setDuration(duration)
-            .setInterpolator(SystemUIInterpolators.LogDecelerateInterpolator())
-            .suspendAnimate(jankListenerFactory.show(this, duration))
-    }
-
-    private suspend fun View.animateHide(duration: Long, translationX: Float?) {
-        val animator =
-            animate()
-                .alpha(0f)
-                .setDuration(duration)
-                .setInterpolator(SystemUIInterpolators.LogAccelerateInterpolator())
-        translationX?.let { animator.translationX(it) }
-        animator.suspendAnimate(jankListenerFactory.dismiss(this, duration))
+                null
+            }
+            ?.let { maxTranslationX -> translationX = lerp(maxTranslationX, 0f, fraction) }
     }
 
     private suspend fun ViewTreeObserver.listenToComputeInternalInsets() =
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/utils/JankListenerFactory.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/utils/JankListenerFactory.kt
index 9fcd777..803911a 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/utils/JankListenerFactory.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/utils/JankListenerFactory.kt
@@ -17,8 +17,8 @@
 package com.android.systemui.volume.dialog.ui.utils
 
 import android.animation.Animator
-import android.animation.AnimatorListenerAdapter
 import android.view.View
+import androidx.dynamicanimation.animation.DynamicAnimation
 import com.android.internal.jank.Cuj
 import com.android.internal.jank.InteractionJankMonitor
 import com.android.systemui.volume.dialog.dagger.scope.VolumeDialogPluginScope
@@ -30,35 +30,36 @@
 @Inject
 constructor(private val interactionJankMonitor: InteractionJankMonitor) {
 
-    fun show(view: View, timeout: Long) = getJunkListener(view, "show", timeout)
+    fun show(view: View): DynamicAnimation.OnAnimationUpdateListener {
+        return createJunkListener(view, "show")
+    }
 
-    fun update(view: View, timeout: Long) = getJunkListener(view, "update", timeout)
+    fun dismiss(view: View): DynamicAnimation.OnAnimationUpdateListener {
+        return createJunkListener(view, "dismiss")
+    }
 
-    fun dismiss(view: View, timeout: Long) = getJunkListener(view, "dismiss", timeout)
-
-    private fun getJunkListener(
+    private fun createJunkListener(
         view: View,
         type: String,
-        timeout: Long,
-    ): Animator.AnimatorListener {
-        return object : AnimatorListenerAdapter() {
-            override fun onAnimationStart(animation: Animator) {
+    ): DynamicAnimation.OnAnimationUpdateListener {
+        var trackedStart = false
+        return DynamicAnimation.OnAnimationUpdateListener { animation, _, _ ->
+            if (!trackedStart) {
+                trackedStart = true
                 interactionJankMonitor.begin(
                     InteractionJankMonitor.Configuration.Builder.withView(
                             Cuj.CUJ_VOLUME_CONTROL,
                             view,
                         )
                         .setTag(type)
-                        .setTimeout(timeout)
                 )
-            }
-
-            override fun onAnimationEnd(animation: Animator) {
-                interactionJankMonitor.end(Cuj.CUJ_VOLUME_CONTROL)
-            }
-
-            override fun onAnimationCancel(animation: Animator) {
-                interactionJankMonitor.cancel(Cuj.CUJ_VOLUME_CONTROL)
+                animation.addEndListener { _, canceled, _, _ ->
+                    if (canceled) {
+                        interactionJankMonitor.cancel(Cuj.CUJ_VOLUME_CONTROL)
+                    } else {
+                        interactionJankMonitor.end(Cuj.CUJ_VOLUME_CONTROL)
+                    }
+                }
             }
         }
     }
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/utils/SuspendAnimators.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/utils/SuspendAnimators.kt
index 52a19e09..31e596f 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/utils/SuspendAnimators.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/utils/SuspendAnimators.kt
@@ -96,21 +96,23 @@
  * Starts spring animation and suspends until it's finished. Cancels the animation if the running
  * coroutine is cancelled.
  */
-suspend fun SpringAnimation.suspendAnimate(onAnimationUpdate: (Float) -> Unit) =
-    suspendCancellableCoroutine { continuation ->
-        val updateListener =
-            DynamicAnimation.OnAnimationUpdateListener { _, value, _ -> onAnimationUpdate(value) }
-        val endListener =
-            DynamicAnimation.OnAnimationEndListener { _, _, _, _ -> continuation.resumeIfCan(Unit) }
-        addUpdateListener(updateListener)
-        addEndListener(endListener)
-        animateToFinalPosition(1F)
-        continuation.invokeOnCancellation {
-            removeUpdateListener(updateListener)
-            removeEndListener(endListener)
-            cancel()
-        }
+suspend fun SpringAnimation.suspendAnimate(
+    finalPosition: Float = 1f,
+    onAnimationUpdate: (Float) -> Unit = {},
+) = suspendCancellableCoroutine { continuation ->
+    val updateListener =
+        DynamicAnimation.OnAnimationUpdateListener { _, value, _ -> onAnimationUpdate(value) }
+    val endListener =
+        DynamicAnimation.OnAnimationEndListener { _, _, _, _ -> continuation.resumeIfCan(Unit) }
+    addUpdateListener(updateListener)
+    addEndListener(endListener)
+    animateToFinalPosition(finalPosition)
+    continuation.invokeOnCancellation {
+        removeUpdateListener(updateListener)
+        removeEndListener(endListener)
+        cancel()
     }
+}
 
 /**
  * Starts the animation and suspends until it's finished. Cancels the animation if the running
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioSharingStreamSliderViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioSharingStreamSliderViewModel.kt
index e2d2f3f..3efb2b4 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioSharingStreamSliderViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioSharingStreamSliderViewModel.kt
@@ -16,7 +16,6 @@
 
 package com.android.systemui.volume.panel.component.volume.slider.ui.viewmodel
 
-import android.content.Context
 import com.android.internal.logging.UiEventLogger
 import com.android.systemui.Flags
 import com.android.systemui.common.shared.model.Icon
@@ -24,6 +23,7 @@
 import com.android.systemui.haptics.slider.compose.ui.SliderHapticsViewModel
 import com.android.systemui.res.R
 import com.android.systemui.volume.domain.interactor.AudioSharingInteractor
+import com.android.systemui.volume.panel.shared.VolumePanelLogger
 import com.android.systemui.volume.panel.ui.VolumePanelUiEvent
 import dagger.assisted.Assisted
 import dagger.assisted.AssistedFactory
@@ -34,6 +34,7 @@
 import kotlinx.coroutines.flow.SharingStarted
 import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.distinctUntilChanged
 import kotlinx.coroutines.flow.filterNotNull
 import kotlinx.coroutines.flow.launchIn
 import kotlinx.coroutines.flow.onEach
@@ -43,21 +44,25 @@
 @AssistedInject
 constructor(
     @Assisted private val coroutineScope: CoroutineScope,
-    private val context: Context,
     private val audioSharingInteractor: AudioSharingInteractor,
     private val uiEventLogger: UiEventLogger,
     private val hapticsViewModelFactory: SliderHapticsViewModel.Factory,
+    private val volumePanelLogger: VolumePanelLogger,
 ) : SliderViewModel {
     private val volumeChanges = MutableStateFlow<Int?>(null)
 
     override val slider: StateFlow<SliderState> =
-        combine(audioSharingInteractor.volume, audioSharingInteractor.secondaryDevice) {
-                volume,
-                device ->
+        combine(
+                audioSharingInteractor.volume.distinctUntilChanged().onEach {
+                    it?.let(volumePanelLogger::onAudioSharingVolumeUpdateReceived)
+                },
+                audioSharingInteractor.secondaryDevice,
+            ) { volume, device ->
                 val deviceName = device?.name ?: return@combine SliderState.Empty
                 if (volume == null) {
                     SliderState.Empty
                 } else {
+
                     State(
                         value = volume.toFloat(),
                         valueRange =
@@ -74,13 +79,15 @@
     init {
         volumeChanges
             .filterNotNull()
-            .onEach { audioSharingInteractor.setStreamVolume(it) }
+            .onEach {
+                volumePanelLogger.onSetAudioSharingVolumeRequested(it)
+                audioSharingInteractor.setStreamVolume(it)
+            }
             .launchIn(coroutineScope)
     }
 
     override fun onValueChanged(state: SliderState, newValue: Float) {
-        val audioViewModel = state as? State
-        audioViewModel ?: return
+        if (state !is State) return
         volumeChanges.tryEmit(newValue.roundToInt())
     }
 
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 5332764..d74a433 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
@@ -26,6 +26,7 @@
 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.shared.model.MediaDeviceSession
+import com.android.systemui.volume.panel.shared.VolumePanelLogger
 import dagger.assisted.Assisted
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
@@ -44,17 +45,23 @@
     private val context: Context,
     private val mediaDeviceSessionInteractor: MediaDeviceSessionInteractor,
     private val hapticsViewModelFactory: SliderHapticsViewModel.Factory,
+    private val volumePanelLogger: VolumePanelLogger,
 ) : SliderViewModel {
 
     override val slider: StateFlow<SliderState> =
         mediaDeviceSessionInteractor
             .playbackInfo(session)
-            .mapNotNull { it?.getCurrentState() }
+            .mapNotNull {
+                volumePanelLogger.onVolumeUpdateReceived(session.sessionToken, it.currentVolume)
+                it.getCurrentState()
+            }
             .stateIn(coroutineScope, SharingStarted.Eagerly, SliderState.Empty)
 
     override fun onValueChanged(state: SliderState, newValue: Float) {
         coroutineScope.launch {
-            mediaDeviceSessionInteractor.setSessionVolume(session, newValue.roundToInt())
+            val volume = newValue.roundToInt()
+            volumePanelLogger.onSetVolumeRequested(session.sessionToken, volume)
+            mediaDeviceSessionInteractor.setSessionVolume(session, volume)
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/shared/VolumePanelLogger.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/shared/VolumePanelLogger.kt
index 276326c..930199a 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/panel/shared/VolumePanelLogger.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/panel/shared/VolumePanelLogger.kt
@@ -16,6 +16,8 @@
 
 package com.android.systemui.volume.panel.shared
 
+import android.media.session.MediaSession
+import android.media.session.MediaSession.Token
 import com.android.settingslib.volume.shared.model.AudioStream
 import com.android.systemui.log.LogBuffer
 import com.android.systemui.log.core.LogLevel
@@ -42,7 +44,7 @@
                 str1 = key
                 bool1 = isAvailable
             },
-            { "$str1 isAvailable=$bool1" }
+            { "$str1 isAvailable=$bool1" },
         )
     }
 
@@ -51,7 +53,7 @@
             TAG,
             LogLevel.DEBUG,
             { bool1 = globalState.isVisible },
-            { "Global state changed: isVisible=$bool1" }
+            { "Global state changed: isVisible=$bool1" },
         )
     }
 
@@ -63,7 +65,7 @@
                 str1 = audioStream.toString()
                 int1 = volume
             },
-            { "Set volume: stream=$str1 volume=$int1" }
+            { "Set volume: stream=$str1 volume=$int1" },
         )
     }
 
@@ -75,7 +77,49 @@
                 str1 = audioStream.toString()
                 int1 = volume
             },
-            { "Volume update received: stream=$str1 volume=$int1" }
+            { "Volume update received: stream=$str1 volume=$int1" },
+        )
+    }
+
+    fun onSetVolumeRequested(sessionToken: MediaSession.Token, volume: Int) {
+        logBuffer.log(
+            TAG,
+            LogLevel.DEBUG,
+            {
+                str1 = sessionToken.toString()
+                int1 = volume
+            },
+            { "Set volume: token=$str1 volume=$int1" },
+        )
+    }
+
+    fun onVolumeUpdateReceived(sessionToken: Token, volume: Int) {
+        logBuffer.log(
+            TAG,
+            LogLevel.DEBUG,
+            {
+                str1 = sessionToken.toString()
+                int1 = volume
+            },
+            { "Volume update received: token=$str1 volume=$int1" },
+        )
+    }
+
+    fun onSetAudioSharingVolumeRequested(volume: Int) {
+        logBuffer.log(
+            TAG,
+            LogLevel.DEBUG,
+            { int1 = volume },
+            { "Set volume: audio-sharing volume=$int1" },
+        )
+    }
+
+    fun onAudioSharingVolumeUpdateReceived(volume: Int) {
+        logBuffer.log(
+            TAG,
+            LogLevel.DEBUG,
+            { int1 = volume },
+            { "Volume update received: audio-sharing volume=$int1" },
         )
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/wallpapers/data/repository/WallpaperRepository.kt b/packages/SystemUI/src/com/android/systemui/wallpapers/data/repository/WallpaperRepository.kt
index a34a2dd..a55f76b 100644
--- a/packages/SystemUI/src/com/android/systemui/wallpapers/data/repository/WallpaperRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/wallpapers/data/repository/WallpaperRepository.kt
@@ -23,6 +23,7 @@
 import android.content.IntentFilter
 import android.os.Bundle
 import android.os.UserHandle
+import android.provider.Settings
 import android.view.View
 import androidx.annotation.VisibleForTesting
 import com.android.app.tracing.coroutines.launchTraced as launch
@@ -41,6 +42,8 @@
 import com.android.systemui.user.data.model.SelectedUserModel
 import com.android.systemui.user.data.model.SelectionStatus
 import com.android.systemui.user.data.repository.UserRepository
+import com.android.systemui.util.settings.SecureSettings
+import com.android.systemui.util.settings.SettingsProxyExt.observerFlow
 import com.android.systemui.utils.coroutines.flow.mapLatestConflated
 import javax.inject.Inject
 import kotlinx.coroutines.CoroutineDispatcher
@@ -54,7 +57,7 @@
 import kotlinx.coroutines.flow.asStateFlow
 import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.filter
-import kotlinx.coroutines.flow.flowOf
+import kotlinx.coroutines.flow.flowOn
 import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.onStart
 import kotlinx.coroutines.flow.stateIn
@@ -87,6 +90,7 @@
     private val wallpaperManager: WallpaperManager,
     private val context: Context,
     keyguardTransitionInteractor: KeyguardTransitionInteractor,
+    private val secureSettings: SecureSettings,
 ) : WallpaperRepository {
     private val wallpaperChanged: Flow<Unit> =
         broadcastDispatcher
@@ -125,7 +129,17 @@
         }
 
     override val wallpaperSupportsAmbientMode: Flow<Boolean> =
-        flowOf(context.resources.getBoolean(R.bool.config_dozeSupportsAodWallpaper) && ambientAod())
+        secureSettings
+            .observerFlow(UserHandle.USER_ALL, Settings.Secure.DOZE_ALWAYS_ON_WALLPAPER_ENABLED)
+            .onStart { emit(Unit) }
+            .map {
+                val userEnabled =
+                    secureSettings.getInt(Settings.Secure.DOZE_ALWAYS_ON_WALLPAPER_ENABLED, 1) == 1
+                userEnabled &&
+                    context.resources.getBoolean(R.bool.config_dozeSupportsAodWallpaper) &&
+                    ambientAod()
+            }
+            .flowOn(bgDispatcher)
 
     override var rootView: View? = null
 
diff --git a/packages/SystemUI/src/com/android/systemui/wallpapers/domain/interactor/WallpaperFocalAreaInteractor.kt b/packages/SystemUI/src/com/android/systemui/wallpapers/domain/interactor/WallpaperFocalAreaInteractor.kt
index 187d6c7..9b0f828 100644
--- a/packages/SystemUI/src/com/android/systemui/wallpapers/domain/interactor/WallpaperFocalAreaInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/wallpapers/domain/interactor/WallpaperFocalAreaInteractor.kt
@@ -20,8 +20,8 @@
 import android.content.res.Resources
 import android.graphics.PointF
 import android.graphics.RectF
+import android.util.Log
 import android.util.TypedValue
-import androidx.annotation.VisibleForTesting
 import com.android.app.animation.MathUtils
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Application
@@ -48,32 +48,16 @@
     activeNotificationsInteractor: ActiveNotificationsInteractor,
     val wallpaperRepository: WallpaperRepository,
 ) {
-    // When there's notifications in splitshade, the focal area should be left aligned
-    @VisibleForTesting
-    val notificationInShadeWideLayout: Flow<Boolean> =
-        combine(
-            shadeRepository.isShadeLayoutWide,
-            activeNotificationsInteractor.areAnyNotificationsPresent,
-        ) { isShadeLayoutWide, areAnyNotificationsPresent: Boolean ->
-            when {
-                !isShadeLayoutWide -> false
-                !areAnyNotificationsPresent -> false
-                else -> true
-            }
-        }
-
     val hasFocalArea = wallpaperRepository.shouldSendFocalArea
 
     val wallpaperFocalAreaBounds: Flow<RectF> =
         combine(
                 shadeRepository.isShadeLayoutWide,
-                notificationInShadeWideLayout,
                 wallpaperFocalAreaRepository.notificationStackAbsoluteBottom,
                 wallpaperFocalAreaRepository.shortcutAbsoluteTop,
                 wallpaperFocalAreaRepository.notificationDefaultTop,
             ) {
                 isShadeLayoutWide,
-                notificationInShadeWideLayout,
                 notificationStackAbsoluteBottom,
                 shortcutAbsoluteTop,
                 notificationDefaultTop ->
@@ -97,28 +81,21 @@
                         screenBounds.centerY() + screenBounds.height() / 2F / wallpaperZoomedInScale,
                     )
 
+                val focalAreaMaxWidthDp = getFocalAreaMaxWidthDp(context)
                 val maxFocalAreaWidth =
                     TypedValue.applyDimension(
                         TypedValue.COMPLEX_UNIT_DIP,
-                        FOCAL_AREA_MAX_WIDTH_DP.toFloat(),
+                        focalAreaMaxWidthDp.toFloat(),
                         context.resources.displayMetrics,
                     )
 
                 val (left, right) =
-                // tablet landscape
-                if (context.resources.getBoolean(R.bool.center_align_focal_area_shape)) {
+                // Tablet & unfold foldable landscape
+                if (isShadeLayoutWide) {
                         Pair(
                             scaledBounds.centerX() - maxFocalAreaWidth / 2F,
                             scaledBounds.centerX() + maxFocalAreaWidth / 2F,
                         )
-                        // unfold foldable landscape
-                    } else if (isShadeLayoutWide) {
-                        if (notificationInShadeWideLayout) {
-                            Pair(scaledBounds.left, scaledBounds.centerX())
-                        } else {
-                            Pair(scaledBounds.centerX(), scaledBounds.right)
-                        }
-                        // handheld / portrait
                     } else {
                         val focalAreaWidth = min(scaledBounds.width(), maxFocalAreaWidth)
                         Pair(
@@ -147,7 +124,7 @@
                                 wallpaperZoomedInScale
                     }
                 val bottom = scaledBounds.bottom - scaledBottomMargin
-                RectF(left, top, right, bottom)
+                RectF(left, top, right, bottom).also { Log.d(TAG, "Focal area changes to $it") }
             }
             .distinctUntilChanged()
 
@@ -187,8 +164,17 @@
             return if (scale == 0f) 1f else scale
         }
 
-        // A max width for focal area shape effects bounds, to avoid
-        // it becoming too large in large screen portrait mode
-        const val FOCAL_AREA_MAX_WIDTH_DP = 500
+        // A max width for focal area shape effects bounds, to avoid it becoming too large,
+        // especially in portrait mode
+        const val FOCAL_AREA_MAX_WIDTH_DP_TABLET = 500
+        const val FOCAL_AREA_MAX_WIDTH_DP_FOLDABLE = 400
+
+        fun getFocalAreaMaxWidthDp(context: Context): Int {
+            return if (context.resources.getBoolean(R.bool.center_align_focal_area_shape))
+                FOCAL_AREA_MAX_WIDTH_DP_TABLET
+            else FOCAL_AREA_MAX_WIDTH_DP_FOLDABLE
+        }
+
+        private val TAG = WallpaperFocalAreaInteractor::class.simpleName
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/window/dagger/WindowRootViewBlurModule.kt b/packages/SystemUI/src/com/android/systemui/window/dagger/WindowRootViewBlurModule.kt
new file mode 100644
index 0000000..95b3b68
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/window/dagger/WindowRootViewBlurModule.kt
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.window.dagger
+
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.window.data.repository.WindowRootViewBlurRepository
+import com.android.systemui.window.data.repository.WindowRootViewBlurRepositoryImpl
+import dagger.Binds
+import dagger.Module
+
+/**
+ * Module that can be installed in sysui variants where we support cross window blur.
+ */
+@Module
+interface WindowRootViewBlurModule {
+    @Binds
+    @SysUISingleton
+    fun bindWindowRootViewBlurRepository(
+        windowRootViewBlurRepositoryImpl: WindowRootViewBlurRepositoryImpl
+    ): WindowRootViewBlurRepository
+}
diff --git a/packages/SystemUI/src/com/android/systemui/window/dagger/WindowRootViewBlurNotSupportedModule.kt b/packages/SystemUI/src/com/android/systemui/window/dagger/WindowRootViewBlurNotSupportedModule.kt
new file mode 100644
index 0000000..ae917e0
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/window/dagger/WindowRootViewBlurNotSupportedModule.kt
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.window.dagger
+
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.window.data.repository.NoopWindowRootViewBlurRepository
+import com.android.systemui.window.data.repository.WindowRootViewBlurRepository
+import dagger.Binds
+import dagger.Module
+
+/**
+ * Module that can be installed in sysui variants where we don't support cross window blur.
+ */
+@Module
+interface WindowRootViewBlurNotSupportedModule {
+    @Binds
+    @SysUISingleton
+    fun bindWindowRootViewBlurRepository(
+        windowRootViewBlurRepositoryImpl: NoopWindowRootViewBlurRepository
+    ): WindowRootViewBlurRepository
+}
diff --git a/packages/SystemUI/src/com/android/systemui/window/data/repository/NoopWindowRootViewBlurRepository.kt b/packages/SystemUI/src/com/android/systemui/window/data/repository/NoopWindowRootViewBlurRepository.kt
new file mode 100644
index 0000000..f1dd374
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/window/data/repository/NoopWindowRootViewBlurRepository.kt
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.window.data.repository
+
+import com.android.systemui.window.data.repository.WindowRootViewBlurRepository
+import javax.inject.Inject
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.StateFlow
+
+class NoopWindowRootViewBlurRepository @Inject constructor() : WindowRootViewBlurRepository {
+    override val blurRadius: MutableStateFlow<Int> = MutableStateFlow(0)
+    override val isBlurOpaque: MutableStateFlow<Boolean> = MutableStateFlow(true)
+    override val isBlurSupported: StateFlow<Boolean> = MutableStateFlow(false)
+    override var blurAppliedListener: BlurAppliedListener? = null
+}
diff --git a/packages/SystemUI/src/com/android/systemui/window/data/repository/WindowRootViewBlurRepository.kt b/packages/SystemUI/src/com/android/systemui/window/data/repository/WindowRootViewBlurRepository.kt
index 22a74c8..f98efe1 100644
--- a/packages/SystemUI/src/com/android/systemui/window/data/repository/WindowRootViewBlurRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/window/data/repository/WindowRootViewBlurRepository.kt
@@ -16,14 +16,84 @@
 
 package com.android.systemui.window.data.repository
 
+import android.app.ActivityManager
+import android.os.SystemProperties
+import android.view.CrossWindowBlurListeners
+import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging
 import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow
+import com.android.systemui.window.data.repository.WindowRootViewBlurRepository.Companion.isDisableBlurSysPropSet
+import java.util.concurrent.Executor
+import java.util.function.Consumer
 import javax.inject.Inject
+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.stateIn
+
+typealias BlurAppliedListener = Consumer<Int>
 
 /** Repository that maintains state for the window blur effect. */
-@SysUISingleton
-class WindowRootViewBlurRepository @Inject constructor() {
-    val blurRadius = MutableStateFlow(0)
+interface WindowRootViewBlurRepository {
+    val blurRadius: MutableStateFlow<Int>
+    val isBlurOpaque: MutableStateFlow<Boolean>
 
-    val isBlurOpaque = MutableStateFlow(false)
+    /** Is blur supported based on settings toggle and battery power saver mode. */
+    val isBlurSupported: StateFlow<Boolean>
+
+    var blurAppliedListener: BlurAppliedListener?
+
+    companion object {
+        /**
+         * Whether the `persist.sysui.disableBlur` is set, this is used to disable blur for tests.
+         */
+        @JvmStatic
+        fun isDisableBlurSysPropSet() = SystemProperties.getBoolean(DISABLE_BLUR_PROPERTY, false)
+
+        // property that can be used to disable the cross window blur for tests
+        private const val DISABLE_BLUR_PROPERTY = "persist.sysui.disableBlur"
+    }
+}
+
+@SysUISingleton
+class WindowRootViewBlurRepositoryImpl
+@Inject
+constructor(
+    crossWindowBlurListeners: CrossWindowBlurListeners,
+    @Main private val executor: Executor,
+    @Application private val scope: CoroutineScope,
+) : WindowRootViewBlurRepository {
+    override val blurRadius = MutableStateFlow(0)
+
+    override val isBlurOpaque = MutableStateFlow(false)
+
+    override val isBlurSupported: StateFlow<Boolean> =
+        conflatedCallbackFlow {
+                val sendUpdate = { value: Boolean ->
+                    trySendWithFailureLogging(
+                        isBlurAllowed() && value,
+                        TAG,
+                        "unable to send blur enabled/disable state change",
+                    )
+                }
+                crossWindowBlurListeners.addListener(executor, sendUpdate)
+                sendUpdate(crossWindowBlurListeners.isCrossWindowBlurEnabled)
+
+                awaitClose { crossWindowBlurListeners.removeListener(sendUpdate) }
+            } // stateIn because this is backed by a binder call.
+            .stateIn(scope, SharingStarted.WhileSubscribed(), false)
+
+    override var blurAppliedListener: BlurAppliedListener? = null
+
+    private fun isBlurAllowed(): Boolean {
+        return ActivityManager.isHighEndGfx() && !isDisableBlurSysPropSet()
+    }
+
+    companion object {
+        const val TAG = "WindowRootViewBlurRepository"
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/window/domain/interactor/WindowRootViewBlurInteractor.kt b/packages/SystemUI/src/com/android/systemui/window/domain/interactor/WindowRootViewBlurInteractor.kt
index 9e36934..5197242 100644
--- a/packages/SystemUI/src/com/android/systemui/window/domain/interactor/WindowRootViewBlurInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/window/domain/interactor/WindowRootViewBlurInteractor.kt
@@ -16,7 +16,6 @@
 
 package com.android.systemui.window.domain.interactor
 
-import android.annotation.SuppressLint
 import android.util.Log
 import com.android.systemui.Flags
 import com.android.systemui.communal.domain.interactor.CommunalInteractor
@@ -25,11 +24,11 @@
 import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
 import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
 import com.android.systemui.keyguard.shared.model.KeyguardState.PRIMARY_BOUNCER
+import com.android.systemui.window.data.repository.BlurAppliedListener
 import com.android.systemui.window.data.repository.WindowRootViewBlurRepository
 import javax.inject.Inject
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.MutableSharedFlow
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.SharingStarted
 import kotlinx.coroutines.flow.StateFlow
@@ -54,8 +53,6 @@
     private val communalInteractor: CommunalInteractor,
     private val repository: WindowRootViewBlurRepository,
 ) {
-    @SuppressLint("SharedFlowCreation") private val _onBlurAppliedEvent = MutableSharedFlow<Int>()
-
     private var isBouncerTransitionInProgress: StateFlow<Boolean> =
         if (Flags.bouncerUiRevamp()) {
             keyguardTransitionInteractor
@@ -71,18 +68,27 @@
      * Invoked by the view after blur of [appliedBlurRadius] was successfully applied on the window
      * root view.
      */
-    suspend fun onBlurApplied(appliedBlurRadius: Int) {
-        _onBlurAppliedEvent.emit(appliedBlurRadius)
+    fun onBlurApplied(appliedBlurRadius: Int) {
+        repository.blurAppliedListener?.accept(appliedBlurRadius)
     }
 
+    /**
+     * Register a listener that gets invoked whenever blur is applied, clears the listener if the
+     * passed in value is null
+     */
+    fun registerBlurAppliedListener(listener: BlurAppliedListener?) {
+        repository.blurAppliedListener = listener
+    }
+
+    /**
+     * Whether blur is enabled or not based on settings toggle, critical thermal state, battery save
+     * state and multimedia tunneling state.
+     */
+    val isBlurCurrentlySupported: StateFlow<Boolean> = repository.isBlurSupported
+
     /** Radius of blur to be applied on the window root view. */
     val blurRadius: StateFlow<Int> = repository.blurRadius.asStateFlow()
 
-    /**
-     * Emits the applied blur radius whenever blur is successfully applied to the window root view.
-     */
-    val onBlurAppliedEvent: Flow<Int> = _onBlurAppliedEvent
-
     /** Whether the blur applied is opaque or transparent. */
     val isBlurOpaque: Flow<Boolean> =
         combine(
diff --git a/packages/SystemUI/src/com/android/systemui/window/ui/WindowRootViewBinder.kt b/packages/SystemUI/src/com/android/systemui/window/ui/WindowRootViewBinder.kt
index 153df7f..06532bc 100644
--- a/packages/SystemUI/src/com/android/systemui/window/ui/WindowRootViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/window/ui/WindowRootViewBinder.kt
@@ -84,9 +84,16 @@
                         combine(viewModel.blurRadius, viewModel.isBlurOpaque, ::Pair)
                             .filter { it.first >= 0 }
                             .collect { (blurRadius, isOpaque) ->
-                                // Expectation is that we schedule only one blur radius value
-                                // per frame
+                                val newBlurRadius = blurRadius.toInt()
+                                // Expectation is that we schedule only one frame callback per frame
                                 if (wasUpdateScheduledForThisFrame) {
+                                    // Update this value so that the frame callback picks up this
+                                    // value when it runs
+                                    if (lastScheduledBlurRadius != newBlurRadius) {
+                                        Log.w(TAG, "Multiple blur values emitted in the same frame")
+                                    }
+                                    lastScheduledBlurRadius = newBlurRadius
+                                    lastScheduleBlurOpaqueness = isOpaque
                                     return@collect
                                 }
                                 TrackTracer.instantForGroup(
@@ -94,7 +101,7 @@
                                     "preparedBlurRadius",
                                     blurRadius,
                                 )
-                                lastScheduledBlurRadius = blurRadius.toInt()
+                                lastScheduledBlurRadius = newBlurRadius
                                 lastScheduleBlurOpaqueness = isOpaque
                                 wasUpdateScheduledForThisFrame = true
                                 blurUtils.prepareBlur(
diff --git a/packages/SystemUI/src/com/android/systemui/window/ui/viewmodel/WindowRootViewModel.kt b/packages/SystemUI/src/com/android/systemui/window/ui/viewmodel/WindowRootViewModel.kt
index b18c39dc..e60e853 100644
--- a/packages/SystemUI/src/com/android/systemui/window/ui/viewmodel/WindowRootViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/window/ui/viewmodel/WindowRootViewModel.kt
@@ -18,35 +18,30 @@
 
 import android.os.Build
 import android.util.Log
-import com.android.app.tracing.coroutines.launchTraced
 import com.android.systemui.Flags
 import com.android.systemui.keyguard.ui.transitions.GlanceableHubTransition
 import com.android.systemui.keyguard.ui.transitions.PrimaryBouncerTransition
-import com.android.systemui.lifecycle.ExclusiveActivatable
 import com.android.systemui.window.domain.interactor.WindowRootViewBlurInteractor
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
-import kotlinx.coroutines.awaitCancellation
-import kotlinx.coroutines.channels.Channel
-import kotlinx.coroutines.coroutineScope
+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
 import kotlinx.coroutines.flow.merge
 import kotlinx.coroutines.flow.onEach
 
-typealias BlurAppliedUiEvent = Int
-
 /** View model for window root view. */
+@OptIn(ExperimentalCoroutinesApi::class)
 class WindowRootViewModel
 @AssistedInject
 constructor(
     primaryBouncerTransitions: Set<@JvmSuppressWildcards PrimaryBouncerTransition>,
     glanceableHubTransitions: Set<@JvmSuppressWildcards GlanceableHubTransition>,
     private val blurInteractor: WindowRootViewBlurInteractor,
-) : ExclusiveActivatable() {
-
-    private val blurEvents = Channel<BlurAppliedUiEvent>(Channel.BUFFERED)
+) {
 
     private val bouncerBlurRadiusFlows =
         if (Flags.bouncerUiRevamp())
@@ -58,7 +53,7 @@
             glanceableHubTransitions.map { it.windowBlurRadius.logIfPossible(it.javaClass.name) }
         else emptyList()
 
-    val blurRadius: Flow<Float> =
+    private val _blurRadius =
         listOf(
                 *bouncerBlurRadiusFlows.toTypedArray(),
                 *glanceableHubBlurRadiusFlows.toTypedArray(),
@@ -66,25 +61,29 @@
             )
             .merge()
 
-    val isBlurOpaque =
-        blurInteractor.isBlurOpaque.distinctUntilChanged().logIfPossible("isBlurOpaque")
-
-    override suspend fun onActivated(): Nothing {
-        coroutineScope {
-            launchTraced("WindowRootViewModel#blurEvents") {
-                for (event in blurEvents) {
-                    if (isLoggable) {
-                        Log.d(TAG, "blur applied for $event")
-                    }
-                    blurInteractor.onBlurApplied(event)
-                }
+    val blurRadius: Flow<Float> =
+        blurInteractor.isBlurCurrentlySupported.flatMapLatest { blurSupported ->
+            if (blurSupported) {
+                _blurRadius
+            } else {
+                flowOf(0f)
             }
         }
-        awaitCancellation()
-    }
+
+    val isBlurOpaque =
+        blurInteractor.isBlurCurrentlySupported.flatMapLatest { blurSupported ->
+            if (blurSupported) {
+                blurInteractor.isBlurOpaque.distinctUntilChanged().logIfPossible("isBlurOpaque")
+            } else {
+                flowOf(false)
+            }
+        }
 
     fun onBlurApplied(blurRadius: Int) {
-        blurEvents.trySend(blurRadius)
+        if (isLoggable) {
+            Log.d(TAG, "blur applied for radius $blurRadius")
+        }
+        blurInteractor.onBlurApplied(blurRadius)
     }
 
     @AssistedFactory
@@ -101,9 +100,3 @@
         }
     }
 }
-
-/**
- * @property radius Radius of blur to be applied on the window root view.
- * @property isOpaque Whether the blur applied is opaque or transparent.
- */
-data class BlurState(val radius: Int, val isOpaque: Boolean)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationSettingsTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationSettingsTest.java
index 4553f98..45b9f4a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationSettingsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationSettingsTest.java
@@ -552,12 +552,23 @@
                 mockSeekBar,
                 OnSeekBarWithIconButtonsChangeListener.ControlUnitType.SLIDER);
 
-        // should trigger callback to update magnifier scale and persist the scale
+        // Should trigger callback to update magnifier scale and persist the scale.
         verify(mWindowMagnificationSettingsCallback)
                 .onMagnifierScale(/* scale= */ eq(4f), /* updatePersistence= */ eq(true));
     }
 
     @Test
+    public void onSeekbarUserInteractionFinalized_notFromUser_persistedScaleNotUpdated() {
+        OnSeekBarWithIconButtonsChangeListener onChangeListener =
+                mZoomSeekbar.getOnSeekBarWithIconButtonsChangeListener();
+        onChangeListener.onProgressChanged(mZoomSeekbar.getSeekbar(), 30, false);
+
+        // Should not trigger callback to update magnifier scale and persist the scale.
+        verify(mWindowMagnificationSettingsCallback, never())
+                .onMagnifierScale(/* scale= */ anyFloat(), /* updatePersistence= */ eq(true));
+    }
+
+    @Test
     public void seekbarProgress_scaleUpdatedAfterSettingPanelOpened_progressAlsoUpdated() {
         setupMagnificationCapabilityAndMode(
                 /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_ALL,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothDetailsContentManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothDetailsContentManagerTest.kt
index 6ed990d..9c93269 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothDetailsContentManagerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothDetailsContentManagerTest.kt
@@ -87,7 +87,7 @@
     private val fakeSystemClock = FakeSystemClock()
 
     private val uiProperties =
-        BluetoothTileDialogViewModel.UiProperties.build(
+        BluetoothDetailsContentViewModel.UiProperties.build(
             isBluetoothEnabled = ENABLED,
             isAutoOnToggleFeatureAvailable = ENABLED,
         )
@@ -314,7 +314,7 @@
                 val cachedHeight = Int.MAX_VALUE
                 val contentManager =
                     BluetoothDetailsContentManager(
-                        BluetoothTileDialogViewModel.UiProperties.build(ENABLED, ENABLED),
+                        BluetoothDetailsContentViewModel.UiProperties.build(ENABLED, ENABLED),
                         cachedHeight,
                         bluetoothTileDialogCallback,
                         /* isInDialog= */ true,
@@ -339,7 +339,7 @@
             testScope.runTest {
                 val contentManager =
                     BluetoothDetailsContentManager(
-                        BluetoothTileDialogViewModel.UiProperties.build(ENABLED, ENABLED),
+                        BluetoothDetailsContentViewModel.UiProperties.build(ENABLED, ENABLED),
                         MATCH_PARENT,
                         bluetoothTileDialogCallback,
                         /* isInDialog= */ true,
@@ -364,7 +364,7 @@
             testScope.runTest {
                 val contentManager =
                     BluetoothDetailsContentManager(
-                        BluetoothTileDialogViewModel.UiProperties.build(ENABLED, ENABLED),
+                        BluetoothDetailsContentViewModel.UiProperties.build(ENABLED, ENABLED),
                         MATCH_PARENT,
                         bluetoothTileDialogCallback,
                         /* isInDialog= */ true,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothDetailsContentViewModelTest.kt
similarity index 90%
rename from packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogViewModelTest.kt
rename to packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothDetailsContentViewModelTest.kt
index 47a834b..bfc5361 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothDetailsContentViewModelTest.kt
@@ -67,14 +67,14 @@
 @RunWith(AndroidJUnit4::class)
 @TestableLooper.RunWithLooper(setAsMainLooper = true)
 @EnableFlags(Flags.FLAG_BLUETOOTH_QS_TILE_DIALOG_AUTO_ON_TOGGLE)
-class BluetoothTileDialogViewModelTest : SysuiTestCase() {
+class BluetoothDetailsContentViewModelTest : SysuiTestCase() {
 
     @get:Rule val mockitoRule: MockitoRule = MockitoJUnit.rule()
     private val kosmos = testKosmos()
     private val fakeSystemClock = FakeSystemClock()
     private val backgroundExecutor = FakeExecutor(fakeSystemClock)
 
-    private lateinit var bluetoothTileDialogViewModel: BluetoothTileDialogViewModel
+    private lateinit var bluetoothDetailsContentViewModel: BluetoothDetailsContentViewModel
 
     @Mock private lateinit var bluetoothDeviceMetadataInteractor: BluetoothDeviceMetadataInteractor
 
@@ -126,8 +126,8 @@
         testScope = kosmos.testScope
         // TODO(b/364515243): use real object instead of mock
         whenever(kosmos.deviceItemInteractor.deviceItemUpdate).thenReturn(MutableSharedFlow())
-        bluetoothTileDialogViewModel =
-            BluetoothTileDialogViewModel(
+        bluetoothDetailsContentViewModel =
+            BluetoothDetailsContentViewModel(
                 deviceItemInteractor,
                 deviceItemActionInteractor,
                 BluetoothStateInteractor(
@@ -194,7 +194,7 @@
     @Test
     fun testShowDetailsContent_noAnimation() {
         testScope.runTest {
-            bluetoothTileDialogViewModel.showDetailsContent(null, null)
+            bluetoothDetailsContentViewModel.showDetailsContent(null, null)
             runCurrent()
 
             verify(mDialogTransitionAnimator, never()).show(any(), any(), any())
@@ -204,7 +204,7 @@
     @Test
     fun testShowDetailsContent_animated() {
         testScope.runTest {
-            bluetoothTileDialogViewModel.showDetailsContent(expandable, null)
+            bluetoothDetailsContentViewModel.showDetailsContent(expandable, null)
             runCurrent()
 
             verify(mDialogTransitionAnimator).show(any(), any(), anyBoolean())
@@ -214,7 +214,7 @@
     @Test
     fun testShowDetailsContent_animated_inDetailsView() {
         testScope.runTest {
-            bluetoothTileDialogViewModel.showDetailsContent(expandable, mockView)
+            bluetoothDetailsContentViewModel.showDetailsContent(expandable, mockView)
             runCurrent()
 
             verify(bluetoothDetailsContentManager).bind(mockView)
@@ -226,7 +226,7 @@
     fun testShowDetailsContent_animated_callInBackgroundThread() {
         testScope.runTest {
             backgroundExecutor.execute {
-                bluetoothTileDialogViewModel.showDetailsContent(expandable, null)
+                bluetoothDetailsContentViewModel.showDetailsContent(expandable, null)
                 runCurrent()
 
                 verify(mDialogTransitionAnimator).show(any(), any(), anyBoolean())
@@ -238,7 +238,7 @@
     fun testShowDetailsContent_animated_callInBackgroundThread_inDetailsView() {
         testScope.runTest {
             backgroundExecutor.execute {
-                bluetoothTileDialogViewModel.showDetailsContent(expandable, mockView)
+                bluetoothDetailsContentViewModel.showDetailsContent(expandable, mockView)
                 runCurrent()
 
                 verify(bluetoothDetailsContentManager).bind(mockView)
@@ -250,7 +250,7 @@
     @Test
     fun testShowDetailsContent_fetchDeviceItem() {
         testScope.runTest {
-            bluetoothTileDialogViewModel.showDetailsContent(null, null)
+            bluetoothDetailsContentViewModel.showDetailsContent(null, null)
             runCurrent()
 
             verify(deviceItemInteractor).deviceItemUpdate
@@ -261,11 +261,11 @@
     fun testStartSettingsActivity_activityLaunched_dialogDismissed() {
         testScope.runTest {
             whenever(deviceItem.cachedBluetoothDevice).thenReturn(cachedBluetoothDevice)
-            bluetoothTileDialogViewModel.showDetailsContent(null, null)
+            bluetoothDetailsContentViewModel.showDetailsContent(null, null)
             runCurrent()
 
             val clickedView = View(context)
-            bluetoothTileDialogViewModel.onPairNewDeviceClicked(clickedView)
+            bluetoothDetailsContentViewModel.onPairNewDeviceClicked(clickedView)
 
             verify(uiEventLogger).log(BluetoothTileDialogUiEvent.PAIR_NEW_DEVICE_CLICKED)
             verify(activityStarter).postStartActivityDismissingKeyguard(any(), anyInt(), nullable())
@@ -276,7 +276,7 @@
     fun testBuildUiProperties_bluetoothOn_shouldHideAutoOn() {
         testScope.runTest {
             val actual =
-                BluetoothTileDialogViewModel.UiProperties.build(
+                BluetoothDetailsContentViewModel.UiProperties.build(
                     isBluetoothEnabled = true,
                     isAutoOnToggleFeatureAvailable = true,
                 )
@@ -288,7 +288,7 @@
     fun testBuildUiProperties_bluetoothOff_shouldShowAutoOn() {
         testScope.runTest {
             val actual =
-                BluetoothTileDialogViewModel.UiProperties.build(
+                BluetoothDetailsContentViewModel.UiProperties.build(
                     isBluetoothEnabled = false,
                     isAutoOnToggleFeatureAvailable = true,
                 )
@@ -300,7 +300,7 @@
     fun testBuildUiProperties_bluetoothOff_autoOnFeatureUnavailable_shouldHideAutoOn() {
         testScope.runTest {
             val actual =
-                BluetoothTileDialogViewModel.UiProperties.build(
+                BluetoothDetailsContentViewModel.UiProperties.build(
                     isBluetoothEnabled = false,
                     isAutoOnToggleFeatureAvailable = false,
                 )
@@ -313,7 +313,7 @@
         testScope.runTest {
             whenever(bluetoothAdapter.isAutoOnSupported).thenReturn(true)
 
-            val actual = bluetoothTileDialogViewModel.isAutoOnToggleFeatureAvailable()
+            val actual = bluetoothDetailsContentViewModel.isAutoOnToggleFeatureAvailable()
             assertThat(actual).isTrue()
         }
     }
@@ -323,7 +323,7 @@
         testScope.runTest {
             whenever(bluetoothAdapter.isAutoOnSupported).thenReturn(false)
 
-            val actual = bluetoothTileDialogViewModel.isAutoOnToggleFeatureAvailable()
+            val actual = bluetoothDetailsContentViewModel.isAutoOnToggleFeatureAvailable()
             assertThat(actual).isFalse()
         }
     }
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
index 2788f1d..7f75b8f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogDelegateTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogDelegateTest.kt
@@ -80,7 +80,7 @@
     @Mock private lateinit var dialogTransitionAnimator: DialogTransitionAnimator
 
     private val uiProperties =
-        BluetoothTileDialogViewModel.UiProperties.build(
+        BluetoothDetailsContentViewModel.UiProperties.build(
             isBluetoothEnabled = ENABLED,
             isAutoOnToggleFeatureAvailable = ENABLED,
         )
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 4ccfa29..e8054c0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java
@@ -206,6 +206,7 @@
     private @Mock ShadeInteractor mShadeInteractor;
     private @Mock ShadeWindowLogger mShadeWindowLogger;
     private @Mock SelectedUserInteractor mSelectedUserInteractor;
+    private @Mock UserTracker.Callback mUserTrackerCallback;
     private @Mock KeyguardInteractor mKeyguardInteractor;
     private @Mock KeyguardTransitionBootInteractor mKeyguardTransitionBootInteractor;
     private @Captor ArgumentCaptor<KeyguardStateController.Callback>
@@ -280,7 +281,7 @@
                 () -> mShadeInteractor,
                 mShadeWindowLogger,
                 () -> mSelectedUserInteractor,
-                mUserTracker,
+                mock(UserTracker.class),
                 mKosmos.getNotificationShadeWindowModel(),
                 mSecureSettings,
                 mKosmos::getCommunalInteractor,
@@ -318,7 +319,7 @@
 
         } catch (Exception e) {
             // Just so we don't have to add the exception signature to every test.
-            fail();
+            fail(e.getMessage());
         }
     }
 
@@ -330,18 +331,156 @@
 
         /* First test the default behavior: handleUserSwitching() is not invoked */
         when(mUserTracker.isUserSwitching()).thenReturn(false);
-        mViewMediator.mUpdateCallback = mock(KeyguardUpdateMonitorCallback.class);
         mViewMediator.onSystemReady();
         TestableLooper.get(this).processAllMessages();
 
-        verify(mViewMediator.mUpdateCallback, never()).onUserSwitching(userId);
+        verify(mUserTrackerCallback, never()).onUserChanging(eq(userId), eq(mContext),
+                any(Runnable.class));
 
         /* Next test user switching is already in progress when started */
         when(mUserTracker.isUserSwitching()).thenReturn(true);
         mViewMediator.onSystemReady();
         TestableLooper.get(this).processAllMessages();
 
-        verify(mViewMediator.mUpdateCallback).onUserSwitching(userId);
+        verify(mUserTrackerCallback).onUserChanging(eq(userId), eq(mContext),
+                any(Runnable.class));
+    }
+
+    @Test
+    @TestableLooper.RunWithLooper(setAsMainLooper = true)
+    public void testGoingAwayFollowedByBeforeUserSwitchDoesNotHideKeyguard() {
+        setCurrentUser(/* userId= */1099, /* isSecure= */false);
+
+        // Setup keyguard
+        mViewMediator.onSystemReady();
+        processAllMessagesAndBgExecutorMessages();
+        mViewMediator.setShowingLocked(true, "");
+
+        // Request keyguard going away
+        when(mKeyguardStateController.isKeyguardGoingAway()).thenReturn(true);
+        mViewMediator.mKeyguardGoingAwayRunnable.run();
+
+        // After the request, begin a switch to a new secure user
+        int nextUserId = 500;
+        setCurrentUser(nextUserId, /* isSecure= */true);
+        Runnable result = mock(Runnable.class);
+        mViewMediator.handleBeforeUserSwitching(nextUserId, result);
+        processAllMessagesAndBgExecutorMessages();
+        verify(result).run();
+
+        // After that request has begun, have WM tell us to exit keyguard
+        RemoteAnimationTarget[] apps = new RemoteAnimationTarget[]{
+                mock(RemoteAnimationTarget.class)
+        };
+        RemoteAnimationTarget[] wallpapers = new RemoteAnimationTarget[]{
+                mock(RemoteAnimationTarget.class)
+        };
+        IRemoteAnimationFinishedCallback callback = mock(IRemoteAnimationFinishedCallback.class);
+        mViewMediator.startKeyguardExitAnimation(TRANSIT_OLD_KEYGUARD_GOING_AWAY, apps, wallpapers,
+                null, callback);
+        processAllMessagesAndBgExecutorMessages();
+
+        // The call to exit should be rejected, and keyguard should still be visible
+        verify(mKeyguardUnlockAnimationController, never()).notifyStartSurfaceBehindRemoteAnimation(
+                any(), any(), any(), anyLong(), anyBoolean());
+        try {
+            assertATMSLockScreenShowing(true);
+        } catch (Exception e) {
+            fail(e.getMessage());
+        }
+        assertTrue(mViewMediator.isShowingAndNotOccluded());
+    }
+
+    @Test
+    @TestableLooper.RunWithLooper(setAsMainLooper = true)
+    public void testUserSwitchToSecureUserShowsBouncer() {
+        setCurrentUser(/* userId= */1099, /* isSecure= */true);
+
+        // Setup keyguard
+        mViewMediator.onSystemReady();
+        processAllMessagesAndBgExecutorMessages();
+        mViewMediator.setShowingLocked(true, "");
+
+        // After the request, begin a switch to a new secure user
+        int nextUserId = 500;
+        setCurrentUser(nextUserId, /* isSecure= */true);
+
+        Runnable beforeResult = mock(Runnable.class);
+        mViewMediator.handleBeforeUserSwitching(nextUserId, beforeResult);
+        processAllMessagesAndBgExecutorMessages();
+        verify(beforeResult).run();
+
+        // Dismiss should not be called while user switch is in progress
+        Runnable onSwitchResult = mock(Runnable.class);
+        mViewMediator.handleUserSwitching(nextUserId, onSwitchResult);
+        processAllMessagesAndBgExecutorMessages();
+        verify(onSwitchResult).run();
+        verify(mStatusBarKeyguardViewManager, never()).dismissAndCollapse();
+
+        // The attempt to dismiss only comes on user switch complete, which will trigger a call to
+        // show the bouncer in StatusBarKeyguardViewManager
+        mViewMediator.handleUserSwitchComplete(nextUserId);
+        TestableLooper.get(this).moveTimeForward(600);
+        processAllMessagesAndBgExecutorMessages();
+
+        verify(mStatusBarKeyguardViewManager).dismissAndCollapse();
+    }
+
+    @Test
+    @TestableLooper.RunWithLooper(setAsMainLooper = true)
+    public void testUserSwitchToInsecureUserDismissesKeyguard() {
+        int userId = 1099;
+        when(mUserTracker.getUserId()).thenReturn(userId);
+
+        // Setup keyguard
+        mViewMediator.onSystemReady();
+        processAllMessagesAndBgExecutorMessages();
+        mViewMediator.setShowingLocked(true, "");
+
+        // After the request, begin a switch to an insecure user
+        int nextUserId = 500;
+        when(mLockPatternUtils.isSecure(nextUserId)).thenReturn(false);
+
+        Runnable beforeResult = mock(Runnable.class);
+        mViewMediator.handleBeforeUserSwitching(nextUserId, beforeResult);
+        processAllMessagesAndBgExecutorMessages();
+        verify(beforeResult).run();
+
+        // The call to dismiss comes during the user switch
+        Runnable onSwitchResult = mock(Runnable.class);
+        mViewMediator.handleUserSwitching(nextUserId, onSwitchResult);
+        processAllMessagesAndBgExecutorMessages();
+        verify(onSwitchResult).run();
+
+        verify(mStatusBarKeyguardViewManager).dismissAndCollapse();
+    }
+
+    @Test
+    @TestableLooper.RunWithLooper(setAsMainLooper = true)
+    public void testUserSwitchToSecureUserWhileKeyguardNotVisibleShowsKeyguard() {
+        setCurrentUser(/* userId= */1099, /* isSecure= */true);
+
+        // Setup keyguard as not visible
+        mViewMediator.onSystemReady();
+        processAllMessagesAndBgExecutorMessages();
+        mViewMediator.setShowingLocked(false, "");
+        processAllMessagesAndBgExecutorMessages();
+
+        // Begin a switch to a new secure user
+        int nextUserId = 500;
+        setCurrentUser(nextUserId, /* isSecure= */true);
+
+        Runnable beforeResult = mock(Runnable.class);
+        mViewMediator.handleBeforeUserSwitching(nextUserId, beforeResult);
+        processAllMessagesAndBgExecutorMessages();
+        verify(beforeResult).run();
+
+        try {
+            assertATMSLockScreenShowing(true);
+        } catch (Exception e) {
+            fail();
+        }
+        assertTrue(mViewMediator.isShowingAndNotOccluded());
     }
 
     @Test
@@ -1105,7 +1244,7 @@
         processAllMessagesAndBgExecutorMessages();
 
         verify(mStatusBarKeyguardViewManager, never()).reset(anyBoolean());
-        assertATMSAndKeyguardViewMediatorStatesMatch();
+
     }
 
     @Test
@@ -1149,6 +1288,7 @@
         IRemoteAnimationFinishedCallback callback = mock(IRemoteAnimationFinishedCallback.class);
 
         when(mKeyguardStateController.isKeyguardGoingAway()).thenReturn(true);
+        mViewMediator.mKeyguardGoingAwayRunnable.run();
         mViewMediator.startKeyguardExitAnimation(TRANSIT_OLD_KEYGUARD_GOING_AWAY, apps, wallpapers,
                 null, callback);
         processAllMessagesAndBgExecutorMessages();
@@ -1203,13 +1343,6 @@
 
         // The captor will have the most recent setLockScreenShown call's value.
         assertEquals(showing, showingCaptor.getValue());
-
-        // We're now just after the last setLockScreenShown call. If we expect the lockscreen to be
-        // showing, ensure that we didn't subsequently ask for it to go away.
-        if (showing) {
-            orderedSetLockScreenShownCalls.verify(mActivityTaskManagerService, never())
-                    .keyguardGoingAway(anyInt());
-        }
     }
 
     /**
@@ -1371,6 +1504,7 @@
                 mKeyguardTransitionBootInteractor,
                 mKosmos::getCommunalSceneInteractor,
                 mock(WindowManagerOcclusionManager.class));
+        mViewMediator.mUserChangedCallback = mUserTrackerCallback;
         mViewMediator.start();
 
         mViewMediator.registerCentralSurfaces(mCentralSurfaces, null, null, null, null);
@@ -1384,4 +1518,10 @@
     private void captureKeyguardUpdateMonitorCallback() {
         verify(mUpdateMonitor).registerCallback(mKeyguardUpdateMonitorCallbackCaptor.capture());
     }
+
+    private void setCurrentUser(int userId, boolean isSecure) {
+        when(mUserTracker.getUserId()).thenReturn(userId);
+        when(mSelectedUserInteractor.getSelectedUserId()).thenReturn(userId);
+        when(mLockPatternUtils.isSecure(userId)).thenReturn(isSecure);
+    }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/DragAndDropTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/DragAndDropTest.kt
index 26cf4a2..92b26ea 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/DragAndDropTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/DragAndDropTest.kt
@@ -22,14 +22,7 @@
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.semantics.SemanticsProperties
-import androidx.compose.ui.test.SemanticsMatcher
-import androidx.compose.ui.test.assert
-import androidx.compose.ui.test.filter
-import androidx.compose.ui.test.hasContentDescription
-import androidx.compose.ui.test.junit4.ComposeContentTestRule
 import androidx.compose.ui.test.junit4.createComposeRule
-import androidx.compose.ui.test.onChildren
 import androidx.compose.ui.test.onNodeWithContentDescription
 import androidx.compose.ui.test.onNodeWithTag
 import androidx.compose.ui.test.onNodeWithText
@@ -100,7 +93,10 @@
         composeRule.onNodeWithText("Remove").assertExists()
 
         // Every other tile should still be in the same order
-        composeRule.assertTileGridContainsExactly(listOf("tileB", "tileC", "tileD_large", "tileE"))
+        composeRule.assertGridContainsExactly(
+            CURRENT_TILES_GRID_TEST_TAG,
+            listOf("tileB", "tileC", "tileD_large", "tileE"),
+        )
     }
 
     @Test
@@ -125,8 +121,9 @@
         composeRule.onNodeWithText("Remove").assertDoesNotExist()
 
         // Tile A and B should swap places
-        composeRule.assertTileGridContainsExactly(
-            listOf("tileB", "tileA", "tileC", "tileD_large", "tileE")
+        composeRule.assertGridContainsExactly(
+            CURRENT_TILES_GRID_TEST_TAG,
+            listOf("tileB", "tileA", "tileC", "tileD_large", "tileE"),
         )
     }
 
@@ -152,7 +149,10 @@
         composeRule.onNodeWithText("Remove").assertDoesNotExist()
 
         // Tile A is gone
-        composeRule.assertTileGridContainsExactly(listOf("tileB", "tileC", "tileD_large", "tileE"))
+        composeRule.assertGridContainsExactly(
+            CURRENT_TILES_GRID_TEST_TAG,
+            listOf("tileB", "tileC", "tileD_large", "tileE"),
+        )
     }
 
     @Test
@@ -166,7 +166,7 @@
         }
         composeRule.waitForIdle()
 
-        listState.onStarted(createEditTile("newTile"), DragType.Add)
+        listState.onStarted(createEditTile("tile_new"), DragType.Add)
         // Insert after tileD, which is at index 4
         // [ a ] [ b ] [ c ] [ empty ]
         // [ tile d ] [ e ]
@@ -179,23 +179,13 @@
         // Remove drop zone should disappear
         composeRule.onNodeWithText("Remove").assertDoesNotExist()
 
-        // newTile is added after tileD
-        composeRule.assertTileGridContainsExactly(
-            listOf("tileA", "tileB", "tileC", "tileD_large", "newTile", "tileE")
+        // tile_new is added after tileD
+        composeRule.assertGridContainsExactly(
+            CURRENT_TILES_GRID_TEST_TAG,
+            listOf("tileA", "tileB", "tileC", "tileD_large", "tile_new", "tileE"),
         )
     }
 
-    private fun ComposeContentTestRule.assertTileGridContainsExactly(specs: List<String>) {
-        onNodeWithTag(CURRENT_TILES_GRID_TEST_TAG)
-            .onChildren()
-            .filter(SemanticsMatcher.keyIsDefined(SemanticsProperties.ContentDescription))
-            .apply {
-                fetchSemanticsNodes().forEachIndexed { index, _ ->
-                    get(index).assert(hasContentDescription(specs[index]))
-                }
-            }
-    }
-
     companion object {
         private const val CURRENT_TILES_GRID_TEST_TAG = "CurrentTilesGrid"
         private const val AVAILABLE_TILES_GRID_TEST_TAG = "AvailableTilesGrid"
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/EditModeTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/EditModeTest.kt
index 4e8b0bc..8c09b81 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/EditModeTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/EditModeTest.kt
@@ -23,16 +23,9 @@
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.semantics.SemanticsProperties
-import androidx.compose.ui.test.SemanticsMatcher
-import androidx.compose.ui.test.assert
-import androidx.compose.ui.test.filter
-import androidx.compose.ui.test.hasContentDescription
 import androidx.compose.ui.test.junit4.ComposeContentTestRule
 import androidx.compose.ui.test.junit4.createComposeRule
-import androidx.compose.ui.test.onChildren
 import androidx.compose.ui.test.onNodeWithContentDescription
-import androidx.compose.ui.test.onNodeWithTag
 import androidx.compose.ui.test.onNodeWithText
 import androidx.compose.ui.test.performClick
 import androidx.compose.ui.text.AnnotatedString
@@ -113,20 +106,6 @@
         specs: List<String>
     ) = assertGridContainsExactly(AVAILABLE_TILES_GRID_TEST_TAG, specs)
 
-    private fun ComposeContentTestRule.assertGridContainsExactly(
-        testTag: String,
-        specs: List<String>,
-    ) {
-        onNodeWithTag(testTag)
-            .onChildren()
-            .filter(SemanticsMatcher.keyIsDefined(SemanticsProperties.ContentDescription))
-            .apply {
-                fetchSemanticsNodes().forEachIndexed { index, _ ->
-                    get(index).assert(hasContentDescription(specs[index]))
-                }
-            }
-    }
-
     companion object {
         private const val CURRENT_TILES_GRID_TEST_TAG = "CurrentTilesGrid"
         private const val AVAILABLE_TILES_GRID_TEST_TAG = "AvailableTilesGrid"
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/TestMatchers.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/TestMatchers.kt
new file mode 100644
index 0000000..dbccf86
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/TestMatchers.kt
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.qs.panels.ui.compose
+
+import androidx.compose.ui.semantics.SemanticsProperties
+import androidx.compose.ui.semantics.getOrNull
+import androidx.compose.ui.test.SemanticsMatcher
+import androidx.compose.ui.test.assert
+import androidx.compose.ui.test.filter
+import androidx.compose.ui.test.hasContentDescription
+import androidx.compose.ui.test.junit4.ComposeContentTestRule
+import androidx.compose.ui.test.onChildren
+import androidx.compose.ui.test.onNodeWithTag
+
+/** Asserts that the tile grid with [testTag] contains exactly [specs] */
+fun ComposeContentTestRule.assertGridContainsExactly(testTag: String, specs: List<String>) {
+    onNodeWithTag(testTag)
+        .onChildren()
+        .filter(SemanticsMatcher.contentDescriptionStartsWith("tile"))
+        .apply {
+            fetchSemanticsNodes().forEachIndexed { index, _ ->
+                get(index).assert(hasContentDescription(specs[index]))
+            }
+        }
+}
+
+/**
+ * A [SemanticsMatcher] that matches anything with a content description starting with the given
+ * [prefix]
+ */
+fun SemanticsMatcher.Companion.contentDescriptionStartsWith(prefix: String): SemanticsMatcher {
+    return SemanticsMatcher("${SemanticsProperties.ContentDescription.name} starts with $prefix") {
+        semanticsNode ->
+        semanticsNode.config.getOrNull(SemanticsProperties.ContentDescription)?.any {
+            it.startsWith(prefix)
+        } ?: false
+    }
+}
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 1305b0c..cfe34f4 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
@@ -16,7 +16,7 @@
 import com.android.settingslib.Utils
 import com.android.settingslib.bluetooth.CachedBluetoothDevice
 import com.android.systemui.SysuiTestCase
-import com.android.systemui.bluetooth.qsdialog.BluetoothTileDialogViewModel
+import com.android.systemui.bluetooth.qsdialog.BluetoothDetailsContentViewModel
 import com.android.systemui.classifier.FalsingManagerFake
 import com.android.systemui.flags.FeatureFlagsClassic
 import com.android.systemui.plugins.ActivityStarter
@@ -71,7 +71,7 @@
     @Mock private lateinit var bluetoothController: BluetoothController
     @Mock private lateinit var uiEventLogger: QsEventLogger
     @Mock private lateinit var featureFlags: FeatureFlagsClassic
-    @Mock private lateinit var bluetoothTileDialogViewModel: BluetoothTileDialogViewModel
+    @Mock private lateinit var bluetoothDetailsContentViewModel: BluetoothDetailsContentViewModel
     @Mock private lateinit var clickJob: Job
     private lateinit var testableLooper: TestableLooper
     private lateinit var tile: FakeBluetoothTile
@@ -96,7 +96,7 @@
                 qsLogger,
                 bluetoothController,
                 featureFlags,
-                bluetoothTileDialogViewModel,
+                bluetoothDetailsContentViewModel,
             )
 
         tile.initialize()
@@ -238,7 +238,7 @@
 
         tile.handleClick(null)
 
-        verify(bluetoothTileDialogViewModel)
+        verify(bluetoothDetailsContentViewModel)
             .showDetailsContent(/* expandable= */ null, /* view= */ null)
     }
 
@@ -308,7 +308,7 @@
         qsLogger: QSLogger,
         bluetoothController: BluetoothController,
         featureFlags: FeatureFlagsClassic,
-        bluetoothTileDialogViewModel: BluetoothTileDialogViewModel,
+        bluetoothDetailsContentViewModel: BluetoothDetailsContentViewModel,
     ) :
         BluetoothTile(
             qsHost,
@@ -322,7 +322,7 @@
             qsLogger,
             bluetoothController,
             featureFlags,
-            bluetoothTileDialogViewModel,
+            bluetoothDetailsContentViewModel,
         ) {
         var restrictionChecked: String? = null
 
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 732561e0..944604f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/GlanceableHubContainerControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/GlanceableHubContainerControllerTest.kt
@@ -640,11 +640,11 @@
             }
         }
 
-    @DisableFlags(FLAG_GLANCEABLE_HUB_V2)
     @Test
     fun onTouchEvent_shadeInteracting_movesNotDispatched() =
         with(kosmos) {
             testScope.runTest {
+                `whenever`(communalViewModel.swipeToHubEnabled()).thenReturn(true)
                 // On lockscreen.
                 goToScene(CommunalScenes.Blank)
                 whenever(
@@ -721,11 +721,11 @@
             }
         }
 
-    @DisableFlags(FLAG_GLANCEABLE_HUB_V2)
     @Test
     fun onTouchEvent_bouncerInteracting_movesNotDispatched() =
         with(kosmos) {
             testScope.runTest {
+                `whenever`(communalViewModel.swipeToHubEnabled()).thenReturn(true)
                 // On lockscreen.
                 goToScene(CommunalScenes.Blank)
                 whenever(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt
index edb0f35..f3af794f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt
@@ -59,6 +59,7 @@
 import com.android.systemui.statusbar.phone.StatusOverlayHoverListenerFactory
 import com.android.systemui.statusbar.phone.ui.StatusBarIconController
 import com.android.systemui.statusbar.phone.ui.TintedIconManager
+import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.batteryViewModelFactory
 import com.android.systemui.statusbar.policy.Clock
 import com.android.systemui.statusbar.policy.FakeConfigurationController
 import com.android.systemui.statusbar.policy.NextAlarmController
@@ -202,6 +203,7 @@
                 Lazy { kosmos.shadeDisplaysRepository },
                 variableDateViewControllerFactory,
                 batteryMeterViewController,
+                kosmos.batteryViewModelFactory,
                 dumpManager,
                 mShadeCarrierGroupControllerBuilder,
                 combinedShadeHeadersConstraintManager,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerWithScenesTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerWithScenesTest.kt
index 1b44752..3d4c901 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerWithScenesTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerWithScenesTest.kt
@@ -67,6 +67,8 @@
 import com.android.systemui.statusbar.notification.domain.interactor.activeNotificationsInteractor
 import com.android.systemui.statusbar.notification.headsup.mockHeadsUpManager
 import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier
+import com.android.systemui.statusbar.notification.row.icon.appIconProvider
+import com.android.systemui.statusbar.notification.row.icon.notificationIconStyleProvider
 import com.android.systemui.statusbar.notification.stack.NotificationListContainer
 import com.android.systemui.statusbar.notificationLockscreenUserManager
 import com.android.systemui.statusbar.policy.deviceProvisionedController
@@ -128,6 +130,8 @@
     private val statusBarStateController = kosmos.statusBarStateController
     private val headsUpManager = kosmos.mockHeadsUpManager
     private val activityStarter = kosmos.activityStarter
+    private val appIconProvider = kosmos.appIconProvider
+    private val iconStyleProvider = kosmos.notificationIconStyleProvider
     private val userManager = kosmos.userManager
     private val activeNotificationsInteractor = kosmos.activeNotificationsInteractor
     private val sceneInteractor = kosmos.sceneInteractor
@@ -174,6 +178,8 @@
                 accessibilityManager,
                 highPriorityProvider,
                 notificationManager,
+                appIconProvider,
+                iconStyleProvider,
                 userManager,
                 peopleSpaceWidgetManager,
                 launcherApps,
@@ -429,6 +435,8 @@
             .bindNotification(
                 any<PackageManager>(),
                 any<INotificationManager>(),
+                eq(appIconProvider),
+                eq(iconStyleProvider),
                 eq(onUserInteractionCallback),
                 eq(channelEditorDialogController),
                 eq(statusBarNotification.packageName),
@@ -463,6 +471,8 @@
             .bindNotification(
                 any<PackageManager>(),
                 any<INotificationManager>(),
+                eq(appIconProvider),
+                eq(iconStyleProvider),
                 eq(onUserInteractionCallback),
                 eq(channelEditorDialogController),
                 eq(statusBarNotification.packageName),
@@ -497,6 +507,8 @@
             .bindNotification(
                 any<PackageManager>(),
                 any<INotificationManager>(),
+                eq(appIconProvider),
+                eq(iconStyleProvider),
                 eq(onUserInteractionCallback),
                 eq(channelEditorDialogController),
                 eq(statusBarNotification.packageName),
@@ -529,8 +541,8 @@
                 .setChannel(testNotificationChannel)
                 .build()
             row
-        } catch (e: Exception) {
-            org.junit.Assert.fail()
+        } catch (_: Exception) {
+            Assert.fail()
             null
         }
     }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
index a523488..14a1233 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
@@ -290,7 +290,8 @@
                 mKeyguardInteractor,
                 mKosmos.getTestDispatcher(),
                 mLinearLargeScreenShadeInterpolator,
-                new BlurConfig(0.0f, 0.0f));
+                new BlurConfig(0.0f, 0.0f),
+                mKosmos::getWindowRootViewBlurInteractor);
         mScrimController.setScrimVisibleListener(visible -> mScrimVisibility = visible);
         mScrimController.attachViews(mScrimBehind, mNotificationsScrim, mScrimInFront);
         mScrimController.setAnimatorListener(mAnimatorListener);
@@ -1204,7 +1205,8 @@
                 mKeyguardInteractor,
                 mKosmos.getTestDispatcher(),
                 mLinearLargeScreenShadeInterpolator,
-                new BlurConfig(0.0f, 0.0f));
+                new BlurConfig(0.0f, 0.0f),
+                mKosmos::getWindowRootViewBlurInteractor);
         mScrimController.setScrimVisibleListener(visible -> mScrimVisibility = visible);
         mScrimController.attachViews(mScrimBehind, mNotificationsScrim, mScrimInFront);
         mScrimController.setAnimatorListener(mAnimatorListener);
diff --git a/packages/SystemUI/tests/utils/src/com/android/app/WallpaperManagerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/app/WallpaperManagerKosmos.kt
index f893aba..d6e6ea8 100644
--- a/packages/SystemUI/tests/utils/src/com/android/app/WallpaperManagerKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/app/WallpaperManagerKosmos.kt
@@ -20,6 +20,6 @@
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.kosmos.Kosmos.Fixture
 
-val Kosmos.wallpaperManager: WallpaperManager by Fixture {
+var Kosmos.wallpaperManager: WallpaperManager by Fixture {
     WallpaperManager.getInstance(applicationContext)
 }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/activity/data/repository/ActivityManagerRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/activity/data/repository/ActivityManagerRepositoryKosmos.kt
index a6e7133..5dc28be 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/activity/data/repository/ActivityManagerRepositoryKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/activity/data/repository/ActivityManagerRepositoryKosmos.kt
@@ -17,33 +17,77 @@
 package com.android.systemui.activity.data.repository
 
 import android.app.activityManager
+import com.android.systemui.activity.data.model.AppVisibilityModel
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.kosmos.testDispatcher
 import com.android.systemui.log.core.Logger
+import com.android.systemui.util.time.SystemClock
+import com.android.systemui.util.time.fakeSystemClock
+import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.MutableStateFlow
 
-val Kosmos.activityManagerRepository by Kosmos.Fixture { FakeActivityManagerRepository() }
+val Kosmos.activityManagerRepository by
+    Kosmos.Fixture { FakeActivityManagerRepository(fakeSystemClock) }
 
 val Kosmos.realActivityManagerRepository by
-    Kosmos.Fixture { ActivityManagerRepositoryImpl(testDispatcher, activityManager) }
+    Kosmos.Fixture {
+        ActivityManagerRepositoryImpl(testDispatcher, fakeSystemClock, activityManager)
+    }
 
-class FakeActivityManagerRepository : ActivityManagerRepository {
-    private val uidFlows = mutableMapOf<Int, MutableList<MutableStateFlow<Boolean>>>()
+class FakeActivityManagerRepository(private val systemClock: SystemClock) :
+    ActivityManagerRepository {
+    private val isVisibleFlows = mutableMapOf<Int, MutableList<MutableStateFlow<Boolean>>>()
+    private val appVisibilityFlows =
+        mutableMapOf<Int, MutableList<MutableStateFlow<AppVisibilityModel>>>()
 
     var startingIsAppVisibleValue = false
 
+    override fun createAppVisibilityFlow(
+        creationUid: Int,
+        logger: Logger,
+        identifyingLogTag: String,
+    ): Flow<AppVisibilityModel> {
+        val newFlow =
+            MutableStateFlow(
+                if (startingIsAppVisibleValue) {
+                    AppVisibilityModel(
+                        isAppCurrentlyVisible = true,
+                        lastAppVisibleTime = systemClock.currentTimeMillis(),
+                    )
+                } else {
+                    AppVisibilityModel(isAppCurrentlyVisible = false, lastAppVisibleTime = null)
+                }
+            )
+        appVisibilityFlows.computeIfAbsent(creationUid) { mutableListOf() }.add(newFlow)
+        return newFlow
+    }
+
     override fun createIsAppVisibleFlow(
         creationUid: Int,
         logger: Logger,
         identifyingLogTag: String,
     ): MutableStateFlow<Boolean> {
         val newFlow = MutableStateFlow(startingIsAppVisibleValue)
-        uidFlows.computeIfAbsent(creationUid) { mutableListOf() }.add(newFlow)
+        isVisibleFlows.computeIfAbsent(creationUid) { mutableListOf() }.add(newFlow)
         return newFlow
     }
 
     fun setIsAppVisible(uid: Int, isAppVisible: Boolean) {
-        uidFlows[uid]?.forEach { stateFlow -> stateFlow.value = isAppVisible }
+        isVisibleFlows[uid]?.forEach { stateFlow -> stateFlow.value = isAppVisible }
+        appVisibilityFlows[uid]?.forEach { stateFlow ->
+            stateFlow.value =
+                if (isAppVisible) {
+                    AppVisibilityModel(
+                        isAppCurrentlyVisible = true,
+                        lastAppVisibleTime = systemClock.currentTimeMillis(),
+                    )
+                } else {
+                    AppVisibilityModel(
+                        isAppCurrentlyVisible = false,
+                        stateFlow.value.lastAppVisibleTime,
+                    )
+                }
+        }
     }
 }
 
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/communal/domain/interactor/CommunalBackActionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/communal/domain/interactor/CommunalBackActionInteractorKosmos.kt
deleted file mode 100644
index 57c8fd0..0000000
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/communal/domain/interactor/CommunalBackActionInteractorKosmos.kt
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.communal.domain.interactor
-
-import com.android.systemui.kosmos.Kosmos
-import com.android.systemui.scene.domain.interactor.sceneInteractor
-
-val Kosmos.communalBackActionInteractor by
-    Kosmos.Fixture {
-        CommunalBackActionInteractor(
-            communalInteractor = communalInteractor,
-            communalSceneInteractor = communalSceneInteractor,
-            sceneInteractor = sceneInteractor,
-        )
-    }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/communal/domain/interactor/CommunalSceneTransitionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/communal/domain/interactor/CommunalSceneTransitionInteractorKosmos.kt
index e6e59e1..75c4b6f 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/communal/domain/interactor/CommunalSceneTransitionInteractorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/communal/domain/interactor/CommunalSceneTransitionInteractorKosmos.kt
@@ -22,6 +22,7 @@
 import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.kosmos.applicationCoroutineScope
+import com.android.systemui.power.domain.interactor.powerInteractor
 
 val Kosmos.communalSceneTransitionInteractor: CommunalSceneTransitionInteractor by
     Kosmos.Fixture {
@@ -33,5 +34,6 @@
             sceneInteractor = communalSceneInteractor,
             repository = communalSceneTransitionRepository,
             keyguardInteractor = keyguardInteractor,
+            powerInteractor = powerInteractor,
         )
     }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractorKosmos.kt
index 7b0d208..38372ac 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractorKosmos.kt
@@ -18,6 +18,8 @@
 
 import com.android.systemui.bouncer.domain.interactor.primaryBouncerInteractor
 import com.android.systemui.communal.domain.interactor.communalInteractor
+import com.android.systemui.communal.domain.interactor.communalSceneInteractor
+import com.android.systemui.communal.domain.interactor.communalSettingsInteractor
 import com.android.systemui.keyguard.data.repository.keyguardTransitionRepository
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.kosmos.applicationCoroutineScope
@@ -39,5 +41,7 @@
             powerInteractor = powerInteractor,
             keyguardOcclusionInteractor = keyguardOcclusionInteractor,
             primaryBouncerInteractor = primaryBouncerInteractor,
+            communalSceneInteractor = communalSceneInteractor,
+            communalSettingsInteractor = communalSettingsInteractor,
         )
     }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractorKosmos.kt
index d995b86..0f7366d 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractorKosmos.kt
@@ -38,7 +38,6 @@
             bgDispatcher = testDispatcher,
             mainDispatcher = testDispatcher,
             keyguardInteractor = keyguardInteractor,
-            glanceableHubTransitions = glanceableHubTransitions,
             communalInteractor = communalInteractor,
             communalSceneInteractor = communalSceneInteractor,
             communalSettingsInteractor = communalSettingsInteractor,
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractorKosmos.kt
index 494f08b..bf72e48 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractorKosmos.kt
@@ -31,7 +31,6 @@
             scope = applicationCoroutineScope,
             mainDispatcher = testDispatcher,
             bgDispatcher = testDispatcher,
-            glanceableHubTransitions = glanceableHubTransitions,
             communalSettingsInteractor = communalSettingsInteractor,
             keyguardInteractor = keyguardInteractor,
             transitionRepository = keyguardTransitionRepository,
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractorKosmos.kt
index ff7a06c..985044c 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractorKosmos.kt
@@ -39,7 +39,6 @@
             keyguardInteractor = keyguardInteractor,
             shadeRepository = shadeRepository,
             powerInteractor = powerInteractor,
-            glanceableHubTransitions = glanceableHubTransitions,
             communalSettingsInteractor = communalSettingsInteractor,
             swipeToDismissInteractor = swipeToDismissInteractor,
             keyguardOcclusionInteractor = keyguardOcclusionInteractor,
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractorKosmos.kt
index 3c369d7..6b240b5f 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractorKosmos.kt
@@ -18,6 +18,7 @@
 
 import com.android.keyguard.keyguardSecurityModel
 import com.android.systemui.communal.domain.interactor.communalSceneInteractor
+import com.android.systemui.communal.domain.interactor.communalSettingsInteractor
 import com.android.systemui.keyguard.data.repository.keyguardTransitionRepository
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.kosmos.applicationCoroutineScope
@@ -37,6 +38,7 @@
             mainDispatcher = testDispatcher,
             keyguardInteractor = keyguardInteractor,
             communalSceneInteractor = communalSceneInteractor,
+            communalSettingsInteractor = communalSettingsInteractor,
             keyguardSecurityModel = keyguardSecurityModel,
             selectedUserInteractor = selectedUserInteractor,
             powerInteractor = powerInteractor,
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/GlanceableHubTransitionsKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/GlanceableHubTransitionsKosmos.kt
deleted file mode 100644
index a45b269..0000000
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/GlanceableHubTransitionsKosmos.kt
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.keyguard.domain.interactor
-
-import com.android.systemui.communal.domain.interactor.communalInteractor
-import com.android.systemui.keyguard.data.repository.keyguardTransitionRepository
-import com.android.systemui.kosmos.Kosmos
-
-val Kosmos.glanceableHubTransitions by
-    Kosmos.Fixture {
-        GlanceableHubTransitions(
-            transitionRepository = keyguardTransitionRepository,
-            transitionInteractor = keyguardTransitionInteractor,
-            communalInteractor = communalInteractor,
-        )
-    }
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 8844eb0..b781f61 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,8 +20,9 @@
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.kosmos.applicationCoroutineScope
 import com.android.systemui.media.controls.domain.pipeline.interactor.mediaCarouselInteractor
-import com.android.systemui.shade.domain.interactor.shadeInteractor
+import com.android.systemui.shade.domain.interactor.shadeModeInteractor
 import com.android.systemui.statusbar.notification.domain.interactor.activeNotificationsInteractor
+import com.android.systemui.statusbar.notification.promoted.domain.interactor.aodPromotedNotificationInteractor
 import com.android.systemui.statusbar.notification.stack.domain.interactor.headsUpNotificationInteractor
 import com.android.systemui.wallpapers.domain.interactor.wallpaperFocalAreaInteractor
 
@@ -30,7 +31,8 @@
         KeyguardClockInteractor(
             mediaCarouselInteractor = mediaCarouselInteractor,
             activeNotificationsInteractor = activeNotificationsInteractor,
-            shadeInteractor = shadeInteractor,
+            aodPromotedNotificationInteractor = aodPromotedNotificationInteractor,
+            shadeModeInteractor = shadeModeInteractor,
             keyguardInteractor = keyguardInteractor,
             keyguardTransitionInteractor = keyguardTransitionInteractor,
             headsUpNotificationInteractor = headsUpNotificationInteractor,
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelKosmos.kt
index c0b39b1..5dc19a3 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelKosmos.kt
@@ -22,7 +22,7 @@
 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
+import com.android.systemui.shade.domain.interactor.shadeModeInteractor
 import com.android.systemui.statusbar.notification.icon.ui.viewmodel.notificationIconContainerAlwaysOnDisplayViewModel
 import com.android.systemui.statusbar.ui.systemBarUtilsProxy
 
@@ -33,7 +33,7 @@
             keyguardClockInteractor = keyguardClockInteractor,
             applicationScope = applicationCoroutineScope,
             aodNotificationIconViewModel = notificationIconContainerAlwaysOnDisplayViewModel,
-            shadeInteractor = shadeInteractor,
+            shadeModeInteractor = shadeModeInteractor,
             systemBarUtils = systemBarUtilsProxy,
             configurationInteractor = configurationInteractor,
             resources = mainResources,
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardMediaViewModelFactoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardMediaViewModelFactoryKosmos.kt
index 16d3fdc..345d69a 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardMediaViewModelFactoryKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardMediaViewModelFactoryKosmos.kt
@@ -19,12 +19,17 @@
 import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.media.controls.domain.pipeline.interactor.mediaCarouselInteractor
+import com.android.systemui.shade.domain.interactor.shadeModeInteractor
 
 val Kosmos.keyguardMediaViewModelFactory by
     Kosmos.Fixture {
         object : KeyguardMediaViewModel.Factory {
             override fun create(): KeyguardMediaViewModel {
-                return KeyguardMediaViewModel(mediaCarouselInteractor, keyguardInteractor)
+                return KeyguardMediaViewModel(
+                    mediaCarouselInteractor = mediaCarouselInteractor,
+                    keyguardInteractor = keyguardInteractor,
+                    shadeModeInteractor = shadeModeInteractor,
+                )
             }
         }
     }
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 ea3feea..7835631 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
@@ -17,6 +17,7 @@
 
 import com.android.systemui.communal.domain.interactor.communalInteractor
 import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor
+import com.android.systemui.dump.dumpManager
 import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
 import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
 import com.android.systemui.keyguard.domain.interactor.pulseExpansionInteractor
@@ -26,6 +27,7 @@
 import com.android.systemui.shade.domain.interactor.shadeInteractor
 import com.android.systemui.shade.ui.viewmodel.notificationShadeWindowModel
 import com.android.systemui.statusbar.notification.icon.ui.viewmodel.notificationIconContainerAlwaysOnDisplayViewModel
+import com.android.systemui.statusbar.notification.promoted.domain.interactor.aodPromotedNotificationInteractor
 import com.android.systemui.statusbar.notification.stack.domain.interactor.notificationsKeyguardInteractor
 import com.android.systemui.statusbar.phone.dozeParameters
 import com.android.systemui.statusbar.phone.screenOffAnimationController
@@ -41,6 +43,7 @@
         keyguardTransitionInteractor = keyguardTransitionInteractor,
         notificationsKeyguardInteractor = notificationsKeyguardInteractor,
         pulseExpansionInteractor = pulseExpansionInteractor,
+        aodPromotedNotificationInteractor = aodPromotedNotificationInteractor,
         aodNotificationIconViewModel = notificationIconContainerAlwaysOnDisplayViewModel,
         notificationShadeWindowModel = notificationShadeWindowModel,
         alternateBouncerToAodTransitionViewModel = alternateBouncerToAodTransitionViewModel,
@@ -90,5 +93,6 @@
         aodBurnInViewModel = aodBurnInViewModel,
         shadeInteractor = shadeInteractor,
         wallpaperFocalAreaInteractor = wallpaperFocalAreaInteractor,
+        dumpManager = dumpManager,
     )
 }
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 dd13b8b..b751e21 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
@@ -25,7 +25,7 @@
 import com.android.systemui.keyguard.shared.transition.keyguardTransitionAnimationCallbackDelegator
 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.shade.domain.interactor.shadeModeInteractor
 import com.android.systemui.unfold.domain.interactor.unfoldTransitionInteractor
 
 val Kosmos.lockscreenContentViewModelFactory by Fixture {
@@ -38,7 +38,7 @@
                 interactor = keyguardBlueprintInteractor,
                 authController = authController,
                 touchHandling = keyguardTouchHandlingViewModel,
-                shadeInteractor = shadeInteractor,
+                shadeModeInteractor = shadeModeInteractor,
                 unfoldTransitionInteractor = unfoldTransitionInteractor,
                 deviceEntryInteractor = deviceEntryInteractor,
                 transitionInteractor = keyguardTransitionInteractor,
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/GeneralKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/GeneralKosmos.kt
index b255b51..0443329 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/GeneralKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/GeneralKosmos.kt
@@ -57,12 +57,10 @@
 
 var Kosmos.testScope by Fixture { TestScope(testDispatcher) }
 var Kosmos.backgroundScope by Fixture { testScope.backgroundScope }
-var Kosmos.applicationCoroutineScope by Fixture { backgroundScope }
+var Kosmos.applicationCoroutineScope by Fixture { testScope.backgroundScope }
 var Kosmos.testCase: SysuiTestCase by Fixture()
-var Kosmos.backgroundCoroutineContext: CoroutineContext by Fixture {
-    backgroundScope.coroutineContext
-}
-var Kosmos.mainCoroutineContext: CoroutineContext by Fixture { testScope.coroutineContext }
+var Kosmos.backgroundCoroutineContext: CoroutineContext by Fixture { testDispatcher }
+var Kosmos.mainCoroutineContext: CoroutineContext by Fixture { testDispatcher }
 
 /**
  * Run this test body with a [Kosmos] as receiver, and using the [testScope] currently installed in
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 446e106..60b371a 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
@@ -90,6 +90,7 @@
 import com.android.systemui.statusbar.ui.viewmodel.keyguardStatusBarViewModel
 import com.android.systemui.util.time.systemClock
 import com.android.systemui.volume.domain.interactor.volumeDialogInteractor
+import com.android.systemui.window.domain.interactor.windowRootViewBlurInteractor
 
 /**
  * Helper for using [Kosmos] from Java.
@@ -192,4 +193,5 @@
     val disableFlagsInteractor by lazy { kosmos.disableFlagsInteractor }
     val fakeDisableFlagsRepository by lazy { kosmos.fakeDisableFlagsRepository }
     val mockWindowRootViewProvider by lazy { kosmos.mockWindowRootViewProvider }
+    val windowRootViewBlurInteractor by lazy { kosmos.windowRootViewBlurInteractor }
 }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeDisplayChangeLatencyTrackerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeDisplayChangeLatencyTrackerKosmos.kt
index 67dd0ad..0892e66 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeDisplayChangeLatencyTrackerKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeDisplayChangeLatencyTrackerKosmos.kt
@@ -27,7 +27,7 @@
 
 val Kosmos.shadeDisplayChangeLatencyTracker by Fixture {
     ShadeDisplayChangeLatencyTracker(
-        Optional.of(mockShadeRootView),
+        mockShadeRootView,
         configurationRepository,
         latencyTracker,
         testScope.backgroundScope,
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorKosmos.kt
index 4631413..1397d97 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorKosmos.kt
@@ -29,7 +29,6 @@
 import com.android.systemui.statusbar.notification.row.notificationRebindingTracker
 import com.android.systemui.statusbar.notification.stack.notificationStackRebindingHider
 import com.android.systemui.statusbar.policy.configurationController
-import java.util.Optional
 import org.mockito.kotlin.any
 import org.mockito.kotlin.mock
 import org.mockito.kotlin.whenever
@@ -55,11 +54,11 @@
             testScope.backgroundScope,
             testScope.backgroundScope.coroutineContext,
             mockedShadeDisplayChangeLatencyTracker,
-            Optional.of(shadeExpandedStateInteractor),
+            shadeExpandedStateInteractor,
             shadeExpansionIntent,
             activeNotificationsInteractor,
             notificationRebindingTracker,
-            Optional.of(notificationStackRebindingHider),
+            notificationStackRebindingHider,
             configurationController,
         )
     }
diff --git a/core/java/com/android/internal/app/IAppOpsCallback.aidl b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/ConversationNotificationManagerKosmos.kt
similarity index 60%
copy from core/java/com/android/internal/app/IAppOpsCallback.aidl
copy to packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/ConversationNotificationManagerKosmos.kt
index 3a9525c..af53ae56 100644
--- a/core/java/com/android/internal/app/IAppOpsCallback.aidl
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/ConversationNotificationManagerKosmos.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2013 The Android Open Source Project
+ * Copyright (C) 2025 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,10 +14,10 @@
  * limitations under the License.
  */
 
-package com.android.internal.app;
+package com.android.systemui.statusbar.notification
 
-// This interface is also used by native code, so must
-// be kept in sync with frameworks/native/libs/permission/include/binder/IAppOpsCallback.h
-oneway interface IAppOpsCallback {
-    void opChanged(int op, int uid, String packageName, String persistentDeviceId);
-}
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.util.mockito.mock
+
+val Kosmos.conversationNotificationManager: ConversationNotificationManager by
+    Kosmos.Fixture { mock<ConversationNotificationManager>() }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/collection/EntryUtil.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/collection/EntryUtil.kt
index 8b4de2b..05f1c0b 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/collection/EntryUtil.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/collection/EntryUtil.kt
@@ -33,3 +33,6 @@
 fun getAttachState(entry: ListEntry): ListAttachState {
     return entry.attachState
 }
+
+fun buildEntry(block: NotificationEntryBuilder.() -> Unit) =
+    NotificationEntryBuilder().apply(block).build()
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/icon/domain/interactor/NotificationIconsInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/icon/domain/interactor/NotificationIconsInteractorKosmos.kt
index dc7595f..87e0a0f 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/icon/domain/interactor/NotificationIconsInteractorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/icon/domain/interactor/NotificationIconsInteractorKosmos.kt
@@ -24,6 +24,7 @@
 import com.android.systemui.statusbar.notification.data.repository.notificationsKeyguardViewStateRepository
 import com.android.systemui.statusbar.notification.domain.interactor.activeNotificationsInteractor
 import com.android.systemui.statusbar.notification.domain.interactor.headsUpNotificationIconInteractor
+import com.android.systemui.statusbar.notification.promoted.domain.interactor.aodPromotedNotificationInteractor
 import com.android.wm.shell.bubbles.bubblesOptional
 
 val Kosmos.alwaysOnDisplayNotificationIconsInteractor by Fixture {
@@ -47,6 +48,7 @@
         activeNotificationsInteractor = activeNotificationsInteractor,
         bubbles = bubblesOptional,
         headsUpNotificationIconInteractor = headsUpNotificationIconInteractor,
+        aodPromotedNotificationInteractor = aodPromotedNotificationInteractor,
         keyguardViewStateRepository = notificationsKeyguardViewStateRepository,
     )
 }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/promoted/domain/interactor/AODPromotedNotificationInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/promoted/domain/interactor/AODPromotedNotificationInteractorKosmos.kt
new file mode 100644
index 0000000..df1c822
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/promoted/domain/interactor/AODPromotedNotificationInteractorKosmos.kt
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF 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.promoted.domain.interactor
+
+import com.android.systemui.dump.dumpManager
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.statusbar.notification.domain.interactor.activeNotificationsInteractor
+
+val Kosmos.aodPromotedNotificationInteractor by
+    Kosmos.Fixture {
+        AODPromotedNotificationInteractor(
+            activeNotificationsInteractor = activeNotificationsInteractor,
+            dumpManager = dumpManager,
+        )
+    }
diff --git a/core/java/com/android/internal/app/IAppOpsCallback.aidl b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderLoggerKosmos.kt
similarity index 61%
copy from core/java/com/android/internal/app/IAppOpsCallback.aidl
copy to packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderLoggerKosmos.kt
index 3a9525c..cc40222 100644
--- a/core/java/com/android/internal/app/IAppOpsCallback.aidl
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderLoggerKosmos.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2013 The Android Open Source Project
+ * Copyright (C) 2025 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,10 +14,10 @@
  * limitations under the License.
  */
 
-package com.android.internal.app;
+package com.android.systemui.statusbar.notification.row
 
-// This interface is also used by native code, so must
-// be kept in sync with frameworks/native/libs/permission/include/binder/IAppOpsCallback.h
-oneway interface IAppOpsCallback {
-    void opChanged(int op, int uid, String packageName, String persistentDeviceId);
-}
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.util.mockito.mock
+
+val Kosmos.notificationRowContentBinderLogger: NotificationRowContentBinderLogger by
+    Kosmos.Fixture { mock<NotificationRowContentBinderLogger>() }
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 7a2b7c2..047bd13 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
@@ -29,6 +29,7 @@
 import com.android.systemui.keyguard.ui.viewmodel.aodToLockscreenTransitionViewModel
 import com.android.systemui.keyguard.ui.viewmodel.aodToOccludedTransitionViewModel
 import com.android.systemui.keyguard.ui.viewmodel.aodToPrimaryBouncerTransitionViewModel
+import com.android.systemui.keyguard.ui.viewmodel.dozingToDreamingTransitionViewModel
 import com.android.systemui.keyguard.ui.viewmodel.dozingToGlanceableHubTransitionViewModel
 import com.android.systemui.keyguard.ui.viewmodel.dozingToLockscreenTransitionViewModel
 import com.android.systemui.keyguard.ui.viewmodel.dozingToOccludedTransitionViewModel
@@ -81,6 +82,7 @@
         aodToLockscreenTransitionViewModel = aodToLockscreenTransitionViewModel,
         aodToOccludedTransitionViewModel = aodToOccludedTransitionViewModel,
         aodToPrimaryBouncerTransitionViewModel = aodToPrimaryBouncerTransitionViewModel,
+        dozingToDreamingTransitionViewModel = dozingToDreamingTransitionViewModel,
         dozingToGlanceableHubTransitionViewModel = dozingToGlanceableHubTransitionViewModel,
         dozingToLockscreenTransitionViewModel = dozingToLockscreenTransitionViewModel,
         dozingToOccludedTransitionViewModel = dozingToOccludedTransitionViewModel,
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/battery/ui/viewmodel/BatteryViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/battery/ui/viewmodel/BatteryViewModelKosmos.kt
index c6cf006..7dd0103 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/battery/ui/viewmodel/BatteryViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/battery/ui/viewmodel/BatteryViewModelKosmos.kt
@@ -22,3 +22,10 @@
 
 val Kosmos.batteryViewModel by
     Kosmos.Fixture { BatteryViewModel(batteryInteractor, testableContext) }
+
+val Kosmos.batteryViewModelFactory by
+    Kosmos.Fixture {
+        object : BatteryViewModel.Factory {
+            override fun create(): BatteryViewModel = batteryViewModel
+        }
+    }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/FakeMobileIconsInteractor.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/FakeMobileIconsInteractor.kt
index 352f6cf..9b6f205 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/FakeMobileIconsInteractor.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/FakeMobileIconsInteractor.kt
@@ -26,6 +26,7 @@
 import com.android.systemui.statusbar.pipeline.mobile.data.model.SubscriptionModel
 import com.android.systemui.statusbar.pipeline.mobile.util.MobileMappingsProxy
 import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.StateFlow
 
 class FakeMobileIconsInteractor(
     mobileMappings: MobileMappingsProxy,
@@ -73,6 +74,8 @@
 
     override val icons: MutableStateFlow<List<MobileIconInteractor>> = MutableStateFlow(emptyList())
 
+    override val isStackable: StateFlow<Boolean> = MutableStateFlow(false)
+
     private val _defaultMobileIconMapping = MutableStateFlow(TEST_MAPPING)
     override val defaultMobileIconMapping = _defaultMobileIconMapping
 
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelKosmos.kt
index bc29dba..fbada93 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelKosmos.kt
@@ -35,6 +35,7 @@
 import com.android.systemui.statusbar.notification.stack.domain.interactor.headsUpNotificationInteractor
 import com.android.systemui.statusbar.phone.domain.interactor.darkIconInteractor
 import com.android.systemui.statusbar.phone.domain.interactor.lightsOutInteractor
+import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.batteryViewModelFactory
 import com.android.systemui.statusbar.pipeline.shared.domain.interactor.homeStatusBarIconBlockListInteractor
 import com.android.systemui.statusbar.pipeline.shared.domain.interactor.homeStatusBarInteractor
 
@@ -42,6 +43,7 @@
     Kosmos.Fixture {
         HomeStatusBarViewModelImpl(
             testableContext.displayId,
+            batteryViewModelFactory,
             tableLogBufferFactory,
             homeStatusBarInteractor,
             homeStatusBarIconBlockListInteractor,
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/util/time/FakeSystemClockKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/util/time/FakeSystemClockKosmos.kt
index 703d6ad..a209ec9 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/util/time/FakeSystemClockKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/util/time/FakeSystemClockKosmos.kt
@@ -31,3 +31,6 @@
     }
 
 val Kosmos.fakeSystemClock by Kosmos.Fixture { FakeSystemClock() }
+
+val SystemClock.fake
+    get() = this as FakeSystemClock
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ui/binder/VolumeDialogViewBinderKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ui/binder/VolumeDialogViewBinderKosmos.kt
index dc09e32..386e0fe 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ui/binder/VolumeDialogViewBinderKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ui/binder/VolumeDialogViewBinderKosmos.kt
@@ -16,7 +16,6 @@
 
 package com.android.systemui.volume.dialog.ui.binder
 
-import android.content.applicationContext
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.volume.dialog.ringer.volumeDialogRingerViewBinder
 import com.android.systemui.volume.dialog.settings.ui.binder.volumeDialogSettingsButtonViewBinder
@@ -28,12 +27,13 @@
 val Kosmos.volumeDialogViewBinder by
     Kosmos.Fixture {
         VolumeDialogViewBinder(
-            applicationContext.resources,
             volumeDialogViewModel,
             jankListenerFactory,
             volumeTracer,
-            volumeDialogRingerViewBinder,
-            volumeDialogSlidersViewBinder,
-            volumeDialogSettingsButtonViewBinder,
+            listOf(
+                volumeDialogSlidersViewBinder,
+                volumeDialogRingerViewBinder,
+                volumeDialogSettingsButtonViewBinder,
+            ),
         )
     }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioSharingStreamSliderViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioSharingStreamSliderViewModelKosmos.kt
index 96bc972..8c8d024 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioSharingStreamSliderViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioSharingStreamSliderViewModelKosmos.kt
@@ -16,11 +16,11 @@
 
 package com.android.systemui.volume.panel.component.volume.slider.ui.viewmodel
 
-import android.content.applicationContext
 import com.android.internal.logging.uiEventLogger
 import com.android.systemui.haptics.slider.sliderHapticsViewModelFactory
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.volume.domain.interactor.audioSharingInteractor
+import com.android.systemui.volume.shared.volumePanelLogger
 import kotlinx.coroutines.CoroutineScope
 
 val Kosmos.audioSharingStreamSliderViewModelFactory by
@@ -29,10 +29,10 @@
             override fun create(coroutineScope: CoroutineScope): AudioSharingStreamSliderViewModel {
                 return AudioSharingStreamSliderViewModel(
                     coroutineScope,
-                    applicationContext,
                     audioSharingInteractor,
                     uiEventLogger,
                     sliderHapticsViewModelFactory,
+                    volumePanelLogger,
                 )
             }
         }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/CastVolumeSliderViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/CastVolumeSliderViewModelKosmos.kt
index abd4235..6875619 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/CastVolumeSliderViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/CastVolumeSliderViewModelKosmos.kt
@@ -21,6 +21,7 @@
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.volume.mediaDeviceSessionInteractor
 import com.android.systemui.volume.panel.component.mediaoutput.shared.model.MediaDeviceSession
+import com.android.systemui.volume.shared.volumePanelLogger
 import kotlinx.coroutines.CoroutineScope
 
 val Kosmos.castVolumeSliderViewModelFactory by
@@ -36,6 +37,7 @@
                     applicationContext,
                     mediaDeviceSessionInteractor,
                     sliderHapticsViewModelFactory,
+                    volumePanelLogger,
                 )
             }
         }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/wallpapers/data/repository/WallpaperRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/wallpapers/data/repository/WallpaperRepositoryKosmos.kt
index 6b955ff..7ebec6c 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/wallpapers/data/repository/WallpaperRepositoryKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/wallpapers/data/repository/WallpaperRepositoryKosmos.kt
@@ -16,9 +16,27 @@
 
 package com.android.systemui.wallpapers.data.repository
 
+import android.content.applicationContext
+import com.android.app.wallpaperManager
+import com.android.systemui.broadcast.broadcastDispatcher
+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.testDispatcher
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.user.data.repository.userRepository
+import com.android.systemui.util.settings.fakeSettings
 
-var Kosmos.fakeWallpaperRepository by Kosmos.Fixture { FakeWallpaperRepository() }
-
-var Kosmos.wallpaperRepository: WallpaperRepository by Kosmos.Fixture { fakeWallpaperRepository }
+val Kosmos.wallpaperRepository by Fixture {
+    WallpaperRepositoryImpl(
+        context = applicationContext,
+        scope = testScope.backgroundScope,
+        bgDispatcher = testDispatcher,
+        broadcastDispatcher = broadcastDispatcher,
+        userRepository = userRepository,
+        keyguardTransitionInteractor = keyguardTransitionInteractor,
+        wallpaperFocalAreaRepository = wallpaperFocalAreaRepository,
+        wallpaperManager = wallpaperManager,
+        secureSettings = fakeSettings,
+    )
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/window/data/repository/WindowRootViewBlurRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/window/data/repository/WindowRootViewBlurRepositoryKosmos.kt
index 7281e03..b619e2d 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/window/data/repository/WindowRootViewBlurRepositoryKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/window/data/repository/WindowRootViewBlurRepositoryKosmos.kt
@@ -17,5 +17,17 @@
 package com.android.systemui.window.data.repository
 
 import com.android.systemui.kosmos.Kosmos
+import kotlinx.coroutines.flow.MutableStateFlow
 
-val Kosmos.windowRootViewBlurRepository by Kosmos.Fixture { WindowRootViewBlurRepository() }
+val Kosmos.fakeWindowRootViewBlurRepository: FakeWindowRootViewBlurRepository by
+    Kosmos.Fixture { FakeWindowRootViewBlurRepository() }
+
+val Kosmos.windowRootViewBlurRepository: WindowRootViewBlurRepository by
+    Kosmos.Fixture { fakeWindowRootViewBlurRepository }
+
+class FakeWindowRootViewBlurRepository : WindowRootViewBlurRepository {
+    override val blurRadius: MutableStateFlow<Int> = MutableStateFlow(0)
+    override val isBlurOpaque: MutableStateFlow<Boolean> = MutableStateFlow(false)
+    override val isBlurSupported: MutableStateFlow<Boolean> = MutableStateFlow(false)
+    override var blurAppliedListener: BlurAppliedListener? = null
+}
diff --git a/services/accessibility/accessibility.aconfig b/services/accessibility/accessibility.aconfig
index 529a564..bb0eacb 100644
--- a/services/accessibility/accessibility.aconfig
+++ b/services/accessibility/accessibility.aconfig
@@ -145,6 +145,13 @@
 }
 
 flag {
+    name: "enable_magnification_follows_mouse_with_pointer_motion_filter"
+    namespace: "accessibility"
+    description: "Whether to enable mouse following using pointer motion filter"
+    bug: "361817142"
+}
+
+flag {
     name: "enable_magnification_keyboard_control"
     namespace: "accessibility"
     description: "Whether to enable keyboard control for magnification"
diff --git a/services/accessibility/java/com/android/server/accessibility/autoclick/AutoclickController.java b/services/accessibility/java/com/android/server/accessibility/autoclick/AutoclickController.java
index db8441d..4fa0d50 100644
--- a/services/accessibility/java/com/android/server/accessibility/autoclick/AutoclickController.java
+++ b/services/accessibility/java/com/android/server/accessibility/autoclick/AutoclickController.java
@@ -17,11 +17,16 @@
 package com.android.server.accessibility.autoclick;
 
 import static android.view.MotionEvent.BUTTON_PRIMARY;
+import static android.view.MotionEvent.BUTTON_SECONDARY;
 import static android.view.accessibility.AccessibilityManager.AUTOCLICK_CURSOR_AREA_SIZE_DEFAULT;
 import static android.view.accessibility.AccessibilityManager.AUTOCLICK_DELAY_DEFAULT;
 import static android.view.accessibility.AccessibilityManager.AUTOCLICK_IGNORE_MINOR_CURSOR_MOVEMENT_DEFAULT;
 
 import static com.android.server.accessibility.autoclick.AutoclickIndicatorView.SHOW_INDICATOR_DELAY_TIME;
+import static com.android.server.accessibility.autoclick.AutoclickTypePanel.AUTOCLICK_TYPE_LEFT_CLICK;
+import static com.android.server.accessibility.autoclick.AutoclickTypePanel.AUTOCLICK_TYPE_RIGHT_CLICK;
+import static com.android.server.accessibility.autoclick.AutoclickTypePanel.AutoclickType;
+import static com.android.server.accessibility.autoclick.AutoclickTypePanel.ClickPanelControllerInterface;
 
 import android.accessibilityservice.AccessibilityTrace;
 import android.annotation.NonNull;
@@ -84,6 +89,23 @@
     @VisibleForTesting AutoclickTypePanel mAutoclickTypePanel;
     private WindowManager mWindowManager;
 
+    // Default click type is left-click.
+    private @AutoclickType int mActiveClickType = AUTOCLICK_TYPE_LEFT_CLICK;
+
+    @VisibleForTesting
+    final ClickPanelControllerInterface clickPanelController =
+            new ClickPanelControllerInterface() {
+                @Override
+                public void handleAutoclickTypeChange(@AutoclickType int clickType) {
+                    mActiveClickType = clickType;
+                }
+
+                @Override
+                public void toggleAutoclickPause() {
+                    // TODO(b/388872274): allows users to pause the autoclick.
+                }
+            };
+
     public AutoclickController(Context context, int userId, AccessibilityTraceManager trace) {
         mTrace = trace;
         mContext = context;
@@ -124,7 +146,8 @@
         mAutoclickIndicatorView = new AutoclickIndicatorView(mContext);
 
         mWindowManager = mContext.getSystemService(WindowManager.class);
-        mAutoclickTypePanel = new AutoclickTypePanel(mContext, mWindowManager);
+        mAutoclickTypePanel =
+                new AutoclickTypePanel(mContext, mWindowManager, clickPanelController);
 
         mAutoclickTypePanel.show();
         mWindowManager.addView(mAutoclickIndicatorView, mAutoclickIndicatorView.getLayoutParams());
@@ -515,6 +538,11 @@
             return mActive;
         }
 
+        @VisibleForTesting
+        long getScheduledClickTimeForTesting() {
+            return mScheduledClickTime;
+        }
+
         /**
          * Updates delay that should be used when scheduling clicks. The delay will be used only for
          * clicks scheduled after this point (pending click tasks are not affected).
@@ -644,6 +672,15 @@
 
             final long now = SystemClock.uptimeMillis();
 
+            // TODO(b/395094903): always triggers left-click when the cursor hovers over the
+            // autoclick type panel, to always allow users to change a different click type.
+            // Otherwise, if one chooses the right-click, this user won't be able to rely on
+            // autoclick to select other click types.
+            final int actionButton =
+                    mActiveClickType == AUTOCLICK_TYPE_RIGHT_CLICK
+                            ? BUTTON_SECONDARY
+                            : BUTTON_PRIMARY;
+
             MotionEvent downEvent =
                     MotionEvent.obtain(
                             /* downTime= */ now,
@@ -653,7 +690,7 @@
                             mTempPointerProperties,
                             mTempPointerCoords,
                             mMetaState,
-                            BUTTON_PRIMARY,
+                            actionButton,
                             /* xPrecision= */ 1.0f,
                             /* yPrecision= */ 1.0f,
                             mLastMotionEvent.getDeviceId(),
@@ -663,11 +700,11 @@
 
             MotionEvent pressEvent = MotionEvent.obtain(downEvent);
             pressEvent.setAction(MotionEvent.ACTION_BUTTON_PRESS);
-            pressEvent.setActionButton(BUTTON_PRIMARY);
+            pressEvent.setActionButton(actionButton);
 
             MotionEvent releaseEvent = MotionEvent.obtain(downEvent);
             releaseEvent.setAction(MotionEvent.ACTION_BUTTON_RELEASE);
-            releaseEvent.setActionButton(BUTTON_PRIMARY);
+            releaseEvent.setActionButton(actionButton);
             releaseEvent.setButtonState(0);
 
             MotionEvent upEvent = MotionEvent.obtain(downEvent);
diff --git a/services/accessibility/java/com/android/server/accessibility/autoclick/AutoclickIndicatorView.java b/services/accessibility/java/com/android/server/accessibility/autoclick/AutoclickIndicatorView.java
index 557e1b2..01f359f 100644
--- a/services/accessibility/java/com/android/server/accessibility/autoclick/AutoclickIndicatorView.java
+++ b/services/accessibility/java/com/android/server/accessibility/autoclick/AutoclickIndicatorView.java
@@ -34,6 +34,8 @@
 
 import androidx.annotation.VisibleForTesting;
 
+import com.android.internal.R;
+
 // A visual indicator for the autoclick feature.
 public class AutoclickIndicatorView extends View {
     private static final String TAG = AutoclickIndicatorView.class.getSimpleName();
@@ -67,8 +69,7 @@
         super(context);
 
         mPaint = new Paint();
-        // TODO(b/383901288): update styling once determined by UX.
-        mPaint.setARGB(255, 52, 103, 235);
+        mPaint.setColor(context.getColor(R.color.materialColorPrimary));
         mPaint.setStyle(Paint.Style.STROKE);
         mPaint.setStrokeWidth(10);
 
diff --git a/services/accessibility/java/com/android/server/accessibility/autoclick/AutoclickTypePanel.java b/services/accessibility/java/com/android/server/accessibility/autoclick/AutoclickTypePanel.java
index 2ef11f4..614b228 100644
--- a/services/accessibility/java/com/android/server/accessibility/autoclick/AutoclickTypePanel.java
+++ b/services/accessibility/java/com/android/server/accessibility/autoclick/AutoclickTypePanel.java
@@ -18,6 +18,7 @@
 
 import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
 
+import android.annotation.IntDef;
 import android.content.Context;
 import android.graphics.PixelFormat;
 import android.graphics.drawable.Drawable;
@@ -39,12 +40,40 @@
 
     private final String TAG = AutoclickTypePanel.class.getSimpleName();
 
+    public static final int AUTOCLICK_TYPE_LEFT_CLICK = 0;
+    public static final int AUTOCLICK_TYPE_RIGHT_CLICK = 1;
+    public static final int AUTOCLICK_TYPE_DOUBLE_CLICK = 2;
+    public static final int AUTOCLICK_TYPE_DRAG = 3;
+    public static final int AUTOCLICK_TYPE_SCROLL = 4;
+
+    // Types of click the AutoclickTypePanel supports.
+    @IntDef({
+        AUTOCLICK_TYPE_LEFT_CLICK,
+        AUTOCLICK_TYPE_RIGHT_CLICK,
+        AUTOCLICK_TYPE_DOUBLE_CLICK,
+        AUTOCLICK_TYPE_DRAG,
+        AUTOCLICK_TYPE_SCROLL,
+    })
+    public @interface AutoclickType {}
+
+    // An interface exposed to {@link AutoclickController) to handle different actions on the panel,
+    // including changing autoclick type, pausing/resuming autoclick.
+    public interface ClickPanelControllerInterface {
+        // Allows users to change a different autoclick type.
+        void handleAutoclickTypeChange(@AutoclickType int clickType);
+
+        // Allows users to pause/resume the autoclick.
+        void toggleAutoclickPause();
+    }
+
     private final Context mContext;
 
     private final View mContentView;
 
     private final WindowManager mWindowManager;
 
+    private final ClickPanelControllerInterface mClickPanelController;
+
     // Whether the panel is expanded or not.
     private boolean mExpanded = false;
 
@@ -56,9 +85,13 @@
 
     private LinearLayout mSelectedButton;
 
-    public AutoclickTypePanel(Context context, WindowManager windowManager) {
+    public AutoclickTypePanel(
+            Context context,
+            WindowManager windowManager,
+            ClickPanelControllerInterface clickPanelController) {
         mContext = context;
         mWindowManager = windowManager;
+        mClickPanelController = clickPanelController;
 
         mContentView =
                 LayoutInflater.from(context)
@@ -76,26 +109,35 @@
     }
 
     private void initializeButtonState() {
-        mLeftClickButton.setOnClickListener(v -> togglePanelExpansion(mLeftClickButton));
-        mRightClickButton.setOnClickListener(v -> togglePanelExpansion(mRightClickButton));
-        mDoubleClickButton.setOnClickListener(v -> togglePanelExpansion(mDoubleClickButton));
-        mScrollButton.setOnClickListener(v -> togglePanelExpansion(mScrollButton));
-        mDragButton.setOnClickListener(v -> togglePanelExpansion(mDragButton));
+        mLeftClickButton.setOnClickListener(v -> togglePanelExpansion(AUTOCLICK_TYPE_LEFT_CLICK));
+        mRightClickButton.setOnClickListener(v -> togglePanelExpansion(AUTOCLICK_TYPE_RIGHT_CLICK));
+        mDoubleClickButton.setOnClickListener(
+                v -> togglePanelExpansion(AUTOCLICK_TYPE_DOUBLE_CLICK));
+        mScrollButton.setOnClickListener(v -> togglePanelExpansion(AUTOCLICK_TYPE_SCROLL));
+        mDragButton.setOnClickListener(v -> togglePanelExpansion(AUTOCLICK_TYPE_DRAG));
+
+        // TODO(b/388872274): registers listener for pause button and allows users to pause/resume
+        // the autoclick.
+        // TODO(b/388847771): registers listener for position button and allows users to move the
+        // panel to a different position.
 
         // Initializes panel as collapsed state and only displays the left click button.
         hideAllClickTypeButtons();
         mLeftClickButton.setVisibility(View.VISIBLE);
-        setSelectedButton(/* selectedButton= */ mLeftClickButton);
+        setSelectedClickType(AUTOCLICK_TYPE_LEFT_CLICK);
     }
 
     /** Sets the selected button and updates the newly and previously selected button styling. */
-    private void setSelectedButton(@NonNull LinearLayout selectedButton) {
+    private void setSelectedClickType(@AutoclickType int clickType) {
+        final LinearLayout selectedButton = getButtonFromClickType(clickType);
+
         // Updates the previously selected button styling.
         if (mSelectedButton != null) {
             toggleSelectedButtonStyle(mSelectedButton, /* isSelected= */ false);
         }
 
         mSelectedButton = selectedButton;
+        mClickPanelController.handleAutoclickTypeChange(clickType);
 
         // Updates the newly selected button styling.
         toggleSelectedButtonStyle(selectedButton, /* isSelected= */ true);
@@ -126,11 +168,17 @@
     }
 
     public void hide() {
+        // Sets the button background to unselected styling, this is necessary to make sure the
+        // button background styling is correct when the panel shows up next time.
+        toggleSelectedButtonStyle(mSelectedButton, /* isSelected= */ false);
+
         mWindowManager.removeView(mContentView);
     }
 
     /** Toggles the panel expanded or collapsed state. */
-    private void togglePanelExpansion(LinearLayout button) {
+    private void togglePanelExpansion(@AutoclickType int clickType) {
+        final LinearLayout button = getButtonFromClickType(clickType);
+
         if (mExpanded) {
             // If the panel is already in expanded state, we should collapse it by hiding all
             // buttons except the one user selected.
@@ -138,7 +186,7 @@
             button.setVisibility(View.VISIBLE);
 
             // Sets the newly selected button.
-            setSelectedButton(/* selectedButton= */ button);
+            setSelectedClickType(clickType);
         } else {
             // If the panel is already collapsed, we just need to expand it.
             showAllClickTypeButtons();
@@ -166,6 +214,17 @@
         mScrollButton.setVisibility(View.VISIBLE);
     }
 
+    private LinearLayout getButtonFromClickType(@AutoclickType int clickType) {
+        return switch (clickType) {
+            case AUTOCLICK_TYPE_LEFT_CLICK -> mLeftClickButton;
+            case AUTOCLICK_TYPE_RIGHT_CLICK -> mRightClickButton;
+            case AUTOCLICK_TYPE_DOUBLE_CLICK -> mDoubleClickButton;
+            case AUTOCLICK_TYPE_DRAG -> mDragButton;
+            case AUTOCLICK_TYPE_SCROLL -> mScrollButton;
+            default -> throw new IllegalArgumentException("Unknown clickType " + clickType);
+        };
+    }
+
     @VisibleForTesting
     boolean getExpansionStateForTesting() {
         return mExpanded;
diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
index d47aab0..e0f2939 100644
--- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
+++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
@@ -16,7 +16,6 @@
 
 package com.android.server.appwidget;
 
-import static android.appwidget.flags.Flags.checkRemoteViewsUriPermission;
 import static android.appwidget.flags.Flags.remoteAdapterConversion;
 import static android.appwidget.flags.Flags.remoteViewsProto;
 import static android.appwidget.flags.Flags.removeAppWidgetServiceIoFromCriticalPath;
@@ -2560,9 +2559,7 @@
         // Make sure the package runs under the caller uid.
         mSecurityPolicy.enforceCallFromPackage(callingPackage);
         // Make sure RemoteViews do not contain URIs that the caller cannot access.
-        if (checkRemoteViewsUriPermission()) {
-            checkRemoteViewsUris(views);
-        }
+        checkRemoteViewsUris(views);
         synchronized (mLock) {
             ensureGroupStateLoadedLocked(userId);
 
diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
index 414db37..05301fd 100644
--- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
+++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
@@ -588,10 +588,10 @@
         @Override
         @EnforcePermission(DELIVER_COMPANION_MESSAGES)
         public void attachSystemDataTransport(String packageName, int userId, int associationId,
-                ParcelFileDescriptor fd) {
+                                              ParcelFileDescriptor fd, int flags) {
             attachSystemDataTransport_enforcePermission();
 
-            mTransportManager.attachSystemDataTransport(associationId, fd);
+            mTransportManager.attachSystemDataTransport(associationId, fd, flags);
         }
 
         @Override
diff --git a/services/companion/java/com/android/server/companion/securechannel/AttestationVerifier.java b/services/companion/java/com/android/server/companion/securechannel/AttestationVerifier.java
index df3071e..42af059 100644
--- a/services/companion/java/com/android/server/companion/securechannel/AttestationVerifier.java
+++ b/services/companion/java/com/android/server/companion/securechannel/AttestationVerifier.java
@@ -16,7 +16,9 @@
 
 package com.android.server.companion.securechannel;
 
+import static android.companion.CompanionDeviceManager.TRANSPORT_FLAG_EXTEND_PATCH_DIFF;
 import static android.security.attestationverification.AttestationVerificationManager.PARAM_CHALLENGE;
+import static android.security.attestationverification.AttestationVerificationManager.PARAM_MAX_PATCH_LEVEL_DIFF_MONTHS;
 import static android.security.attestationverification.AttestationVerificationManager.PROFILE_PEER_DEVICE;
 import static android.security.attestationverification.AttestationVerificationManager.TYPE_CHALLENGE;
 
@@ -34,15 +36,21 @@
 
 /**
  * Helper class to perform attestation verification synchronously.
+ *
+ * @hide
  */
 public class AttestationVerifier {
     private static final long ATTESTATION_VERIFICATION_TIMEOUT_SECONDS = 10; // 10 seconds
     private static final String PARAM_OWNED_BY_SYSTEM = "android.key_owned_by_system";
 
-    private final Context mContext;
+    private static final int EXTENDED_PATCH_LEVEL_DIFF_MONTHS = 24; // 2 years
 
-    AttestationVerifier(Context context) {
+    private final Context mContext;
+    private final int mFlags;
+
+    AttestationVerifier(Context context, int flags) {
         this.mContext = context;
+        this.mFlags = flags;
     }
 
     /**
@@ -59,10 +67,13 @@
             @NonNull byte[] remoteAttestation,
             @NonNull byte[] attestationChallenge
     ) throws SecureChannelException {
-        Bundle requirements = new Bundle();
+        final Bundle requirements = new Bundle();
         requirements.putByteArray(PARAM_CHALLENGE, attestationChallenge);
         requirements.putBoolean(PARAM_OWNED_BY_SYSTEM, true); // Custom parameter for CDM
 
+        // Apply flags to verifier requirements
+        updateRequirements(requirements);
+
         // Synchronously execute attestation verification.
         AtomicInteger verificationResult = new AtomicInteger(0);
         CountDownLatch verificationFinished = new CountDownLatch(1);
@@ -96,4 +107,15 @@
 
         return verificationResult.get();
     }
+
+    private void updateRequirements(Bundle requirements) {
+        if (mFlags == 0) {
+            return;
+        }
+
+        if ((mFlags & TRANSPORT_FLAG_EXTEND_PATCH_DIFF) > 0) {
+            requirements.putInt(PARAM_MAX_PATCH_LEVEL_DIFF_MONTHS,
+                    EXTENDED_PATCH_LEVEL_DIFF_MONTHS);
+        }
+    }
 }
diff --git a/services/companion/java/com/android/server/companion/securechannel/SecureChannel.java b/services/companion/java/com/android/server/companion/securechannel/SecureChannel.java
index 2d3782f..6c7c9b3 100644
--- a/services/companion/java/com/android/server/companion/securechannel/SecureChannel.java
+++ b/services/companion/java/com/android/server/companion/securechannel/SecureChannel.java
@@ -59,6 +59,7 @@
     private final Callback mCallback;
     private final byte[] mPreSharedKey;
     private final AttestationVerifier mVerifier;
+    private final int mFlags;
 
     private volatile boolean mStopped;
     private volatile boolean mInProgress;
@@ -89,7 +90,7 @@
             @NonNull Callback callback,
             @NonNull byte[] preSharedKey
     ) {
-        this(in, out, callback, preSharedKey, null);
+        this(in, out, callback, preSharedKey, null, 0);
     }
 
     /**
@@ -100,14 +101,16 @@
      * @param out output stream from which data is sent out
      * @param callback subscription to received messages from the channel
      * @param context context for fetching the Attestation Verifier Framework system service
+     * @param flags flags for custom security settings on the channel
      */
     public SecureChannel(
             @NonNull final InputStream in,
             @NonNull final OutputStream out,
             @NonNull Callback callback,
-            @NonNull Context context
+            @NonNull Context context,
+            int flags
     ) {
-        this(in, out, callback, null, new AttestationVerifier(context));
+        this(in, out, callback, null, new AttestationVerifier(context, flags), flags);
     }
 
     public SecureChannel(
@@ -115,13 +118,15 @@
             final OutputStream out,
             Callback callback,
             byte[] preSharedKey,
-            AttestationVerifier verifier
+            AttestationVerifier verifier,
+            int flags
     ) {
         this.mInput = in;
         this.mOutput = out;
         this.mCallback = callback;
         this.mPreSharedKey = preSharedKey;
         this.mVerifier = verifier;
+        this.mFlags = flags;
     }
 
     /**
diff --git a/services/companion/java/com/android/server/companion/transport/CompanionTransportManager.java b/services/companion/java/com/android/server/companion/transport/CompanionTransportManager.java
index 3608360..92d9fb0 100644
--- a/services/companion/java/com/android/server/companion/transport/CompanionTransportManager.java
+++ b/services/companion/java/com/android/server/companion/transport/CompanionTransportManager.java
@@ -16,7 +16,11 @@
 
 package com.android.server.companion.transport;
 
+import static android.companion.AssociationRequest.DEVICE_PROFILE_WEARABLE_SENSING;
 import static android.companion.CompanionDeviceManager.MESSAGE_REQUEST_PERMISSION_RESTORE;
+import static android.companion.CompanionDeviceManager.TRANSPORT_FLAG_EXTEND_PATCH_DIFF;
+
+import static com.android.server.companion.transport.TransportUtils.enforceAssociationCanUseTransportFlags;
 
 import android.annotation.NonNull;
 import android.annotation.SuppressLint;
@@ -152,10 +156,14 @@
     /**
      * Attach transport.
      */
-    public void attachSystemDataTransport(int associationId, ParcelFileDescriptor fd) {
+    public void attachSystemDataTransport(int associationId, ParcelFileDescriptor fd,
+                                          int flags) {
         Slog.i(TAG, "Attaching transport for association id=[" + associationId + "]...");
 
-        mAssociationStore.getAssociationWithCallerChecks(associationId);
+        AssociationInfo association =
+                mAssociationStore.getAssociationWithCallerChecks(associationId);
+
+        enforceAssociationCanUseTransportFlags(association, flags);
 
         synchronized (mTransports) {
             if (mTransports.contains(associationId)) {
@@ -163,7 +171,7 @@
             }
 
             // TODO: Implement new API to pass a PSK
-            initializeTransport(associationId, fd, null);
+            initializeTransport(association, fd, null, flags);
 
             notifyOnTransportsChanged();
         }
@@ -217,10 +225,12 @@
         }
     }
 
-    private void initializeTransport(int associationId,
+    private void initializeTransport(AssociationInfo association,
                                      ParcelFileDescriptor fd,
-                                     byte[] preSharedKey) {
+                                     byte[] preSharedKey,
+                                     int flags) {
         Slog.i(TAG, "Initializing transport");
+        int associationId = association.getId();
         Transport transport;
         if (!isSecureTransportEnabled()) {
             // If secure transport is explicitly disabled for testing, use raw transport
@@ -230,15 +240,21 @@
             // If device is debug build, use hardcoded test key for authentication
             Slog.d(TAG, "Creating an unauthenticated secure channel");
             final byte[] testKey = "CDM".getBytes(StandardCharsets.UTF_8);
-            transport = new SecureTransport(associationId, fd, mContext, testKey, null);
+            transport = new SecureTransport(associationId, fd, mContext, testKey, null, 0);
         } else if (preSharedKey != null) {
             // If either device is not Android, then use app-specific pre-shared key
             Slog.d(TAG, "Creating a PSK-authenticated secure channel");
-            transport = new SecureTransport(associationId, fd, mContext, preSharedKey, null);
+            transport = new SecureTransport(associationId, fd, mContext, preSharedKey, null, 0);
+        } else if (DEVICE_PROFILE_WEARABLE_SENSING.equals(association.getDeviceProfile())) {
+            // If device is glasses with WEARABLE_SENSING profile, extend the allowed patch
+            // difference to 2 years instead of 1.
+            Slog.d(TAG, "Creating a secure channel with extended patch difference allowance");
+            transport = new SecureTransport(associationId, fd, mContext,
+                    TRANSPORT_FLAG_EXTEND_PATCH_DIFF);
         } else {
             // If none of the above applies, then use secure channel with attestation verification
             Slog.d(TAG, "Creating a secure channel");
-            transport = new SecureTransport(associationId, fd, mContext);
+            transport = new SecureTransport(associationId, fd, mContext, flags);
         }
 
         addMessageListenersToTransport(transport);
diff --git a/services/companion/java/com/android/server/companion/transport/SecureTransport.java b/services/companion/java/com/android/server/companion/transport/SecureTransport.java
index 1e95e65..77dc809 100644
--- a/services/companion/java/com/android/server/companion/transport/SecureTransport.java
+++ b/services/companion/java/com/android/server/companion/transport/SecureTransport.java
@@ -36,15 +36,22 @@
 
     private final BlockingQueue<byte[]> mRequestQueue = new ArrayBlockingQueue<>(500);
 
-    SecureTransport(int associationId, ParcelFileDescriptor fd, Context context) {
+    SecureTransport(int associationId, ParcelFileDescriptor fd, Context context, int flags) {
         super(associationId, fd, context);
-        mSecureChannel = new SecureChannel(mRemoteIn, mRemoteOut, this, context);
+        mSecureChannel = new SecureChannel(mRemoteIn, mRemoteOut, this, context, flags);
     }
 
     SecureTransport(int associationId, ParcelFileDescriptor fd, Context context,
-            byte[] preSharedKey, AttestationVerifier verifier) {
+            byte[] preSharedKey, AttestationVerifier verifier, int flags) {
         super(associationId, fd, context);
-        mSecureChannel = new SecureChannel(mRemoteIn, mRemoteOut, this, preSharedKey, verifier);
+        mSecureChannel = new SecureChannel(
+                mRemoteIn,
+                mRemoteOut,
+                this,
+                preSharedKey,
+                verifier,
+                flags
+        );
     }
 
     @Override
diff --git a/services/companion/java/com/android/server/companion/transport/TransportUtils.java b/services/companion/java/com/android/server/companion/transport/TransportUtils.java
new file mode 100644
index 0000000..7a15c11
--- /dev/null
+++ b/services/companion/java/com/android/server/companion/transport/TransportUtils.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.server.companion.transport;
+
+import static android.companion.AssociationRequest.DEVICE_PROFILE_WEARABLE_SENSING;
+import static android.companion.CompanionDeviceManager.TRANSPORT_FLAG_EXTEND_PATCH_DIFF;
+
+import static java.util.Collections.unmodifiableMap;
+
+import android.companion.AssociationInfo;
+import android.util.ArrayMap;
+
+import java.util.Map;
+
+/**
+ * Utility class for transport manager.
+ * @hide
+ */
+public final class TransportUtils {
+
+    /**
+     * Device profile -> Union of allowlisted transport flags
+     */
+    private static final Map<String, Integer> DEVICE_PROFILE_TRANSPORT_FLAGS_ALLOWLIST;
+    static {
+        final Map<String, Integer> map = new ArrayMap<>();
+        map.put(DEVICE_PROFILE_WEARABLE_SENSING,
+                TRANSPORT_FLAG_EXTEND_PATCH_DIFF);
+        DEVICE_PROFILE_TRANSPORT_FLAGS_ALLOWLIST = unmodifiableMap(map);
+    }
+
+    /**
+     * Enforce that the association that is trying to attach a transport with provided flags has
+     * one of the allowlisted device profiles that may apply the flagged features.
+     *
+     * @param association Association for which transport is being attached
+     * @param flags Flags for features being applied to the transport
+     */
+    public static void enforceAssociationCanUseTransportFlags(
+            AssociationInfo association, int flags) {
+        if (flags == 0) {
+            return;
+        }
+
+        final String deviceProfile = association.getDeviceProfile();
+        if (!DEVICE_PROFILE_TRANSPORT_FLAGS_ALLOWLIST.containsKey(deviceProfile)) {
+            throw new IllegalArgumentException("Association (id=" + association.getId()
+                    + ") with device profile " + deviceProfile + " does not support the "
+                    + "usage of transport flags.");
+        }
+
+        int allowedFlags = DEVICE_PROFILE_TRANSPORT_FLAGS_ALLOWLIST.get(deviceProfile);
+
+        // Ensure that every non-zero bits in flags are also present in allowed flags
+        if ((allowedFlags & flags) != flags) {
+            throw new IllegalArgumentException("Association (id=" + association.getId()
+                    + ") does not have the device profile required to use at least "
+                    + "one of the flags in this transport.");
+        }
+    }
+
+    private TransportUtils() {}
+}
diff --git a/services/contextualsearch/java/com/android/server/contextualsearch/ContextualSearchManagerService.java b/services/contextualsearch/java/com/android/server/contextualsearch/ContextualSearchManagerService.java
index 89c9d69..700a162 100644
--- a/services/contextualsearch/java/com/android/server/contextualsearch/ContextualSearchManagerService.java
+++ b/services/contextualsearch/java/com/android/server/contextualsearch/ContextualSearchManagerService.java
@@ -34,6 +34,8 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.RequiresPermission;
+import android.app.ActivityManager;
+import android.app.ActivityManagerInternal;
 import android.app.ActivityOptions;
 import android.app.AppOpsManager;
 import android.app.admin.DevicePolicyManagerInternal;
@@ -69,7 +71,6 @@
 import android.util.Log;
 import android.util.Slog;
 import android.view.IWindowManager;
-import android.window.ScreenCapture;
 import android.window.ScreenCapture.ScreenshotHardwareBuffer;
 
 import com.android.internal.R;
@@ -86,7 +87,6 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
-import java.util.Set;
 
 public class ContextualSearchManagerService extends SystemService {
     private static final String TAG = ContextualSearchManagerService.class.getSimpleName();
@@ -95,9 +95,20 @@
     private static final int MSG_INVALIDATE_TOKEN = 1;
     private static final int MAX_TOKEN_VALID_DURATION_MS = 1_000 * 60 * 10; // 10 minutes
 
+    /**
+     * Below are internal entrypoints not supported by the
+     * {@link ContextualSearchManager#startContextualSearch(int entrypoint)} method.
+     *
+     * <p>These values should be negative to avoid conflicting with the system entrypoints.
+     */
+
+    /** Entrypoint to be used when a foreground app invokes Contextual Search. */
+    private static final int INTERNAL_ENTRYPOINT_APP = -1;
+
     private static final boolean DEBUG = false;
 
     private final Context mContext;
+    private final ActivityManagerInternal mActivityManagerInternal;
     private final ActivityTaskManagerInternal mAtmInternal;
     private final PackageManagerInternal mPackageManager;
     private final WindowManagerInternal mWmInternal;
@@ -162,6 +173,8 @@
         super(context);
         if (DEBUG) Log.d(TAG, "ContextualSearchManagerService created");
         mContext = context;
+        mActivityManagerInternal = Objects.requireNonNull(
+                LocalServices.getService(ActivityManagerInternal.class));
         mAtmInternal = Objects.requireNonNull(
                 LocalServices.getService(ActivityTaskManagerInternal.class));
         mPackageManager = LocalServices.getService(PackageManagerInternal.class);
@@ -391,6 +404,20 @@
         }
     }
 
+    private void enforceForegroundApp(@NonNull final String func) {
+        final int callingUid = Binder.getCallingUid();
+        final String callingPackage = mPackageManager.getNameForUid(Binder.getCallingUid());
+        if (mActivityManagerInternal.getUidProcessState(callingUid)
+                > ActivityManager.PROCESS_STATE_TOP) {
+            // The calling process must be displaying an activity in foreground to
+            // trigger contextual search.
+            String msg = "Permission Denial: Cannot call " + func + " from pid="
+                    + Binder.getCallingPid() + ", uid=" + callingUid
+                    + ", package=" + callingPackage + " without a foreground activity.";
+            throw new SecurityException(msg);
+        }
+    }
+
     private void enforceOverridingPermission(@NonNull final String func) {
         if (!(Binder.getCallingUid() == Process.SHELL_UID
                 || Binder.getCallingUid() == Process.ROOT_UID
@@ -448,29 +475,43 @@
         }
 
         @Override
+        public void startContextualSearchForForegroundApp() {
+            synchronized (this) {
+                if (DEBUG) {
+                    Log.d(TAG, "Starting contextual search from: "
+                            + mPackageManager.getNameForUid(Binder.getCallingUid()));
+                }
+                enforceForegroundApp("startContextualSearchForForegroundApp");
+                startContextualSearchInternal(INTERNAL_ENTRYPOINT_APP);
+            }
+        }
+
+        @Override
         public void startContextualSearch(int entrypoint) {
             synchronized (this) {
                 if (DEBUG) Log.d(TAG, "startContextualSearch entrypoint: " + entrypoint);
                 enforcePermission("startContextualSearch");
-                final int callingUserId = Binder.getCallingUserHandle().getIdentifier();
-
-                mAssistDataRequester.cancel();
-                // Creates a new CallbackToken at mToken and an expiration handler.
-                issueToken();
-                // 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.
-                Binder.withCleanCallingIdentity(() -> {
-                    Intent launchIntent =
-                        getContextualSearchIntent(entrypoint, callingUserId, mToken);
-                    if (launchIntent != null) {
-                        int result = invokeContextualSearchIntent(launchIntent, callingUserId);
-                        if (DEBUG) Log.d(TAG, "Launch result: " + result);
-                    }
-                });
+                startContextualSearchInternal(entrypoint);
             }
         }
 
+        private void startContextualSearchInternal(int entrypoint) {
+            final int callingUserId = Binder.getCallingUserHandle().getIdentifier();
+            mAssistDataRequester.cancel();
+            // Creates a new CallbackToken at mToken and an expiration handler.
+            issueToken();
+            // 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.
+            Binder.withCleanCallingIdentity(() -> {
+                Intent launchIntent = getContextualSearchIntent(entrypoint, callingUserId, mToken);
+                if (launchIntent != null) {
+                    int result = invokeContextualSearchIntent(launchIntent, callingUserId);
+                    if (DEBUG) Log.d(TAG, "Launch result: " + result);
+                }
+            });
+        }
+
         @Override
         public void getContextualSearchState(
                 @NonNull IBinder token,
diff --git a/services/core/Android.bp b/services/core/Android.bp
index 00db11e..2aaf6a9 100644
--- a/services/core/Android.bp
+++ b/services/core/Android.bp
@@ -300,10 +300,7 @@
 
 java_library {
     name: "services.core",
-    static_libs: select(release_flag("RELEASE_SERVICES_JAVA_GENRULE_COMBINER"), {
-        true: ["services.core.combined"],
-        default: ["services.core.priorityboosted"],
-    }),
+    static_libs: ["services.core.combined"],
 }
 
 java_library_host {
diff --git a/services/core/java/com/android/server/UiModeManagerService.java b/services/core/java/com/android/server/UiModeManagerService.java
index 4976a63..8eda176 100644
--- a/services/core/java/com/android/server/UiModeManagerService.java
+++ b/services/core/java/com/android/server/UiModeManagerService.java
@@ -18,7 +18,6 @@
 
 import static android.app.Flags.enableCurrentModeTypeBinderCache;
 import static android.app.Flags.enableNightModeBinderCache;
-import static android.app.Flags.modesApi;
 import static android.app.UiModeManager.ContrastUtils.CONTRAST_DEFAULT_VALUE;
 import static android.app.UiModeManager.DEFAULT_PRIORITY;
 import static android.app.UiModeManager.FORCE_INVERT_TYPE_DARK;
@@ -2208,14 +2207,12 @@
             appliedOverrides = true;
         }
 
-        if (modesApi()) {
-            // Computes final night mode values based on Attention Mode.
-            mComputedNightMode = switch (mAttentionModeThemeOverlay) {
-                case (UiModeManager.MODE_ATTENTION_THEME_OVERLAY_NIGHT) -> true;
-                case (UiModeManager.MODE_ATTENTION_THEME_OVERLAY_DAY) -> false;
-                default -> newComputedValue; // case OFF
-            };
-        }
+        // Computes final night mode values based on Attention Mode.
+        mComputedNightMode = switch (mAttentionModeThemeOverlay) {
+            case (UiModeManager.MODE_ATTENTION_THEME_OVERLAY_NIGHT) -> true;
+            case (UiModeManager.MODE_ATTENTION_THEME_OVERLAY_DAY) -> false;
+            default -> newComputedValue; // case OFF
+        };
 
         if (appliedOverrides) {
             return;
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index f340169..6e3d7bd 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -8315,14 +8315,6 @@
                         setThreadScheduler(proc.getRenderThreadTid(),
                                 SCHED_FIFO | SCHED_RESET_ON_FORK, 1);
                     } else {
-                        if (Flags.resetOnForkEnabled()) {
-                            if (Process.getThreadScheduler(proc.getRenderThreadTid())
-                                    == Process.SCHED_OTHER) {
-                                Process.setThreadScheduler(proc.getRenderThreadTid(),
-                                    Process.SCHED_OTHER | Process.SCHED_RESET_ON_FORK,
-                                    0);
-                            }
-                        }
                         setThreadPriority(proc.getRenderThreadTid(),
                             THREAD_PRIORITY_TOP_APP_BOOST);
                     }
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index cd40905..61c5501 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -471,13 +471,6 @@
         }
 
         void setThreadPriority(int tid, int priority) {
-            if (Flags.resetOnForkEnabled()) {
-                if (Process.getThreadScheduler(tid) == Process.SCHED_OTHER) {
-                    Process.setThreadScheduler(tid,
-                        Process.SCHED_OTHER | Process.SCHED_RESET_ON_FORK,
-                        0);
-                }
-            }
             Process.setThreadPriority(tid, priority);
         }
     }
diff --git a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
index c633830..f1007e7 100644
--- a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
+++ b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
@@ -186,9 +186,28 @@
         "core_libraries",
         "crumpet",
         "dck_framework",
+        "desktop_apps",
+        "desktop_better_together",
+        "desktop_bsp",
+        "desktop_camera",
         "desktop_connectivity",
+        "desktop_display",
+        "desktop_commercial",
+        "desktop_firmware",
+        "desktop_graphics",
         "desktop_hwsec",
+        "desktop_input",
+        "desktop_kernel",
+        "desktop_ml",
+        "desktop_serviceability",
+        "desktop_oobe",
+        "desktop_peripherals",
+        "desktop_pnp",
+        "desktop_security",
         "desktop_stats",
+        "desktop_sysui",
+        "desktop_users_and_accounts",
+        "desktop_video",
         "desktop_wifi",
         "devoptions_settings",
         "game",
diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java
index 27e9e44..e0fbaf4 100644
--- a/services/core/java/com/android/server/am/UserController.java
+++ b/services/core/java/com/android/server/am/UserController.java
@@ -31,6 +31,7 @@
 import static android.app.ActivityManagerInternal.ALLOW_NON_FULL;
 import static android.app.ActivityManagerInternal.ALLOW_NON_FULL_IN_PROFILE;
 import static android.app.ActivityManagerInternal.ALLOW_PROFILES_OR_NON_FULL;
+import static android.app.KeyguardManager.LOCK_ON_USER_SWITCH_CALLBACK;
 import static android.os.PowerWhitelistManager.REASON_BOOT_COMPLETED;
 import static android.os.PowerWhitelistManager.REASON_LOCKED_BOOT_COMPLETED;
 import static android.os.PowerWhitelistManager.TEMPORARY_ALLOWLIST_TYPE_FOREGROUND_SERVICE_ALLOWED;
@@ -3904,10 +3905,6 @@
             return mService.mWindowManager;
         }
 
-        ActivityTaskManagerInternal getActivityTaskManagerInternal() {
-            return mService.mAtmInternal;
-        }
-
         void activityManagerOnUserStopped(@UserIdInt int userId) {
             LocalServices.getService(ActivityTaskManagerInternal.class).onUserStopped(userId);
         }
@@ -4122,40 +4119,25 @@
         }
 
         void lockDeviceNowAndWaitForKeyguardShown() {
-            if (getWindowManager().isKeyguardLocked()) {
-                Slogf.w(TAG, "Not locking the device since the keyguard is already locked");
-                return;
-            }
-
             final TimingsTraceAndSlog t = new TimingsTraceAndSlog();
             t.traceBegin("lockDeviceNowAndWaitForKeyguardShown");
 
             final CountDownLatch latch = new CountDownLatch(1);
-            ActivityTaskManagerInternal.ScreenObserver screenObserver =
-                    new ActivityTaskManagerInternal.ScreenObserver() {
-                        @Override
-                        public void onAwakeStateChanged(boolean isAwake) {
-
-                        }
-
-                        @Override
-                        public void onKeyguardStateChanged(boolean isShowing) {
-                            if (isShowing) {
-                                latch.countDown();
-                            }
-                        }
-                    };
-
-            getActivityTaskManagerInternal().registerScreenObserver(screenObserver);
-            getWindowManager().lockDeviceNow();
+            Bundle bundle = new Bundle();
+            bundle.putBinder(LOCK_ON_USER_SWITCH_CALLBACK, new IRemoteCallback.Stub() {
+                public void sendResult(Bundle data) {
+                    latch.countDown();
+                }
+            });
+            getWindowManager().lockNow(bundle);
             try {
                 if (!latch.await(20, TimeUnit.SECONDS)) {
-                    throw new RuntimeException("Keyguard is not shown in 20 seconds");
+                    throw new RuntimeException("User controller expected a callback while waiting "
+                            + "to show the keyguard. Timed out after 20 seconds.");
                 }
             } catch (InterruptedException e) {
                 throw new RuntimeException(e);
             } finally {
-                getActivityTaskManagerInternal().unregisterScreenObserver(screenObserver);
                 t.traceEnd();
             }
         }
diff --git a/services/core/java/com/android/server/am/flags.aconfig b/services/core/java/com/android/server/am/flags.aconfig
index e89889e..27c384a 100644
--- a/services/core/java/com/android/server/am/flags.aconfig
+++ b/services/core/java/com/android/server/am/flags.aconfig
@@ -205,13 +205,6 @@
 }
 
 flag {
-    name: "reset_on_fork_enabled"
-    namespace: "system_performance"
-    description: "Set reset_on_fork flag."
-    bug: "370988407"
-}
-
-flag {
     name: "push_global_state_to_oomadjuster"
     namespace: "backstage_power"
     description: "Migrate OomAdjuster pulled device state to a push model"
@@ -319,3 +312,14 @@
         purpose: PURPOSE_BUGFIX
     }
 }
+
+flag {
+    name: "lower_sms_oom_importance"
+    namespace: "backstage_power"
+    description: "Lower messaging app process oom importance to PERCEPTIBLE_APP_ADJ + 1."
+    bug: "372511805"
+    is_fixed_read_only: true
+    metadata {
+        purpose: PURPOSE_BUGFIX
+    }
+}
diff --git a/services/core/java/com/android/server/app/GameManagerService.java b/services/core/java/com/android/server/app/GameManagerService.java
index c0a97db..7672011 100644
--- a/services/core/java/com/android/server/app/GameManagerService.java
+++ b/services/core/java/com/android/server/app/GameManagerService.java
@@ -361,6 +361,14 @@
                 case POPULATE_GAME_MODE_SETTINGS: {
                     removeEqualMessages(POPULATE_GAME_MODE_SETTINGS, msg.obj);
                     final int userId = (int) msg.obj;
+                    synchronized (mLock) {
+                        if (!mSettings.containsKey(userId)) {
+                            GameManagerSettings userSettings = new GameManagerSettings(
+                                    Environment.getDataSystemDeDirectory(userId));
+                            mSettings.put(userId, userSettings);
+                            userSettings.readPersistentDataLocked();
+                        }
+                    }
                     final String[] packageNames = getInstalledGamePackageNames(userId);
                     updateConfigsForUser(userId, false /*checkGamePackage*/, packageNames);
                     break;
@@ -990,8 +998,7 @@
         @Override
         public void onUserStarting(@NonNull TargetUser user) {
             Slog.d(TAG, "Starting user " + user.getUserIdentifier());
-            mService.onUserStarting(user,
-                    Environment.getDataSystemDeDirectory(user.getUserIdentifier()));
+            mService.onUserStarting(user, /*settingDataDirOverride*/ null);
         }
 
         @Override
@@ -1596,13 +1603,16 @@
         }
     }
 
-    void onUserStarting(@NonNull TargetUser user, File settingDataDir) {
+    void onUserStarting(@NonNull TargetUser user, File settingDataDirOverride) {
         final int userId = user.getUserIdentifier();
-        synchronized (mLock) {
-            if (!mSettings.containsKey(userId)) {
-                GameManagerSettings userSettings = new GameManagerSettings(settingDataDir);
-                mSettings.put(userId, userSettings);
-                userSettings.readPersistentDataLocked();
+        if (settingDataDirOverride != null) {
+            synchronized (mLock) {
+                if (!mSettings.containsKey(userId)) {
+                    GameManagerSettings userSettings = new GameManagerSettings(
+                            settingDataDirOverride);
+                    mSettings.put(userId, userSettings);
+                    userSettings.readPersistentDataLocked();
+                }
             }
         }
         sendUserMessage(userId, POPULATE_GAME_MODE_SETTINGS, EVENT_ON_USER_STARTING,
diff --git a/services/core/java/com/android/server/app/GameManagerSettings.java b/services/core/java/com/android/server/app/GameManagerSettings.java
index c57a1f7..fd4bf2f 100644
--- a/services/core/java/com/android/server/app/GameManagerSettings.java
+++ b/services/core/java/com/android/server/app/GameManagerSettings.java
@@ -221,9 +221,7 @@
             return false;
         }
 
-        try {
-            final FileInputStream str = mSettingsFile.openRead();
-
+        try (FileInputStream str = mSettingsFile.openRead()) {
             final TypedXmlPullParser parser = Xml.resolvePullParser(str);
             int type;
             while ((type = parser.next()) != XmlPullParser.START_TAG
@@ -251,7 +249,6 @@
                             + type);
                 }
             }
-            str.close();
         } catch (XmlPullParserException | java.io.IOException e) {
             Slog.wtf(TAG, "Error reading game manager settings", e);
             return false;
diff --git a/services/core/java/com/android/server/appbinding/AppBindingConstants.java b/services/core/java/com/android/server/appbinding/AppBindingConstants.java
index 7184769..561cc0e 100644
--- a/services/core/java/com/android/server/appbinding/AppBindingConstants.java
+++ b/services/core/java/com/android/server/appbinding/AppBindingConstants.java
@@ -102,9 +102,16 @@
 
         boolean smsServiceEnabled = parser.getBoolean(SMS_SERVICE_ENABLED_KEY, true);
 
-        int smsAppBindFlags = parser.getInt(
-                SMS_APP_BIND_FLAGS_KEY,
-                Context.BIND_NOT_VISIBLE | Context.BIND_FOREGROUND_SERVICE);
+        int smsAppBindFlags;
+        if (com.android.server.am.Flags.lowerSmsOomImportance()) {
+            smsAppBindFlags = parser.getInt(
+                    SMS_APP_BIND_FLAGS_KEY,
+                    Context.BIND_ALMOST_PERCEPTIBLE | Context.BIND_FOREGROUND_SERVICE);
+        } else {
+            smsAppBindFlags = parser.getInt(
+                    SMS_APP_BIND_FLAGS_KEY,
+                    Context.BIND_NOT_VISIBLE | Context.BIND_FOREGROUND_SERVICE);
+        }
 
         long serviceStableConnectionThresholdSec = parser.getLong(
                 SERVICE_STABLE_CONNECTION_THRESHOLD_SEC_KEY, TimeUnit.MINUTES.toSeconds(2));
diff --git a/services/core/java/com/android/server/audio/AudioDeviceBroker.java b/services/core/java/com/android/server/audio/AudioDeviceBroker.java
index 4ec8138..6d6e1fb 100644
--- a/services/core/java/com/android/server/audio/AudioDeviceBroker.java
+++ b/services/core/java/com/android/server/audio/AudioDeviceBroker.java
@@ -1030,38 +1030,10 @@
         }
     }
 
-    BtDeviceInfo createBtDeviceInfo(@NonNull BtDeviceChangedData d, @NonNull BluetoothDevice device,
-                int state) {
-        int audioDevice;
-        int codec = AudioSystem.AUDIO_FORMAT_DEFAULT;
-        switch (d.mInfo.getProfile()) {
-            case BluetoothProfile.A2DP_SINK:
-                audioDevice = AudioSystem.DEVICE_IN_BLUETOOTH_A2DP;
-                break;
-            case BluetoothProfile.A2DP:
-                audioDevice = AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP;
-                break;
-            case BluetoothProfile.HEARING_AID:
-                audioDevice = AudioSystem.DEVICE_OUT_HEARING_AID;
-                break;
-            case BluetoothProfile.LE_AUDIO:
-                if (d.mInfo.isLeOutput()) {
-                    audioDevice = AudioSystem.DEVICE_OUT_BLE_HEADSET;
-                } else {
-                    audioDevice = AudioSystem.DEVICE_IN_BLE_HEADSET;
-                }
-                break;
-            case BluetoothProfile.LE_AUDIO_BROADCAST:
-                audioDevice = AudioSystem.DEVICE_OUT_BLE_BROADCAST;
-                break;
-            case BluetoothProfile.HEADSET:
-                // the actual device type is not important at this point and
-                // will be set by BtHelper.handleBtScoActiveDeviceChange()
-                audioDevice = AudioSystem.DEVICE_OUT_BLUETOOTH_SCO;
-                break;
-            default: throw new IllegalArgumentException("Invalid profile " + d.mInfo.getProfile());
-        }
-        return new BtDeviceInfo(d, device, state, audioDevice, codec);
+    /*package*/ static BtDeviceInfo createBtDeviceInfo(@NonNull BtDeviceChangedData d,
+            @NonNull BluetoothDevice device, int state) {
+        int audioDevice = BtHelper.getTypeFromProfile(d.mInfo.getProfile(), d.mInfo.isLeOutput());
+        return new BtDeviceInfo(d, device, state, audioDevice, AudioSystem.AUDIO_FORMAT_DEFAULT);
     }
 
     private void btMediaMetricRecord(@NonNull BluetoothDevice device, String state,
@@ -1728,8 +1700,8 @@
     }
 
     // must be called synchronized on mConnectedDevices
-    /*package*/ boolean hasScheduledA2dpConnection(BluetoothDevice btDevice) {
-        final BtDeviceInfo devInfoToCheck = new BtDeviceInfo(btDevice, BluetoothProfile.A2DP);
+    /*package*/ boolean hasScheduledA2dpConnection(BluetoothDevice btDevice, int profile) {
+        final BtDeviceInfo devInfoToCheck = new BtDeviceInfo(btDevice, profile);
         return mBrokerHandler.hasEqualMessages(MSG_L_SET_BT_ACTIVE_DEVICE, devInfoToCheck);
     }
 
diff --git a/services/core/java/com/android/server/audio/AudioDeviceInventory.java b/services/core/java/com/android/server/audio/AudioDeviceInventory.java
index 37ef9a0..ef10793 100644
--- a/services/core/java/com/android/server/audio/AudioDeviceInventory.java
+++ b/services/core/java/com/android/server/audio/AudioDeviceInventory.java
@@ -987,8 +987,10 @@
                 "onBluetoothDeviceConfigChange addr=" + address
                     + " event=" + BtHelper.deviceEventToString(event)));
 
+        int deviceType = BtHelper.getTypeFromProfile(btInfo.mProfile, btInfo.mIsLeOutput);
+
         synchronized (mDevicesLock) {
-            if (mDeviceBroker.hasScheduledA2dpConnection(btDevice)) {
+            if (mDeviceBroker.hasScheduledA2dpConnection(btDevice, btInfo.mProfile)) {
                 AudioService.sDeviceLogger.enqueue(new EventLogger.StringEvent(
                         "A2dp config change ignored (scheduled connection change)")
                         .printSlog(EventLogger.Event.ALOGI, TAG));
@@ -996,8 +998,7 @@
                         .record();
                 return delayMs;
             }
-            final String key = DeviceInfo.makeDeviceListKey(
-                    AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, address);
+            final String key = DeviceInfo.makeDeviceListKey(deviceType, address);
             final DeviceInfo di = mConnectedDevices.get(key);
             if (di == null) {
                 Log.e(TAG, "invalid null DeviceInfo in onBluetoothDeviceConfigChange");
@@ -1022,7 +1023,7 @@
                                 BtHelper.getName(btDevice), codec);
                         if (res != AudioSystem.AUDIO_STATUS_OK) {
                             AudioService.sDeviceLogger.enqueue(new EventLogger.StringEvent(
-                                    "APM handleDeviceConfigChange failed for A2DP device addr="
+                                    "APM handleDeviceConfigChange failed for device addr="
                                             + address + " codec="
                                             + AudioSystem.audioFormatToString(codec))
                                     .printSlog(EventLogger.Event.ALOGE, TAG));
@@ -1033,7 +1034,7 @@
                                     BluetoothProfile.STATE_DISCONNECTED));
                         } else {
                             AudioService.sDeviceLogger.enqueue(new EventLogger.StringEvent(
-                                    "APM handleDeviceConfigChange success for A2DP device addr="
+                                    "APM handleDeviceConfigChange success for device addr="
                                             + address
                                             + " codec=" + AudioSystem.audioFormatToString(codec))
                                     .printSlog(EventLogger.Event.ALOGI, TAG));
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index b48d0a6..86871ea 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -12598,7 +12598,7 @@
     //==========================================================================================
     static final int LOG_NB_EVENTS_LIFECYCLE = 20;
     static final int LOG_NB_EVENTS_PHONE_STATE = 20;
-    static final int LOG_NB_EVENTS_DEVICE_CONNECTION = 50;
+    static final int LOG_NB_EVENTS_DEVICE_CONNECTION = 200;
     static final int LOG_NB_EVENTS_FORCE_USE = 20;
     static final int LOG_NB_EVENTS_VOLUME = 100;
     static final int LOG_NB_EVENTS_DYN_POLICY = 10;
diff --git a/services/core/java/com/android/server/audio/BtHelper.java b/services/core/java/com/android/server/audio/BtHelper.java
index 0479c70..9221169 100644
--- a/services/core/java/com/android/server/audio/BtHelper.java
+++ b/services/core/java/com/android/server/audio/BtHelper.java
@@ -1291,6 +1291,29 @@
         return 0; // 0 is not a valid profile
     }
 
+    /*package */ static int getTypeFromProfile(int profile, boolean isLeOutput) {
+        switch (profile) {
+            case BluetoothProfile.A2DP_SINK:
+                return AudioSystem.DEVICE_IN_BLUETOOTH_A2DP;
+            case BluetoothProfile.A2DP:
+                return AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP;
+            case BluetoothProfile.HEARING_AID:
+                return AudioSystem.DEVICE_OUT_HEARING_AID;
+            case BluetoothProfile.LE_AUDIO:
+                if (isLeOutput) {
+                    return AudioSystem.DEVICE_OUT_BLE_HEADSET;
+                } else {
+                    return AudioSystem.DEVICE_IN_BLE_HEADSET;
+                }
+            case BluetoothProfile.LE_AUDIO_BROADCAST:
+                return AudioSystem.DEVICE_OUT_BLE_BROADCAST;
+            case BluetoothProfile.HEADSET:
+                return AudioSystem.DEVICE_OUT_BLUETOOTH_SCO;
+            default:
+                throw new IllegalArgumentException("Invalid profile " + profile);
+        }
+    }
+
     /*package */ static Bundle getPreferredAudioProfiles(String address) {
         BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
         return adapter.getPreferredAudioProfiles(adapter.getRemoteDevice(address));
diff --git a/services/core/java/com/android/server/backup/SystemBackupAgent.java b/services/core/java/com/android/server/backup/SystemBackupAgent.java
index b11267e..79523bd 100644
--- a/services/core/java/com/android/server/backup/SystemBackupAgent.java
+++ b/services/core/java/com/android/server/backup/SystemBackupAgent.java
@@ -69,6 +69,7 @@
     private static final String SYSTEM_GENDER_HELPER = "system_gender";
     private static final String DISPLAY_HELPER = "display";
     private static final String INPUT_HELPER = "input";
+    private static final String WEAR_BACKUP_HELPER = "wear";
 
     // 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
@@ -113,7 +114,7 @@
     private static final Set<String> sEligibleHelpersForNonSystemUser =
             SetUtils.union(sEligibleHelpersForProfileUser,
                     Sets.newArraySet(ACCOUNT_MANAGER_HELPER, USAGE_STATS_HELPER, PREFERRED_HELPER,
-                            SHORTCUT_MANAGER_HELPER, INPUT_HELPER));
+                            SHORTCUT_MANAGER_HELPER, INPUT_HELPER, WEAR_BACKUP_HELPER));
 
     private int mUserId = UserHandle.USER_SYSTEM;
     private boolean mIsProfileUser = false;
@@ -153,6 +154,11 @@
         if (com.android.hardware.input.Flags.enableBackupAndRestoreForInputGestures()) {
             addHelperIfEligibleForUser(INPUT_HELPER, new InputBackupHelper(mUserId));
         }
+
+        // Add Wear helper only if the device is a watch
+        if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH)) {
+            addHelperIfEligibleForUser(WEAR_BACKUP_HELPER, new WearBackupHelper());
+        }
     }
 
     @Override
diff --git a/services/core/java/com/android/server/backup/WearBackupHelper.java b/services/core/java/com/android/server/backup/WearBackupHelper.java
new file mode 100644
index 0000000..27416b3
--- /dev/null
+++ b/services/core/java/com/android/server/backup/WearBackupHelper.java
@@ -0,0 +1,49 @@
+/*
+ * 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
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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 android.annotation.Nullable;
+import android.app.backup.BlobBackupHelper;
+
+import com.android.server.LocalServices;
+
+/** A {@link android.app.backup.BlobBackupHelper} for Wear */
+public class WearBackupHelper extends BlobBackupHelper {
+
+    private static final int BLOB_VERSION = 1;
+    private static final String KEY_WEAR_BACKUP = "wear";
+    @Nullable private final WearBackupInternal mWearBackupInternal;
+
+    public WearBackupHelper() {
+        super(BLOB_VERSION, KEY_WEAR_BACKUP);
+        mWearBackupInternal = LocalServices.getService(WearBackupInternal.class);
+    }
+
+    @Override
+    protected byte[] getBackupPayload(String key) {
+        return KEY_WEAR_BACKUP.equals(key) && mWearBackupInternal != null
+                ? mWearBackupInternal.getBackupPayload(getLogger())
+                : null;
+    }
+
+    @Override
+    protected void applyRestoredPayload(String key, byte[] payload) {
+        if (KEY_WEAR_BACKUP.equals(key) && mWearBackupInternal != null) {
+            mWearBackupInternal.applyRestoredPayload(payload);
+        }
+    }
+}
diff --git a/services/core/java/com/android/server/backup/WearBackupInternal.java b/services/core/java/com/android/server/backup/WearBackupInternal.java
new file mode 100644
index 0000000..7b4847b
--- /dev/null
+++ b/services/core/java/com/android/server/backup/WearBackupInternal.java
@@ -0,0 +1,32 @@
+/*
+ * 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
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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 android.app.backup.BackupRestoreEventLogger;
+
+import com.android.internal.annotations.Keep;
+
+/** A local service internal for Wear OS handle backup/restore */
+@Keep
+public interface WearBackupInternal {
+
+    /** Gets the backup payload */
+    byte[] getBackupPayload(BackupRestoreEventLogger logger);
+
+    /** Applies the restored payload */
+    void applyRestoredPayload(byte[] payload);
+}
diff --git a/services/core/java/com/android/server/display/DisplayDevice.java b/services/core/java/com/android/server/display/DisplayDevice.java
index 2bdb5c2..a749a40 100644
--- a/services/core/java/com/android/server/display/DisplayDevice.java
+++ b/services/core/java/com/android/server/display/DisplayDevice.java
@@ -68,6 +68,8 @@
     private int mCurrentLayerStack = -1;
     private int mCurrentFlags = 0;
     private int mCurrentOrientation = -1;
+    private int mLastDisplayWidth;
+    private int mLastDisplayHeight;
     private Rect mCurrentLayerStackRect;
     private Rect mCurrentDisplayRect;
     private final Context mContext;
@@ -216,9 +218,9 @@
     }
 
     /**
-     * Gives the display device a chance to update its properties while in a transaction.
+     * Updates the surface for the display.
      */
-    public void performTraversalLocked(SurfaceControl.Transaction t) {
+    public void configureSurfaceLocked(SurfaceControl.Transaction t) {
     }
 
     /**
@@ -374,6 +376,29 @@
     }
 
     /**
+     * Configure transaction with the display size.
+     */
+    public void configureDisplaySizeLocked(SurfaceControl.Transaction t) {
+        DisplayDeviceInfo info = getDisplayDeviceInfoLocked();
+        boolean isInstalledRotated = info.installOrientation == ROTATION_90
+                || info.installOrientation == ROTATION_270;
+        int displayWidth = isInstalledRotated ? info.height : info.width;
+        int displayHeight = isInstalledRotated ? info.width : info.height;
+        setDisplaySizeLocked(t, displayWidth, displayHeight);
+    }
+
+    /**
+     * Sets display size while in a transaction.
+     */
+    public final void setDisplaySizeLocked(SurfaceControl.Transaction t, int width, int height) {
+        if (width != mLastDisplayWidth && height != mLastDisplayHeight) {
+            mLastDisplayWidth = width;
+            mLastDisplayHeight = height;
+            t.setDisplaySize(mDisplayToken, width, height);
+        }
+    }
+
+    /**
      * Sets the display surface while in a transaction.
      */
     public final void setSurfaceLocked(SurfaceControl.Transaction t, Surface surface) {
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index a767519..0aa7227 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -3127,7 +3127,6 @@
                     displayTransactions.get(display.getDisplayIdLocked(), t);
             if (device != null) {
                 configureDisplayLocked(displayTransaction, device);
-                device.performTraversalLocked(displayTransaction);
             }
         });
 
diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
index 83ca563..324f95a 100644
--- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
@@ -35,6 +35,7 @@
 import android.os.PowerManager;
 import android.os.SystemProperties;
 import android.os.Trace;
+import android.util.DisplayMetrics;
 import android.util.DisplayUtils;
 import android.util.LongSparseArray;
 import android.util.Slog;
@@ -84,6 +85,10 @@
     private static final String PROPERTY_EMULATOR_CIRCULAR = "ro.boot.emulator.circular";
 
     private static final double DEFAULT_DISPLAY_SIZE = 24.0;
+    // Touch target size 10.4mm in inches (divided by mm per inch 25.4)
+    private static final double EXTERNAL_DISPLAY_BASE_TOUCH_TARGET_SIZE_IN_INCHES = 10.4 / 25.4;
+
+    private static final double BASE_TOUCH_TARGET_SIZE_DP = 48.0;
 
     private final LongSparseArray<LocalDisplayDevice> mDevices = new LongSparseArray<>();
 
@@ -530,17 +535,20 @@
             if (densityMapping == null) {
                 if (getFeatureFlags().isBaseDensityForExternalDisplaysEnabled()
                         && !mStaticDisplayInfo.isInternal) {
-                    double dpi;
+                    double ppi;
 
                     if (mActiveSfDisplayMode.xDpi > 0 && mActiveSfDisplayMode.yDpi > 0) {
-                        dpi = Math.sqrt((Math.pow(mActiveSfDisplayMode.xDpi, 2)
+                        ppi = Math.sqrt((Math.pow(mActiveSfDisplayMode.xDpi, 2)
                                 + Math.pow(mActiveSfDisplayMode.yDpi, 2)) / 2);
                     } else {
                         // xDPI and yDPI is missing, calculate DPI from display resolution and
                         // default display size
-                        dpi = Math.sqrt(Math.pow(mInfo.width, 2) + Math.pow(mInfo.height, 2))
+                        ppi = Math.sqrt(Math.pow(mInfo.width, 2) + Math.pow(mInfo.height, 2))
                                 / DEFAULT_DISPLAY_SIZE;
                     }
+                    double pixels = ppi * EXTERNAL_DISPLAY_BASE_TOUCH_TARGET_SIZE_IN_INCHES;
+                    double dpi =
+                            pixels * DisplayMetrics.DENSITY_DEFAULT / BASE_TOUCH_TARGET_SIZE_DP;
                     return (int) (dpi + 0.5);
                 }
                 return (int) (mStaticDisplayInfo.density * 160 + 0.5);
diff --git a/services/core/java/com/android/server/display/LogicalDisplay.java b/services/core/java/com/android/server/display/LogicalDisplay.java
index f9d4137..b2b9ef1 100644
--- a/services/core/java/com/android/server/display/LogicalDisplay.java
+++ b/services/core/java/com/android/server/display/LogicalDisplay.java
@@ -228,14 +228,17 @@
      */
     private final boolean mIsAnisotropyCorrectionEnabled;
 
+    private final boolean mSyncedResolutionSwitchEnabled;
+
     private boolean mCanHostTasks;
 
     LogicalDisplay(int displayId, int layerStack, DisplayDevice primaryDisplayDevice) {
-        this(displayId, layerStack, primaryDisplayDevice, false, false);
+        this(displayId, layerStack, primaryDisplayDevice, false, false, false);
     }
 
     LogicalDisplay(int displayId, int layerStack, DisplayDevice primaryDisplayDevice,
-            boolean isAnisotropyCorrectionEnabled, boolean isAlwaysRotateDisplayDeviceEnabled) {
+            boolean isAnisotropyCorrectionEnabled, boolean isAlwaysRotateDisplayDeviceEnabled,
+            boolean isSyncedResolutionSwitchEnabled) {
         mDisplayId = displayId;
         mLayerStack = layerStack;
         mPrimaryDisplayDevice = primaryDisplayDevice;
@@ -248,6 +251,7 @@
         mBaseDisplayInfo.thermalBrightnessThrottlingDataId = mThermalBrightnessThrottlingDataId;
         mIsAnisotropyCorrectionEnabled = isAnisotropyCorrectionEnabled;
         mAlwaysRotateDisplayDeviceEnabled = isAlwaysRotateDisplayDeviceEnabled;
+        mSyncedResolutionSwitchEnabled = isSyncedResolutionSwitchEnabled;
         mCanHostTasks = (mDisplayId == Display.DEFAULT_DISPLAY);
     }
 
@@ -791,7 +795,12 @@
         }
 
         mDisplayPosition.set(mTempDisplayRect.left, mTempDisplayRect.top);
+
+        if (mSyncedResolutionSwitchEnabled || displayDeviceInfo.type == Display.TYPE_VIRTUAL) {
+            device.configureDisplaySizeLocked(t);
+        }
         device.setProjectionLocked(t, orientation, mTempLayerStackRect, mTempDisplayRect);
+        device.configureSurfaceLocked(t);
     }
 
     /**
diff --git a/services/core/java/com/android/server/display/LogicalDisplayMapper.java b/services/core/java/com/android/server/display/LogicalDisplayMapper.java
index f3cdf15..872f334 100644
--- a/services/core/java/com/android/server/display/LogicalDisplayMapper.java
+++ b/services/core/java/com/android/server/display/LogicalDisplayMapper.java
@@ -1256,7 +1256,8 @@
         final int layerStack = assignLayerStackLocked(displayId);
         final LogicalDisplay display = new LogicalDisplay(displayId, layerStack, device,
                 mFlags.isPixelAnisotropyCorrectionInLogicalDisplayEnabled(),
-                mFlags.isAlwaysRotateDisplayDeviceEnabled());
+                mFlags.isAlwaysRotateDisplayDeviceEnabled(),
+                mFlags.isSyncedResolutionSwitchEnabled());
         display.updateLocked(mDisplayDeviceRepo, mSyntheticModeManager);
 
         final DisplayInfo info = display.getDisplayInfoLocked();
diff --git a/services/core/java/com/android/server/display/OverlayDisplayAdapter.java b/services/core/java/com/android/server/display/OverlayDisplayAdapter.java
index 382c883..b5a9b19 100644
--- a/services/core/java/com/android/server/display/OverlayDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/OverlayDisplayAdapter.java
@@ -341,7 +341,7 @@
         }
 
         @Override
-        public void performTraversalLocked(SurfaceControl.Transaction t) {
+        public void configureSurfaceLocked(SurfaceControl.Transaction t) {
             if (mSurfaceTexture != null) {
                 if (mSurface == null) {
                     mSurface = new Surface(mSurfaceTexture);
diff --git a/services/core/java/com/android/server/display/VirtualDisplayAdapter.java b/services/core/java/com/android/server/display/VirtualDisplayAdapter.java
index abbdeb9..4779b69 100644
--- a/services/core/java/com/android/server/display/VirtualDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/VirtualDisplayAdapter.java
@@ -484,14 +484,19 @@
         }
 
         @Override
-        public void performTraversalLocked(SurfaceControl.Transaction t) {
-            if ((mPendingChanges & PENDING_RESIZE) != 0) {
-                t.setDisplaySize(getDisplayTokenLocked(), mWidth, mHeight);
-            }
+        public void configureSurfaceLocked(SurfaceControl.Transaction t) {
             if ((mPendingChanges & PENDING_SURFACE_CHANGE) != 0) {
                 setSurfaceLocked(t, mSurface);
+                mPendingChanges &= ~PENDING_SURFACE_CHANGE;
             }
-            mPendingChanges = 0;
+        }
+
+        @Override
+        public void configureDisplaySizeLocked(SurfaceControl.Transaction t) {
+            if ((mPendingChanges & PENDING_RESIZE) != 0) {
+                setDisplaySizeLocked(t, mWidth, mHeight);
+                mPendingChanges &= ~PENDING_RESIZE;
+            }
         }
 
         @Override
diff --git a/services/core/java/com/android/server/display/WifiDisplayAdapter.java b/services/core/java/com/android/server/display/WifiDisplayAdapter.java
index 607c5d6..902eefa 100644
--- a/services/core/java/com/android/server/display/WifiDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/WifiDisplayAdapter.java
@@ -640,7 +640,7 @@
         }
 
         @Override
-        public void performTraversalLocked(SurfaceControl.Transaction t) {
+        public void configureSurfaceLocked(SurfaceControl.Transaction t) {
             if (mSurface != null) {
                 setSurfaceLocked(t, mSurface);
             }
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 e2d26a4..e4b595a 100644
--- a/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java
+++ b/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java
@@ -86,6 +86,11 @@
             com.android.graphics.surfaceflinger.flags.Flags.FLAG_DISPLAY_CONFIG_ERROR_HAL,
             com.android.graphics.surfaceflinger.flags.Flags::displayConfigErrorHal);
 
+    private final FlagState mSyncedResolutionSwitch = new FlagState(
+            com.android.graphics.surfaceflinger.flags.Flags.FLAG_SYNCED_RESOLUTION_SWITCH,
+            com.android.graphics.surfaceflinger.flags.Flags::syncedResolutionSwitch
+    );
+
     private final FlagState mBrightnessIntRangeUserPerceptionFlagState = new FlagState(
             Flags.FLAG_BRIGHTNESS_INT_RANGE_USER_PERCEPTION,
             Flags::brightnessIntRangeUserPerception);
@@ -364,6 +369,10 @@
         return mDisplayConfigErrorHalFlagState.isEnabled();
     }
 
+    public boolean isSyncedResolutionSwitchEnabled() {
+        return mSyncedResolutionSwitch.isEnabled();
+    }
+
     public boolean isBrightnessIntRangeUserPerceptionEnabled() {
         return mBrightnessIntRangeUserPerceptionFlagState.isEnabled();
     }
@@ -624,6 +633,7 @@
         pw.println(" " + mEvenDimmerFlagState);
         pw.println(" " + mSmallAreaDetectionFlagState);
         pw.println(" " + mDisplayConfigErrorHalFlagState);
+        pw.println(" " + mSyncedResolutionSwitch);
         pw.println(" " + mBrightnessIntRangeUserPerceptionFlagState);
         pw.println(" " + mRestrictDisplayModes);
         pw.println(" " + mBrightnessWearBedtimeModeClamperFlagState);
diff --git a/services/core/java/com/android/server/display/mode/VotesStatsReporter.java b/services/core/java/com/android/server/display/mode/VotesStatsReporter.java
index d3d49c2..7b579c0 100644
--- a/services/core/java/com/android/server/display/mode/VotesStatsReporter.java
+++ b/services/core/java/com/android/server/display/mode/VotesStatsReporter.java
@@ -25,6 +25,7 @@
 import android.annotation.Nullable;
 import android.os.Trace;
 import android.util.SparseArray;
+import android.util.SparseIntArray;
 import android.view.Display;
 
 import com.android.internal.util.FrameworkStatsLog;
@@ -37,7 +38,7 @@
     private static final int REFRESH_RATE_NOT_LIMITED = 1000;
     private final boolean mIgnoredRenderRate;
 
-    private int mLastMinPriorityReported = Vote.MAX_PRIORITY + 1;
+    private final SparseIntArray mLastMinPriorityByDisplay = new SparseIntArray();
 
     VotesStatsReporter(boolean ignoreRenderRate) {
         mIgnoredRenderRate = ignoreRenderRate;
@@ -71,9 +72,11 @@
 
     void reportVotesActivated(int displayId, int minPriority, @Nullable Display.Mode baseMode,
             SparseArray<Vote> votes) {
+        int lastMinPriorityReported = mLastMinPriorityByDisplay.get(
+                displayId, Vote.MAX_PRIORITY + 1);
         int selectedRefreshRate = baseMode != null ? (int) baseMode.getRefreshRate() : -1;
         for (int priority = Vote.MIN_PRIORITY; priority <= Vote.MAX_PRIORITY; priority++) {
-            if (priority < mLastMinPriorityReported && priority < minPriority) {
+            if (priority < lastMinPriorityReported && priority < minPriority) {
                 continue;
             }
             Vote vote = votes.get(priority);
@@ -82,7 +85,7 @@
             }
 
             // Was previously reported ACTIVE, changed to ADDED
-            if (priority >= mLastMinPriorityReported && priority < minPriority) {
+            if (priority >= lastMinPriorityReported && priority < minPriority) {
                 int maxRefreshRate = getMaxRefreshRate(vote, mIgnoredRenderRate);
                 FrameworkStatsLog.write(
                         DISPLAY_MODE_DIRECTOR_VOTE_CHANGED, displayId, priority,
@@ -90,7 +93,7 @@
                         maxRefreshRate, selectedRefreshRate);
             }
             // Was previously reported ADDED, changed to ACTIVE
-            if (priority >= minPriority && priority < mLastMinPriorityReported) {
+            if (priority >= minPriority && priority < lastMinPriorityReported) {
                 int maxRefreshRate = getMaxRefreshRate(vote, mIgnoredRenderRate);
                 FrameworkStatsLog.write(
                         DISPLAY_MODE_DIRECTOR_VOTE_CHANGED, displayId, priority,
@@ -98,7 +101,7 @@
                         maxRefreshRate, selectedRefreshRate);
             }
 
-            mLastMinPriorityReported = minPriority;
+            mLastMinPriorityByDisplay.put(displayId, minPriority);
         }
     }
 
diff --git a/services/core/java/com/android/server/dreams/DreamManagerService.java b/services/core/java/com/android/server/dreams/DreamManagerService.java
index 7e8bb28..2af74f6 100644
--- a/services/core/java/com/android/server/dreams/DreamManagerService.java
+++ b/services/core/java/com/android/server/dreams/DreamManagerService.java
@@ -569,7 +569,8 @@
     }
 
     private void requestDreamInternal() {
-        if (isDreamingInternal() && !dreamIsFrontmost() && mController.bringDreamToFront()) {
+        if (isDreamingInternal() && !dreamIsFrontmost() && mController.bringDreamToFront()
+                && !isDozingInternal()) {
             return;
         }
 
diff --git a/services/core/java/com/android/server/flags/people.aconfig b/services/core/java/com/android/server/flags/people.aconfig
new file mode 100644
index 0000000..532e958
--- /dev/null
+++ b/services/core/java/com/android/server/flags/people.aconfig
@@ -0,0 +1,12 @@
+package: "com.android.server.flags"
+container: "system"
+
+flag {
+    name: "early_data_manager_init"
+    namespace: "system_performance"
+    description: "Initialize DataManager earlier in boot"
+    bug: "394601872"
+    metadata {
+        purpose: PURPOSE_BUGFIX
+    }
+}
diff --git a/services/core/java/com/android/server/flags/services.aconfig b/services/core/java/com/android/server/flags/services.aconfig
index 4505d0e..7e5c1bc 100644
--- a/services/core/java/com/android/server/flags/services.aconfig
+++ b/services/core/java/com/android/server/flags/services.aconfig
@@ -86,3 +86,10 @@
     description: "Enable the time notifications feature, a toggle to enable/disable time-related notifications in Date & Time Settings"
     bug: "283267917"
 }
+
+flag {
+    name: "certpininstaller_removal"
+    namespace: "network_security"
+    description: "Remove CertPinInstallReceiver from the platform"
+    bug: "391205997"
+}
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
index 3d6d34b..3cb21c3 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
@@ -1404,6 +1404,9 @@
                 if (connected) {
                     if (mArcEstablished) {
                         enableAudioReturnChannel(true);
+                    } else {
+                        HdmiLogger.debug("Restart ARC again");
+                        onNewAvrAdded(getAvrDeviceInfo());
                     }
                 } else {
                     enableAudioReturnChannel(false);
diff --git a/services/core/java/com/android/server/input/InputGestureManager.java b/services/core/java/com/android/server/input/InputGestureManager.java
index 108afba..977c029 100644
--- a/services/core/java/com/android/server/input/InputGestureManager.java
+++ b/services/core/java/com/android/server/input/InputGestureManager.java
@@ -256,13 +256,11 @@
             ));
         }
         if (keyboardA11yShortcutControl()) {
-            if (InputSettings.isAccessibilityBounceKeysFeatureEnabled()) {
-                systemShortcuts.add(createKeyGesture(
-                        KeyEvent.KEYCODE_3,
-                        KeyEvent.META_META_ON | KeyEvent.META_ALT_ON,
-                        KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_BOUNCE_KEYS
-                ));
-            }
+            systemShortcuts.add(createKeyGesture(
+                    KeyEvent.KEYCODE_3,
+                    KeyEvent.META_META_ON | KeyEvent.META_ALT_ON,
+                    KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_BOUNCE_KEYS
+            ));
             if (InputSettings.isAccessibilityMouseKeysFeatureFlagEnabled()) {
                 systemShortcuts.add(createKeyGesture(
                         KeyEvent.KEYCODE_4,
@@ -270,20 +268,16 @@
                         KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_MOUSE_KEYS
                 ));
             }
-            if (InputSettings.isAccessibilityStickyKeysFeatureEnabled()) {
-                systemShortcuts.add(createKeyGesture(
-                        KeyEvent.KEYCODE_5,
-                        KeyEvent.META_META_ON | KeyEvent.META_ALT_ON,
-                        KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_STICKY_KEYS
-                ));
-            }
-            if (InputSettings.isAccessibilitySlowKeysFeatureFlagEnabled()) {
-                systemShortcuts.add(createKeyGesture(
-                        KeyEvent.KEYCODE_6,
-                        KeyEvent.META_META_ON | KeyEvent.META_ALT_ON,
-                        KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_SLOW_KEYS
-                ));
-            }
+            systemShortcuts.add(createKeyGesture(
+                    KeyEvent.KEYCODE_5,
+                    KeyEvent.META_META_ON | KeyEvent.META_ALT_ON,
+                    KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_STICKY_KEYS
+            ));
+            systemShortcuts.add(createKeyGesture(
+                    KeyEvent.KEYCODE_6,
+                    KeyEvent.META_META_ON | KeyEvent.META_ALT_ON,
+                    KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_SLOW_KEYS
+            ));
         }
         synchronized (mGestureLock) {
             for (InputGestureData systemShortcut : systemShortcuts) {
diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java
index 4a5f4a1..8624f42 100644
--- a/services/core/java/com/android/server/input/InputManagerService.java
+++ b/services/core/java/com/android/server/input/InputManagerService.java
@@ -2775,7 +2775,7 @@
                 }
                 return true;
             case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_BOUNCE_KEYS:
-                if (complete && InputSettings.isAccessibilityBounceKeysFeatureEnabled()) {
+                if (complete) {
                     final boolean bounceKeysEnabled =
                             InputSettings.isAccessibilityBounceKeysEnabled(mContext);
                     InputSettings.setAccessibilityBounceKeysThreshold(mContext,
@@ -2793,7 +2793,7 @@
                 }
                 break;
             case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_STICKY_KEYS:
-                if (complete && InputSettings.isAccessibilityStickyKeysFeatureEnabled()) {
+                if (complete) {
                     final boolean stickyKeysEnabled =
                             InputSettings.isAccessibilityStickyKeysEnabled(mContext);
                     InputSettings.setAccessibilityStickyKeysEnabled(mContext, !stickyKeysEnabled);
@@ -2801,7 +2801,7 @@
                 }
                 break;
             case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_SLOW_KEYS:
-                if (complete && InputSettings.isAccessibilitySlowKeysFeatureFlagEnabled()) {
+                if (complete) {
                     final boolean slowKeysEnabled =
                             InputSettings.isAccessibilitySlowKeysEnabled(mContext);
                     InputSettings.setAccessibilitySlowKeysThreshold(mContext,
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
index 484b470..334e7b5 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
@@ -649,12 +649,25 @@
                 visibilityStateComputer.getImePolicy().setA11yRequestNoSoftKeyboard(
                         accessibilitySoftKeyboardSetting);
                 if (visibilityStateComputer.getImePolicy().isA11yRequestNoSoftKeyboard()) {
-                    hideCurrentInputLocked(userData.mImeBindingState.mFocusedWindow,
-                            0 /* flags */, SoftInputShowHideReason.HIDE_SETTINGS_ON_CHANGE, userId);
+                    if (Flags.refactorInsetsController()) {
+                        final var statsToken = createStatsTokenForFocusedClient(false /* show */,
+                                SoftInputShowHideReason.HIDE_SETTINGS_ON_CHANGE, userId);
+                        setImeVisibilityOnFocusedWindowClient(false, userData, statsToken);
+                    } else {
+                        hideCurrentInputLocked(userData.mImeBindingState.mFocusedWindow,
+                                0 /* flags */, SoftInputShowHideReason.HIDE_SETTINGS_ON_CHANGE,
+                                userId);
+                    }
                 } else if (isShowRequestedForCurrentWindow(userId)) {
-                    showCurrentInputLocked(userData.mImeBindingState.mFocusedWindow,
-                            InputMethodManager.SHOW_IMPLICIT,
-                            SoftInputShowHideReason.SHOW_SETTINGS_ON_CHANGE, userId);
+                    if (Flags.refactorInsetsController()) {
+                        final var statsToken = createStatsTokenForFocusedClient(true /* show */,
+                                SoftInputShowHideReason.SHOW_SETTINGS_ON_CHANGE, userId);
+                        setImeVisibilityOnFocusedWindowClient(true, userData, statsToken);
+                    } else {
+                        showCurrentInputLocked(userData.mImeBindingState.mFocusedWindow,
+                                InputMethodManager.SHOW_IMPLICIT,
+                                SoftInputShowHideReason.SHOW_SETTINGS_ON_CHANGE, userId);
+                    }
                 }
                 break;
             }
diff --git a/services/core/java/com/android/server/location/contexthub/ContextHubEndpointBroker.java b/services/core/java/com/android/server/location/contexthub/ContextHubEndpointBroker.java
index ddace17..2ea6117 100644
--- a/services/core/java/com/android/server/location/contexthub/ContextHubEndpointBroker.java
+++ b/services/core/java/com/android/server/location/contexthub/ContextHubEndpointBroker.java
@@ -43,7 +43,6 @@
 
 import java.util.Collection;
 import java.util.Optional;
-import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
  * A class that represents a broker for the endpoint registered by the client app. This class
@@ -89,8 +88,11 @@
     /** The remote callback interface for this endpoint. */
     private final IContextHubEndpointCallback mContextHubEndpointCallback;
 
-    /** True if this endpoint is registered with the service. */
-    private AtomicBoolean mIsRegistered = new AtomicBoolean(true);
+    /** True if this endpoint is registered with the service/HAL. */
+    @GuardedBy("mRegistrationLock")
+    private boolean mIsRegistered = false;
+
+    private final Object mRegistrationLock = new Object();
 
     private final Object mOpenSessionLock = new Object();
 
@@ -192,7 +194,7 @@
     public int openSession(HubEndpointInfo destination, String serviceDescriptor)
             throws RemoteException {
         super.openSession_enforcePermission();
-        if (!mIsRegistered.get()) throw new IllegalStateException("Endpoint is not registered");
+        if (!isRegistered()) throw new IllegalStateException("Endpoint is not registered");
         if (!hasEndpointPermissions(destination)) {
             throw new SecurityException(
                     "Insufficient permission to open a session with endpoint: " + destination);
@@ -223,7 +225,7 @@
     @android.annotation.EnforcePermission(android.Manifest.permission.ACCESS_CONTEXT_HUB)
     public void closeSession(int sessionId, int reason) throws RemoteException {
         super.closeSession_enforcePermission();
-        if (!mIsRegistered.get()) throw new IllegalStateException("Endpoint is not registered");
+        if (!isRegistered()) throw new IllegalStateException("Endpoint is not registered");
         if (!cleanupSessionResources(sessionId)) {
             throw new IllegalArgumentException(
                     "Unknown session ID in closeSession: id=" + sessionId);
@@ -235,19 +237,26 @@
     @android.annotation.EnforcePermission(android.Manifest.permission.ACCESS_CONTEXT_HUB)
     public void unregister() {
         super.unregister_enforcePermission();
-        mIsRegistered.set(false);
-        try {
-            mHubInterface.unregisterEndpoint(mHalEndpointInfo);
-        } catch (RemoteException e) {
-            Log.e(TAG, "RemoteException while calling HAL unregisterEndpoint", e);
-        }
         synchronized (mOpenSessionLock) {
             // Iterate in reverse since cleanupSessionResources will remove the entry
             for (int i = mSessionInfoMap.size() - 1; i >= 0; i--) {
                 int id = mSessionInfoMap.keyAt(i);
+                halCloseEndpointSessionNoThrow(id, Reason.ENDPOINT_GONE);
                 cleanupSessionResources(id);
             }
         }
+        synchronized (mRegistrationLock) {
+            if (!isRegistered()) {
+                Log.w(TAG, "Attempting to unregister when already unregistered");
+                return;
+            }
+            mIsRegistered = false;
+            try {
+                mHubInterface.unregisterEndpoint(mHalEndpointInfo);
+            } catch (RemoteException e) {
+                Log.e(TAG, "RemoteException while calling HAL unregisterEndpoint", e);
+            }
+        }
         mEndpointManager.unregisterEndpoint(mEndpointInfo.getIdentifier().getEndpoint());
         releaseWakeLockOnExit();
     }
@@ -335,7 +344,7 @@
     /** Invoked when the underlying binder of this broker has died at the client process. */
     @Override
     public void binderDied() {
-        if (mIsRegistered.get()) {
+        if (isRegistered()) {
             unregister();
         }
     }
@@ -365,6 +374,22 @@
         }
     }
 
+    /**
+     * Registers this endpoints with the Context Hub HAL.
+     *
+     * @throws RemoteException if the registrations fails with a RemoteException
+     */
+    /* package */ void register() throws RemoteException {
+        synchronized (mRegistrationLock) {
+            if (isRegistered()) {
+                Log.w(TAG, "Attempting to register when already registered");
+            } else {
+                mHubInterface.registerEndpoint(mHalEndpointInfo);
+                mIsRegistered = true;
+            }
+        }
+    }
+
     /* package */ void attachDeathRecipient() throws RemoteException {
         if (mContextHubEndpointCallback != null) {
             mContextHubEndpointCallback.asBinder().linkToDeath(this, 0 /* flags */);
@@ -425,6 +450,24 @@
         }
     }
 
+    /* package */ void onHalRestart() {
+        synchronized (mRegistrationLock) {
+            mIsRegistered = false;
+            try {
+                register();
+            } catch (RemoteException e) {
+                Log.e(TAG, "RemoteException while calling HAL registerEndpoint", e);
+            }
+        }
+        synchronized (mOpenSessionLock) {
+            for (int i = mSessionInfoMap.size() - 1; i >= 0; i--) {
+                int id = mSessionInfoMap.keyAt(i);
+                onCloseEndpointSession(id, Reason.HUB_RESET);
+            }
+        }
+        // TODO(b/390029594): Cancel any ongoing reliable communication transactions
+    }
+
     private Optional<Byte> onEndpointSessionOpenRequestInternal(
             int sessionId, HubEndpointInfo initiator, String serviceDescriptor) {
         if (!hasEndpointPermissions(initiator)) {
@@ -465,24 +508,21 @@
             }
             remote = mSessionInfoMap.get(sessionId).getRemoteEndpointInfo();
         }
-        if (!ContextHubServiceUtil.notePermissions(
-                mAppOpsManager,
-                mUid,
-                mPackageName,
-                mAttributionTag,
-                remote.getRequiredPermissions(),
-                RECEIVE_MSG_NOTE
-                        + "-0x"
-                        + Long.toHexString(remote.getIdentifier().getHub())
-                        + "-0x"
-                        + Long.toHexString(remote.getIdentifier().getEndpoint()))) {
-            Log.e(
-                    TAG,
-                    "Dropping message from "
-                            + remote
-                            + ". "
-                            + mPackageName
-                            + " doesn't have permission");
+
+        try {
+            Binder.withCleanCallingIdentity(
+                    () -> {
+                        if (!notePermissions(remote)) {
+                            throw new RuntimeException(
+                                    "Dropping message from "
+                                            + remote
+                                            + ". "
+                                            + mPackageName
+                                            + " doesn't have permission");
+                        }
+                    });
+        } catch (RuntimeException e) {
+            Log.e(TAG, e.getMessage());
             return ErrorCode.PERMISSION_DENIED;
         }
 
@@ -553,7 +593,7 @@
     private void acquireWakeLock() {
         Binder.withCleanCallingIdentity(
                 () -> {
-                    if (mIsRegistered.get()) {
+                    if (isRegistered()) {
                         mWakeLock.acquire(WAKELOCK_TIMEOUT_MILLIS);
                     }
                 });
@@ -608,4 +648,30 @@
         }
         return true;
     }
+
+    private boolean isRegistered() {
+        synchronized (mRegistrationLock) {
+            return mIsRegistered;
+        }
+    }
+
+    /**
+     * Utility to call notePermissions for e.g. when processing a message from a given endpoint for
+     * this broker.
+     *
+     * @param endpoint The endpoint to check permissions for this broker.
+     */
+    private boolean notePermissions(HubEndpointInfo endpoint) {
+        return ContextHubServiceUtil.notePermissions(
+                mAppOpsManager,
+                mUid,
+                mPackageName,
+                mAttributionTag,
+                endpoint.getRequiredPermissions(),
+                RECEIVE_MSG_NOTE
+                        + "-0x"
+                        + Long.toHexString(endpoint.getIdentifier().getHub())
+                        + "-0x"
+                        + Long.toHexString(endpoint.getIdentifier().getEndpoint()));
+    }
 }
diff --git a/services/core/java/com/android/server/location/contexthub/ContextHubEndpointManager.java b/services/core/java/com/android/server/location/contexthub/ContextHubEndpointManager.java
index ed98bf9..06aeb62 100644
--- a/services/core/java/com/android/server/location/contexthub/ContextHubEndpointManager.java
+++ b/services/core/java/com/android/server/location/contexthub/ContextHubEndpointManager.java
@@ -206,12 +206,6 @@
         EndpointInfo halEndpointInfo =
                 ContextHubServiceUtil.createHalEndpointInfo(
                         pendingEndpointInfo, endpointId, SERVICE_HUB_ID);
-        try {
-            mHubInterface.registerEndpoint(halEndpointInfo);
-        } catch (RemoteException e) {
-            Log.e(TAG, "RemoteException while calling HAL registerEndpoint", e);
-            throw e;
-        }
         broker =
                 new ContextHubEndpointBroker(
                         mContext,
@@ -222,6 +216,7 @@
                         packageName,
                         attributionTag,
                         mTransactionManager);
+        broker.register();
         mEndpointMap.put(endpointId, broker);
 
         try {
@@ -282,6 +277,14 @@
         mEndpointMap.remove(endpointId);
     }
 
+    /** Invoked by the service when the Context Hub HAL restarts. */
+    /* package */ void onHalRestart() {
+        for (ContextHubEndpointBroker broker : mEndpointMap.values()) {
+            // The broker will close existing sessions and re-register itself
+            broker.onHalRestart();
+        }
+    }
+
     @Override
     public void onEndpointSessionOpenRequest(
             int sessionId,
diff --git a/services/core/java/com/android/server/location/contexthub/ContextHubHalEndpointCallback.java b/services/core/java/com/android/server/location/contexthub/ContextHubHalEndpointCallback.java
index 88764b6..a3d9429 100644
--- a/services/core/java/com/android/server/location/contexthub/ContextHubHalEndpointCallback.java
+++ b/services/core/java/com/android/server/location/contexthub/ContextHubHalEndpointCallback.java
@@ -21,9 +21,6 @@
 import android.hardware.contexthub.IEndpointCallback;
 import android.hardware.contexthub.Message;
 import android.hardware.contexthub.MessageDeliveryStatus;
-import android.os.Handler;
-import android.os.HandlerThread;
-import android.os.Process;
 import android.os.RemoteException;
 
 /** IEndpointCallback implementation. */
@@ -32,11 +29,6 @@
     private final IEndpointLifecycleCallback mEndpointLifecycleCallback;
     private final IEndpointSessionCallback mEndpointSessionCallback;
 
-    // Use this thread in case where the execution requires to be on an async service thread.
-    private final HandlerThread mHandlerThread =
-            new HandlerThread("Context Hub endpoint callback", Process.THREAD_PRIORITY_BACKGROUND);
-    private Handler mHandler;
-
     /** Interface for listening for endpoint start and stop events. */
     public interface IEndpointLifecycleCallback {
         /** Called when a batch of endpoints started. */
@@ -73,9 +65,6 @@
             IEndpointSessionCallback endpointSessionCallback) {
         mEndpointLifecycleCallback = endpointLifecycleCallback;
         mEndpointSessionCallback = endpointSessionCallback;
-
-        mHandlerThread.start();
-        mHandler = new Handler(mHandlerThread.getLooper());
     }
 
     @Override
@@ -88,7 +77,7 @@
         for (int i = 0; i < halEndpointInfos.length; i++) {
             endpointInfos[i] = new HubEndpointInfo(halEndpointInfos[i]);
         }
-        mHandler.post(() -> mEndpointLifecycleCallback.onEndpointStarted(endpointInfos));
+        mEndpointLifecycleCallback.onEndpointStarted(endpointInfos);
     }
 
     @Override
@@ -98,7 +87,7 @@
         for (int i = 0; i < halEndpointIds.length; i++) {
             endpointIds[i] = new HubEndpointInfo.HubEndpointIdentifier(halEndpointIds[i]);
         }
-        mHandler.post(() -> mEndpointLifecycleCallback.onEndpointStopped(endpointIds, reason));
+        mEndpointLifecycleCallback.onEndpointStopped(endpointIds, reason);
     }
 
     @Override
@@ -109,37 +98,33 @@
                 new HubEndpointInfo.HubEndpointIdentifier(destination.hubId, destination.id);
         HubEndpointInfo.HubEndpointIdentifier initiatorId =
                 new HubEndpointInfo.HubEndpointIdentifier(initiator.hubId, initiator.id);
-        mHandler.post(
-                () ->
-                        mEndpointSessionCallback.onEndpointSessionOpenRequest(
-                                sessionId, destinationId, initiatorId, serviceDescriptor));
+        mEndpointSessionCallback.onEndpointSessionOpenRequest(
+                sessionId, destinationId, initiatorId, serviceDescriptor);
     }
 
     @Override
     public void onCloseEndpointSession(int sessionId, byte reason) throws RemoteException {
-        mHandler.post(() -> mEndpointSessionCallback.onCloseEndpointSession(sessionId, reason));
+        mEndpointSessionCallback.onCloseEndpointSession(sessionId, reason);
     }
 
     @Override
     public void onEndpointSessionOpenComplete(int sessionId) throws RemoteException {
-        mHandler.post(() -> mEndpointSessionCallback.onEndpointSessionOpenComplete(sessionId));
+        mEndpointSessionCallback.onEndpointSessionOpenComplete(sessionId);
     }
 
     @Override
     public void onMessageReceived(int sessionId, Message message) throws RemoteException {
         HubMessage hubMessage = ContextHubServiceUtil.createHubMessage(message);
-        mHandler.post(() -> mEndpointSessionCallback.onMessageReceived(sessionId, hubMessage));
+        mEndpointSessionCallback.onMessageReceived(sessionId, hubMessage);
     }
 
     @Override
     public void onMessageDeliveryStatusReceived(
             int sessionId, MessageDeliveryStatus messageDeliveryStatus) throws RemoteException {
-        mHandler.post(
-                () ->
-                        mEndpointSessionCallback.onMessageDeliveryStatusReceived(
-                                sessionId,
-                                messageDeliveryStatus.messageSequenceNumber,
-                                messageDeliveryStatus.errorCode));
+        mEndpointSessionCallback.onMessageDeliveryStatusReceived(
+                sessionId,
+                messageDeliveryStatus.messageSequenceNumber,
+                messageDeliveryStatus.errorCode);
     }
 
     @Override
diff --git a/services/core/java/com/android/server/location/contexthub/ContextHubService.java b/services/core/java/com/android/server/location/contexthub/ContextHubService.java
index 2b0ca14..502a7ae 100644
--- a/services/core/java/com/android/server/location/contexthub/ContextHubService.java
+++ b/services/core/java/com/android/server/location/contexthub/ContextHubService.java
@@ -259,6 +259,9 @@
             if (mHubInfoRegistry != null) {
                 mHubInfoRegistry.onHalRestart();
             }
+            if (mEndpointManager != null) {
+                mEndpointManager.onHalRestart();
+            }
             resetSettings();
             if (Flags.reconnectHostEndpointsAfterHalRestart()) {
                 mClientManager.forEachClientOfHub(mContextHubId,
diff --git a/services/core/java/com/android/server/media/MediaRoute2ProviderWatcher.java b/services/core/java/com/android/server/media/MediaRoute2ProviderWatcher.java
index 42303e0..b735b24 100644
--- a/services/core/java/com/android/server/media/MediaRoute2ProviderWatcher.java
+++ b/services/core/java/com/android/server/media/MediaRoute2ProviderWatcher.java
@@ -141,8 +141,7 @@
                         isSelfScanOnlyProvider |=
                                 MediaRoute2ProviderService.CATEGORY_SELF_SCAN_ONLY.equals(category);
                         supportsSystemMediaRouting |=
-                                MediaRoute2ProviderService.SERVICE_INTERFACE_SYSTEM_MEDIA.equals(
-                                        category);
+                                MediaRoute2ProviderService.CATEGORY_SYSTEM_MEDIA.equals(category);
                     }
                 }
                 int sourceIndex = findProvider(serviceInfo.packageName, serviceInfo.name);
diff --git a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
index 6c0d8ad..debac94 100644
--- a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
+++ b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
@@ -1635,11 +1635,11 @@
                             manager));
         }
 
-        List<MediaRoute2Info> routes =
-                userRecord.mHandler.mLastNotifiedRoutesToPrivilegedRouters.values().stream()
-                        .toList();
         userRecord.mHandler.sendMessage(
-                obtainMessage(ManagerRecord::notifyRoutesUpdated, managerRecord, routes));
+                obtainMessage(
+                        UserHandler::dispatchRoutesToManagerOnHandler,
+                        userRecord.mHandler,
+                        managerRecord));
     }
 
     @GuardedBy("mLock")
@@ -2119,6 +2119,9 @@
             mHasBluetoothRoutingPermission.set(checkCallerHasBluetoothPermissions(mPid, mUid));
             boolean newSystemRoutingPermissionValue = hasSystemRoutingPermission();
             if (oldSystemRoutingPermissionValue != newSystemRoutingPermissionValue) {
+                // TODO: b/379788233 - Ensure access to fields like
+                // mLastNotifiedRoutesToPrivilegedRouters happens on the right thread. We might need
+                // to run this on the handler.
                 Map<String, MediaRoute2Info> routesToReport =
                         newSystemRoutingPermissionValue
                                 ? mUserRecord.mHandler.mLastNotifiedRoutesToPrivilegedRouters
@@ -2543,6 +2546,8 @@
          * both system route providers and user route providers.
          *
          * <p>See {@link #getRouterRecords(boolean hasModifyAudioRoutingPermission)}.
+         *
+         * <p>Must be accessed on this handler's thread.
          */
         private final Map<String, MediaRoute2Info> mLastNotifiedRoutesToPrivilegedRouters =
                 new ArrayMap<>();
@@ -2558,6 +2563,8 @@
          * (e.g. volume changes) to non-privileged routers.
          *
          * <p>See {@link SystemMediaRoute2Provider#mDefaultRoute}.
+         *
+         * <p>Must be accessed on this handler's thread.
          */
         private final Map<String, MediaRoute2Info> mLastNotifiedRoutesToNonPrivilegedRouters =
                 new ArrayMap<>();
@@ -2800,7 +2807,7 @@
                                 removedRoutes));
             }
 
-            dispatchUpdates(
+            dispatchUpdatesOnHandler(
                     hasAddedOrModifiedRoutes,
                     hasRemovedRoutes,
                     provider.mIsSystemRouteProvider,
@@ -2822,6 +2829,13 @@
                     source, providerId, routesString);
         }
 
+        /** Notifies the given manager of the current routes. */
+        public void dispatchRoutesToManagerOnHandler(ManagerRecord managerRecord) {
+            List<MediaRoute2Info> routes =
+                    mLastNotifiedRoutesToPrivilegedRouters.values().stream().toList();
+            managerRecord.notifyRoutesUpdated(routes);
+        }
+
         /**
          * Dispatches the latest route updates in {@link #mLastNotifiedRoutesToPrivilegedRouters}
          * and {@link #mLastNotifiedRoutesToNonPrivilegedRouters} to registered {@link
@@ -2834,7 +2848,7 @@
          * @param isSystemProvider whether the latest update was caused by a system provider.
          * @param defaultRoute the current default route in {@link #mSystemProvider}.
          */
-        private void dispatchUpdates(
+        private void dispatchUpdatesOnHandler(
                 boolean hasAddedOrModifiedRoutes,
                 boolean hasRemovedRoutes,
                 boolean isSystemProvider,
diff --git a/services/core/java/com/android/server/media/quality/MediaQualityService.java b/services/core/java/com/android/server/media/quality/MediaQualityService.java
index 0b8b115..91a2843 100644
--- a/services/core/java/com/android/server/media/quality/MediaQualityService.java
+++ b/services/core/java/com/android/server/media/quality/MediaQualityService.java
@@ -120,6 +120,8 @@
     private final Object mPictureProfileLock = new Object();
     // A global lock for sound profile objects.
     private final Object mSoundProfileLock = new Object();
+    // A global lock for user state objects.
+    private final Object mUserStateLock = new Object();
     // A global lock for ambient backlight objects.
     private final Object mAmbientBacklightLock = new Object();
 
@@ -127,17 +129,17 @@
         super(context);
         mContext = context;
         mHalAmbientBacklightCallback = new HalAmbientBacklightCallback();
-        mPictureProfileAdjListener = new PictureProfileAdjustmentListenerImpl(mContext);
-        mSoundProfileAdjListener = new SoundProfileAdjustmentListenerImpl(mContext);
         mPackageManager = mContext.getPackageManager();
         mPictureProfileTempIdMap = new BiMap<>();
         mSoundProfileTempIdMap = new BiMap<>();
         mMediaQualityDbHelper = new MediaQualityDbHelper(mContext);
-        mMqDatabaseUtils = new MqDatabaseUtils(mContext);
         mMediaQualityDbHelper.setWriteAheadLoggingEnabled(true);
         mMediaQualityDbHelper.setIdleConnectionTimeout(30);
-        mHalNotifier = new HalNotifier();
         mMqManagerNotifier = new MqManagerNotifier();
+        mMqDatabaseUtils = new MqDatabaseUtils();
+        mHalNotifier = new HalNotifier();
+        mPictureProfileAdjListener = new PictureProfileAdjustmentListenerImpl();
+        mSoundProfileAdjListener = new SoundProfileAdjustmentListenerImpl();
 
         // The package info in the context isn't initialized in the way it is for normal apps,
         // so the standard, name-based context.getSharedPreferences doesn't work. Instead, we
@@ -166,20 +168,21 @@
         if (mMediaQuality != null) {
             try {
                 mMediaQuality.setAmbientBacklightCallback(mHalAmbientBacklightCallback);
+
+                mPpChangedListener = mMediaQuality.getPictureProfileListener();
+                mSpChangedListener = mMediaQuality.getSoundProfileListener();
+
                 mMediaQuality.setPictureProfileAdjustmentListener(mPictureProfileAdjListener);
                 mMediaQuality.setSoundProfileAdjustmentListener(mSoundProfileAdjListener);
+
             } catch (RemoteException e) {
                 Slog.e(TAG, "Failed to set ambient backlight detector callback", e);
             }
         }
 
-        mPpChangedListener = IPictureProfileChangedListener.Stub.asInterface(binder);
-        mSpChangedListener = ISoundProfileChangedListener.Stub.asInterface(binder);
-
         publishBinderService(Context.MEDIA_QUALITY_SERVICE, new BinderService());
     }
 
-    // TODO: Add additional APIs. b/373951081
     private final class BinderService extends IMediaQualityManager.Stub {
 
         @GuardedBy("mPictureProfileLock")
@@ -225,7 +228,6 @@
                         PictureProfile.ERROR_NO_PERMISSION,
                         Binder.getCallingUid(), Binder.getCallingPid());
             }
-
             synchronized (mPictureProfileLock) {
                 ContentValues values = MediaQualityUtils.getContentValues(dbId,
                         pp.getProfileType(),
@@ -233,7 +235,6 @@
                         pp.getPackageName(),
                         pp.getInputId(),
                         pp.getParameters());
-
                 updateDatabaseOnPictureProfileAndNotifyManagerAndHal(values, pp.getParameters());
             }
         }
@@ -269,12 +270,13 @@
                         mMqManagerNotifier.notifyOnPictureProfileError(id,
                                 PictureProfile.ERROR_INVALID_ARGUMENT,
                                 Binder.getCallingUid(), Binder.getCallingPid());
+                    } else {
+                        mMqManagerNotifier.notifyOnPictureProfileRemoved(
+                                mPictureProfileTempIdMap.getValue(dbId), toDelete,
+                                Binder.getCallingUid(), Binder.getCallingPid());
+                        mPictureProfileTempIdMap.remove(dbId);
+                        mHalNotifier.notifyHalOnPictureProfileChange(dbId, null);
                     }
-                    mMqManagerNotifier.notifyOnPictureProfileRemoved(
-                            mPictureProfileTempIdMap.getValue(dbId), toDelete,
-                            Binder.getCallingUid(), Binder.getCallingPid());
-                    mPictureProfileTempIdMap.remove(dbId);
-                    mHalNotifier.notifyHalOnPictureProfileChange(dbId, null);
                 }
             }
         }
@@ -520,12 +522,13 @@
                         mMqManagerNotifier.notifyOnSoundProfileError(id,
                                 SoundProfile.ERROR_INVALID_ARGUMENT,
                                 Binder.getCallingUid(), Binder.getCallingPid());
+                    } else {
+                        mMqManagerNotifier.notifyOnSoundProfileRemoved(
+                                mSoundProfileTempIdMap.getValue(dbId), toDelete,
+                                Binder.getCallingUid(), Binder.getCallingPid());
+                        mSoundProfileTempIdMap.remove(dbId);
+                        mHalNotifier.notifyHalOnSoundProfileChange(dbId, null);
                     }
-                    mMqManagerNotifier.notifyOnSoundProfileRemoved(
-                            mSoundProfileTempIdMap.getValue(dbId), toDelete,
-                            Binder.getCallingUid(), Binder.getCallingPid());
-                    mSoundProfileTempIdMap.remove(dbId);
-                    mHalNotifier.notifyHalOnSoundProfileChange(dbId, null);
                 }
             }
         }
@@ -684,24 +687,22 @@
                     mContext.getPackageName()) == mPackageManager.PERMISSION_GRANTED;
         }
 
-        //TODO: need lock here?
         @Override
         public void registerPictureProfileCallback(final IPictureProfileCallback callback) {
             int callingPid = Binder.getCallingPid();
             int callingUid = Binder.getCallingUid();
 
-            UserState userState = getOrCreateUserStateLocked(Binder.getCallingUid());
+            UserState userState = getOrCreateUserState(Binder.getCallingUid());
             userState.mPictureProfileCallbackPidUidMap.put(callback,
                     Pair.create(callingPid, callingUid));
         }
 
-        //TODO: need lock here?
         @Override
         public void registerSoundProfileCallback(final ISoundProfileCallback callback) {
             int callingPid = Binder.getCallingPid();
             int callingUid = Binder.getCallingUid();
 
-            UserState userState = getOrCreateUserStateLocked(Binder.getCallingUid());
+            UserState userState = getOrCreateUserState(Binder.getCallingUid());
             userState.mSoundProfileCallbackPidUidMap.put(callback,
                     Pair.create(callingPid, callingUid));
         }
@@ -792,7 +793,6 @@
             }
         }
 
-        //TODO: do I need a lock here?
         @Override
         public List<ParameterCapability> getParameterCapabilities(
                 List<String> names, UserHandle user) {
@@ -809,14 +809,20 @@
 
         private List<ParameterCapability> getListParameterCapability(ParamCapability[] caps) {
             List<ParameterCapability> pcList = new ArrayList<>();
-            for (ParamCapability pcHal : caps) {
-                String name = MediaQualityUtils.getParameterName(pcHal.name);
-                boolean isSupported = pcHal.isSupported;
-                int type = pcHal.defaultValue == null ? 0 : pcHal.defaultValue.getTag() + 1;
-                Bundle bundle = MediaQualityUtils.convertToCaps(type, pcHal.range);
 
-                pcList.add(new ParameterCapability(name, isSupported, type, bundle));
+            if (caps != null) {
+                for (ParamCapability pcHal : caps) {
+                    if (pcHal != null) {
+                        String name = MediaQualityUtils.getParameterName(pcHal.name);
+                        boolean isSupported = pcHal.isSupported;
+                        int type = pcHal.defaultValue == null ? 0 : pcHal.defaultValue.getTag() + 1;
+                        Bundle bundle = MediaQualityUtils.convertToCaps(type, pcHal.range);
+
+                        pcList.add(new ParameterCapability(name, isSupported, type, bundle));
+                    }
+                }
             }
+
             return pcList;
         }
 
@@ -1055,7 +1061,7 @@
             synchronized (mPictureProfileLock) {
                 for (int i = 0; i < mUserStates.size(); i++) {
                     int userId = mUserStates.keyAt(i);
-                    UserState userState = getOrCreateUserStateLocked(userId);
+                    UserState userState = getOrCreateUserState(userId);
                     userState.mPictureProfileCallbackPidUidMap.remove(callback);
                 }
             }
@@ -1069,7 +1075,7 @@
             synchronized (mSoundProfileLock) {
                 for (int i = 0; i < mUserStates.size(); i++) {
                     int userId = mUserStates.keyAt(i);
-                    UserState userState = getOrCreateUserStateLocked(userId);
+                    UserState userState = getOrCreateUserState(userId);
                     userState.mSoundProfileCallbackPidUidMap.remove(callback);
                 }
             }
@@ -1095,25 +1101,27 @@
         }
     }
 
-    //TODO: used by both picture and sound. can i add both locks?
-    private UserState getOrCreateUserStateLocked(int userId) {
-        UserState userState = getUserStateLocked(userId);
+    @GuardedBy("mUserStateLock")
+    private UserState getOrCreateUserState(int userId) {
+        UserState userState = getUserState(userId);
         if (userState == null) {
             userState = new UserState(mContext, userId);
-            mUserStates.put(userId, userState);
+            synchronized (mUserStateLock) {
+                mUserStates.put(userId, userState);
+            }
         }
         return userState;
     }
 
-    //TODO: used by both picture and sound. can i add both locks?
-    private UserState getUserStateLocked(int userId) {
-        return mUserStates.get(userId);
+    @GuardedBy("mUserStateLock")
+    private UserState getUserState(int userId) {
+        synchronized (mUserStateLock) {
+            return mUserStates.get(userId);
+        }
     }
 
     private final class MqDatabaseUtils {
 
-        MediaQualityDbHelper mMediaQualityDbHelper;
-
         private PictureProfile getPictureProfile(Long dbId) {
             String selection = BaseParameters.PARAMETER_ID + " = ?";
             String[] selectionArguments = {Long.toString(dbId)};
@@ -1205,8 +1213,7 @@
                     /*groupBy=*/ null, /*having=*/ null, /*orderBy=*/ null);
         }
 
-        private MqDatabaseUtils(Context context) {
-            mMediaQualityDbHelper = new MediaQualityDbHelper(context);
+        private MqDatabaseUtils() {
         }
     }
 
@@ -1264,7 +1271,7 @@
         private void notifyPictureProfileHelper(int mode, String profileId,
                 PictureProfile profile, Integer errorCode,
                 List<ParameterCapability> paramCaps, int uid, int pid) {
-            UserState userState = getOrCreateUserStateLocked(UserHandle.USER_SYSTEM);
+            UserState userState = getOrCreateUserState(UserHandle.USER_SYSTEM);
             int n = userState.mPictureProfileCallbacks.beginBroadcast();
 
             for (int i = 0; i < n; ++i) {
@@ -1349,7 +1356,7 @@
         private void notifySoundProfileHelper(int mode, String profileId,
                 SoundProfile profile, Integer errorCode,
                 List<ParameterCapability> paramCaps, int uid, int pid) {
-            UserState userState = getOrCreateUserStateLocked(UserHandle.USER_SYSTEM);
+            UserState userState = getOrCreateUserState(UserHandle.USER_SYSTEM);
             int n = userState.mSoundProfileCallbacks.beginBroadcast();
 
             for (int i = 0; i < n; ++i) {
@@ -1404,11 +1411,13 @@
 
         private void notifyHalOnPictureProfileChange(Long dbId, PersistableBundle params) {
             // TODO: only notify HAL when the profile is active / being used
-            try {
-                mPpChangedListener.onPictureProfileChanged(convertToHalPictureProfile(dbId,
-                        params));
-            } catch (RemoteException e) {
-                Slog.e(TAG, "Failed to notify HAL on picture profile change.", e);
+            if (mPpChangedListener != null) {
+                try {
+                    mPpChangedListener.onPictureProfileChanged(convertToHalPictureProfile(dbId,
+                            params));
+                } catch (RemoteException e) {
+                    Slog.e(TAG, "Failed to notify HAL on picture profile change.", e);
+                }
             }
         }
 
@@ -1429,10 +1438,13 @@
 
         private void notifyHalOnSoundProfileChange(Long dbId, PersistableBundle params) {
             // TODO: only notify HAL when the profile is active / being used
-            try {
-                mSpChangedListener.onSoundProfileChanged(convertToHalSoundProfile(dbId, params));
-            } catch (RemoteException e) {
-                Slog.e(TAG, "Failed to notify HAL on sound profile change.", e);
+            if (mSpChangedListener != null) {
+                try {
+                    mSpChangedListener
+                            .onSoundProfileChanged(convertToHalSoundProfile(dbId, params));
+                } catch (RemoteException e) {
+                    Slog.e(TAG, "Failed to notify HAL on sound profile change.", e);
+                }
             }
         }
 
@@ -1488,9 +1500,6 @@
 
     private final class PictureProfileAdjustmentListenerImpl extends
             IPictureProfileAdjustmentListener.Stub {
-        MqDatabaseUtils mMqDatabaseUtils;
-        MqManagerNotifier mMqManagerNotifier;
-        HalNotifier mHalNotifier;
 
         @Override
         public void onPictureProfileAdjusted(
@@ -1542,18 +1551,13 @@
             return null;
         }
 
-        private PictureProfileAdjustmentListenerImpl(Context context) {
-            mMqDatabaseUtils = new MqDatabaseUtils(context);
-            mMqManagerNotifier = new MqManagerNotifier();
-            mHalNotifier = new HalNotifier();
+        private PictureProfileAdjustmentListenerImpl() {
+
         }
     }
 
     private final class SoundProfileAdjustmentListenerImpl extends
             ISoundProfileAdjustmentListener.Stub {
-        MqDatabaseUtils mMqDatabaseUtils;
-        MqManagerNotifier mMqManagerNotifier;
-        HalNotifier mHalNotifier;
 
         @Override
         public void onSoundProfileAdjusted(
@@ -1598,10 +1602,8 @@
             return null;
         }
 
-        private SoundProfileAdjustmentListenerImpl(Context context) {
-            mMqDatabaseUtils = new MqDatabaseUtils(context);
-            mMqManagerNotifier = new MqManagerNotifier();
-            mHalNotifier = new HalNotifier();
+        private SoundProfileAdjustmentListenerImpl() {
+
         }
     }
 
diff --git a/services/core/java/com/android/server/notification/ManagedServices.java b/services/core/java/com/android/server/notification/ManagedServices.java
index b0ef807..62e26e1 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.Flags.FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER;
+import static com.android.server.notification.Flags.managedServicesConcurrentMultiuser;
 import static com.android.server.notification.NotificationManagerService.privateSpaceFlagsEnabled;
 
 import android.annotation.FlaggedApi;
@@ -75,7 +77,9 @@
 import com.android.internal.util.function.TriPredicate;
 import com.android.modules.utils.TypedXmlPullParser;
 import com.android.modules.utils.TypedXmlSerializer;
+import com.android.server.LocalServices;
 import com.android.server.notification.NotificationManagerService.DumpFilter;
+import com.android.server.pm.UserManagerInternal;
 import com.android.server.utils.TimingsTraceAndSlog;
 
 import org.xmlpull.v1.XmlPullParser;
@@ -134,6 +138,7 @@
     private final UserProfiles mUserProfiles;
     protected final IPackageManager mPm;
     protected final UserManager mUm;
+    protected final UserManagerInternal mUmInternal;
     private final Config mConfig;
     private final Handler mHandler = new Handler(Looper.getMainLooper());
 
@@ -157,12 +162,17 @@
     protected final ArraySet<String> mDefaultPackages = new ArraySet<>();
 
     // lists the component names of all enabled (and therefore potentially connected)
-    // app services for current profiles.
+    // app services for each user. This is intended to support a concurrent multi-user environment.
+    // key value is the resolved userId.
     @GuardedBy("mMutex")
-    private final ArraySet<ComponentName> mEnabledServicesForCurrentProfiles = new ArraySet<>();
-    // Just the packages from mEnabledServicesForCurrentProfiles
+    private final SparseArray<ArraySet<ComponentName>> mEnabledServicesByUser =
+            new SparseArray<>();
+    // Just the packages from mEnabledServicesByUser
+    // This is intended to support a concurrent multi-user environment.
+    // key value is the resolved userId.
     @GuardedBy("mMutex")
-    private final ArraySet<String> mEnabledServicesPackageNames = new ArraySet<>();
+    private final SparseArray<ArraySet<String>> mEnabledServicesPackageNamesByUser =
+            new SparseArray<>();
     // Per user id, list of enabled packages that have nevertheless asked not to be run
     @GuardedBy("mSnoozing")
     private final SparseSetArray<ComponentName> mSnoozing = new SparseSetArray<>();
@@ -195,6 +205,10 @@
         mConfig = getConfig();
         mApprovalLevel = APPROVAL_BY_COMPONENT;
         mUm = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
+        mUmInternal = LocalServices.getService(UserManagerInternal.class);
+        // Initialize for the current user.
+        mEnabledServicesByUser.put(UserHandle.USER_CURRENT, new ArraySet<>());
+        mEnabledServicesPackageNamesByUser.put(UserHandle.USER_CURRENT, new ArraySet<>());
     }
 
     abstract protected Config getConfig();
@@ -383,11 +397,30 @@
         }
 
         synchronized (mMutex) {
-            pw.println("    All " + getCaption() + "s (" + mEnabledServicesForCurrentProfiles.size()
-                    + ") enabled for current profiles:");
-            for (ComponentName cmpt : mEnabledServicesForCurrentProfiles) {
-                if (filter != null && !filter.matches(cmpt)) continue;
-                pw.println("      " + cmpt);
+            if (managedServicesConcurrentMultiuser()) {
+                for (int i = 0; i < mEnabledServicesByUser.size(); i++) {
+                    final int userId = mEnabledServicesByUser.keyAt(i);
+                    final ArraySet<ComponentName> componentNames =
+                            mEnabledServicesByUser.get(userId);
+                    String userString = userId == UserHandle.USER_CURRENT
+                            ? "current profiles" : "user " + Integer.toString(userId);
+                    pw.println("    All " + getCaption() + "s (" + componentNames.size()
+                            + ") enabled for " +  userString + ":");
+                    for (ComponentName cmpt : componentNames) {
+                        if (filter != null && !filter.matches(cmpt)) continue;
+                        pw.println("      " + cmpt);
+                    }
+                }
+            } else {
+                final ArraySet<ComponentName> enabledServicesForCurrentProfiles =
+                        mEnabledServicesByUser.get(UserHandle.USER_CURRENT);
+                pw.println("    All " + getCaption() + "s ("
+                        + enabledServicesForCurrentProfiles.size()
+                        + ") enabled for current profiles:");
+                for (ComponentName cmpt : enabledServicesForCurrentProfiles) {
+                    if (filter != null && !filter.matches(cmpt)) continue;
+                    pw.println("      " + cmpt);
+                }
             }
 
             pw.println("    Live " + getCaption() + "s (" + mServices.size() + "):");
@@ -442,11 +475,24 @@
             }
         }
 
-
         synchronized (mMutex) {
-            for (ComponentName cmpt : mEnabledServicesForCurrentProfiles) {
-                if (filter != null && !filter.matches(cmpt)) continue;
-                cmpt.dumpDebug(proto, ManagedServicesProto.ENABLED);
+            if (managedServicesConcurrentMultiuser()) {
+                for (int i = 0; i < mEnabledServicesByUser.size(); i++) {
+                    final int userId = mEnabledServicesByUser.keyAt(i);
+                    final ArraySet<ComponentName> componentNames =
+                            mEnabledServicesByUser.get(userId);
+                    for (ComponentName cmpt : componentNames) {
+                        if (filter != null && !filter.matches(cmpt)) continue;
+                        cmpt.dumpDebug(proto, ManagedServicesProto.ENABLED);
+                    }
+                }
+            } else {
+                final ArraySet<ComponentName> enabledServicesForCurrentProfiles =
+                        mEnabledServicesByUser.get(UserHandle.USER_CURRENT);
+                for (ComponentName cmpt : enabledServicesForCurrentProfiles) {
+                    if (filter != null && !filter.matches(cmpt)) continue;
+                    cmpt.dumpDebug(proto, ManagedServicesProto.ENABLED);
+                }
             }
             for (ManagedServiceInfo info : mServices) {
                 if (filter != null && !filter.matches(info.component)) continue;
@@ -841,9 +887,31 @@
         }
     }
 
+    /** convenience method for looking in mEnabledServicesPackageNamesByUser
+     * for UserHandle.USER_CURRENT.
+     * This is a legacy API. When FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER becomes
+     * trunk stable,  this API should be deprecated.  Additionally, when this method
+     * is deprecated, the unit tests written using this method should also be revised.
+     *
+     * @param pkg target package name
+     * @return boolean value that indicates whether it is enabled for the current profiles
+     */
     protected boolean isComponentEnabledForPackage(String pkg) {
+        return isComponentEnabledForPackage(pkg, UserHandle.USER_CURRENT);
+    }
+
+    /** convenience method for looking in mEnabledServicesPackageNamesByUser
+     *
+     * @param pkg target package name
+     * @param userId the id of the target user
+     * @return boolean value that indicates whether it is enabled for the target user
+     */
+    @FlaggedApi(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
+    protected boolean isComponentEnabledForPackage(String pkg, int userId) {
         synchronized (mMutex) {
-            return mEnabledServicesPackageNames.contains(pkg);
+            ArraySet<String> enabledServicesPackageNames =
+                    mEnabledServicesPackageNamesByUser.get(resolveUserId(userId));
+            return enabledServicesPackageNames != null && enabledServicesPackageNames.contains(pkg);
         }
     }
 
@@ -1016,9 +1084,14 @@
     public void onPackagesChanged(boolean removingPackage, String[] pkgList, int[] uidList) {
         if (DEBUG) {
             synchronized (mMutex) {
+                int resolvedUserId = (managedServicesConcurrentMultiuser()
+                        && (uidList != null && uidList.length > 0))
+                        ? resolveUserId(UserHandle.getUserId(uidList[0]))
+                        : UserHandle.USER_CURRENT;
                 Slog.d(TAG, "onPackagesChanged removingPackage=" + removingPackage
                         + " pkgList=" + (pkgList == null ? null : Arrays.asList(pkgList))
-                        + " mEnabledServicesPackageNames=" + mEnabledServicesPackageNames);
+                        + " mEnabledServicesPackageNames="
+                        + mEnabledServicesPackageNamesByUser.get(resolvedUserId));
             }
         }
 
@@ -1034,11 +1107,18 @@
                 }
             }
             for (String pkgName : pkgList) {
-                if (isComponentEnabledForPackage(pkgName)) {
-                    anyServicesInvolved = true;
+                if (!managedServicesConcurrentMultiuser()) {
+                    if (isComponentEnabledForPackage(pkgName)) {
+                        anyServicesInvolved = true;
+                    }
                 }
                 if (uidList != null && uidList.length > 0) {
                     for (int uid : uidList) {
+                        if (managedServicesConcurrentMultiuser()) {
+                            if (isComponentEnabledForPackage(pkgName, UserHandle.getUserId(uid))) {
+                                anyServicesInvolved = true;
+                            }
+                        }
                         if (isPackageAllowed(pkgName, UserHandle.getUserId(uid))) {
                             anyServicesInvolved = true;
                             trimApprovedListsForInvalidServices(pkgName, UserHandle.getUserId(uid));
@@ -1065,6 +1145,36 @@
         unbindUserServices(user);
     }
 
+    /**
+     * Call this method when a user is stopped
+     *
+     * @param user the id of the stopped user
+     */
+    public void onUserStopped(int user) {
+        if (!managedServicesConcurrentMultiuser()) {
+            return;
+        }
+        boolean hasAny = false;
+        synchronized (mMutex) {
+            if (mEnabledServicesByUser.contains(user)
+                    && mEnabledServicesPackageNamesByUser.contains(user)) {
+                // Through the ManagedServices.resolveUserId,
+                // we resolve UserHandle.USER_CURRENT as the key for users
+                // other than the visible background user.
+                // Therefore, the user IDs that exist as keys for each member variable
+                // correspond to the visible background user.
+                // We need to unbind services of the stopped visible background user.
+                mEnabledServicesByUser.remove(user);
+                mEnabledServicesPackageNamesByUser.remove(user);
+                hasAny = true;
+            }
+        }
+        if (hasAny) {
+            Slog.i(TAG, "Removing approved services for stopped user " + user);
+            unbindUserServices(user);
+        }
+    }
+
     public void onUserSwitched(int user) {
         if (DEBUG) Slog.d(TAG, "onUserSwitched u=" + user);
         unbindOtherUserServices(user);
@@ -1386,19 +1496,42 @@
     protected void populateComponentsToBind(SparseArray<Set<ComponentName>> componentsToBind,
             final IntArray activeUsers,
             SparseArray<ArraySet<ComponentName>> approvedComponentsByUser) {
-        mEnabledServicesForCurrentProfiles.clear();
-        mEnabledServicesPackageNames.clear();
         final int nUserIds = activeUsers.size();
-
+        if (managedServicesConcurrentMultiuser()) {
+            for (int i = 0; i < nUserIds; ++i) {
+                final int resolvedUserId = resolveUserId(activeUsers.get(i));
+                if (mEnabledServicesByUser.get(resolvedUserId) != null) {
+                    mEnabledServicesByUser.get(resolvedUserId).clear();
+                }
+                if (mEnabledServicesPackageNamesByUser.get(resolvedUserId) != null) {
+                    mEnabledServicesPackageNamesByUser.get(resolvedUserId).clear();
+                }
+            }
+        } else {
+            mEnabledServicesByUser.get(UserHandle.USER_CURRENT).clear();
+            mEnabledServicesPackageNamesByUser.get(UserHandle.USER_CURRENT).clear();
+        }
         for (int i = 0; i < nUserIds; ++i) {
-            // decode the list of components
             final int userId = activeUsers.get(i);
+            // decode the list of components
             final ArraySet<ComponentName> userComponents = approvedComponentsByUser.get(userId);
             if (null == userComponents) {
                 componentsToBind.put(userId, new ArraySet<>());
                 continue;
             }
 
+            final int resolvedUserId = managedServicesConcurrentMultiuser()
+                    ? resolveUserId(userId)
+                    : UserHandle.USER_CURRENT;
+            ArraySet<ComponentName> enabledServices =
+                    mEnabledServicesByUser.contains(resolvedUserId)
+                    ? mEnabledServicesByUser.get(resolvedUserId)
+                    : new ArraySet<>();
+            ArraySet<String> enabledServicesPackageName =
+                    mEnabledServicesPackageNamesByUser.contains(resolvedUserId)
+                    ? mEnabledServicesPackageNamesByUser.get(resolvedUserId)
+                    : new ArraySet<>();
+
             final Set<ComponentName> add = new HashSet<>(userComponents);
             synchronized (mSnoozing) {
                 ArraySet<ComponentName> snoozed = mSnoozing.get(userId);
@@ -1409,12 +1542,12 @@
 
             componentsToBind.put(userId, add);
 
-            mEnabledServicesForCurrentProfiles.addAll(userComponents);
-
+            enabledServices.addAll(userComponents);
             for (int j = 0; j < userComponents.size(); j++) {
-                final ComponentName component = userComponents.valueAt(j);
-                mEnabledServicesPackageNames.add(component.getPackageName());
+                enabledServicesPackageName.add(userComponents.valueAt(j).getPackageName());
             }
+            mEnabledServicesByUser.put(resolvedUserId, enabledServices);
+            mEnabledServicesPackageNamesByUser.put(resolvedUserId, enabledServicesPackageName);
         }
     }
 
@@ -1453,13 +1586,9 @@
      */
     protected void rebindServices(boolean forceRebind, int userToRebind) {
         if (DEBUG) Slog.d(TAG, "rebindServices " + forceRebind + " " + userToRebind);
-        IntArray userIds = mUserProfiles.getCurrentProfileIds();
         boolean rebindAllCurrentUsers = mUserProfiles.isProfileUser(userToRebind, mContext)
                 && allowRebindForParentUser();
-        if (userToRebind != USER_ALL && !rebindAllCurrentUsers) {
-            userIds = new IntArray(1);
-            userIds.add(userToRebind);
-        }
+        IntArray userIds = getUserIdsForRebindServices(userToRebind, rebindAllCurrentUsers);
 
         final SparseArray<Set<ComponentName>> componentsToBind = new SparseArray<>();
         final SparseArray<Set<ComponentName>> componentsToUnbind = new SparseArray<>();
@@ -1483,6 +1612,23 @@
         bindToServices(componentsToBind);
     }
 
+    private IntArray getUserIdsForRebindServices(int userToRebind, boolean rebindAllCurrentUsers) {
+        IntArray userIds = mUserProfiles.getCurrentProfileIds();
+        if (userToRebind != USER_ALL && !rebindAllCurrentUsers) {
+            userIds = new IntArray(1);
+            userIds.add(userToRebind);
+        } else if (managedServicesConcurrentMultiuser()
+                && userToRebind == USER_ALL) {
+            for (UserInfo user : mUm.getUsers()) {
+                if (mUmInternal.isVisibleBackgroundFullUser(user.id)
+                        && !userIds.contains(user.id)) {
+                    userIds.add(user.id);
+                }
+            }
+        }
+        return userIds;
+    }
+
     /**
      * Called when user switched to unbind all services from other users.
      */
@@ -1506,7 +1652,11 @@
         synchronized (mMutex) {
             final Set<ManagedServiceInfo> removableBoundServices = getRemovableConnectedServices();
             for (ManagedServiceInfo info : removableBoundServices) {
-                if ((allExceptUser && (info.userid != user))
+                // User switching is the event for the forground user.
+                // It should not affect the service of the visible background user.
+                if ((allExceptUser && (info.userid != user)
+                        && !(managedServicesConcurrentMultiuser()
+                            && info.isVisibleBackgroundUserService))
                         || (!allExceptUser && (info.userid == user))) {
                     Set<ComponentName> toUnbind =
                             componentsToUnbind.get(info.userid, new ArraySet<>());
@@ -1861,6 +2011,29 @@
     }
 
     /**
+     * This method returns the mapped id for the incoming user id
+     * If the incoming id was not the id of the visible background user, it returns USER_CURRENT.
+     * In the other cases, it returns the same value as the input.
+     *
+     * @param userId the id of the user
+     * @return the user id if it is a visible background user, otherwise
+     * {@link UserHandle#USER_CURRENT}
+     */
+    @FlaggedApi(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
+    @VisibleForTesting
+    public int resolveUserId(int userId) {
+        if (managedServicesConcurrentMultiuser()) {
+            if (mUmInternal.isVisibleBackgroundFullUser(userId)) {
+                // The dataset of the visible background user should be managed independently.
+                return userId;
+            }
+        }
+        // The data of current user and its profile users need to  be managed
+        // in a dataset as before.
+        return UserHandle.USER_CURRENT;
+    }
+
+    /**
      * Returns true if services in the parent user should be rebound
      *  when rebindServices is called with a profile userId.
      * Must be false for NotificationAssistants.
@@ -1878,6 +2051,8 @@
         public int targetSdkVersion;
         public Pair<ComponentName, Integer> mKey;
         public int uid;
+        @FlaggedApi(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
+        public boolean isVisibleBackgroundUserService;
 
         public ManagedServiceInfo(IInterface service, ComponentName component,
                 int userid, boolean isSystem, ServiceConnection connection, int targetSdkVersion,
@@ -1889,6 +2064,10 @@
             this.connection = connection;
             this.targetSdkVersion = targetSdkVersion;
             this.uid = uid;
+            if (managedServicesConcurrentMultiuser()) {
+                this.isVisibleBackgroundUserService = LocalServices
+                        .getService(UserManagerInternal.class).isVisibleBackgroundFullUser(userid);
+            }
             mKey = Pair.create(component, userid);
         }
 
@@ -1937,19 +2116,28 @@
         }
 
         public boolean isSameUser(int userId) {
-            if (!isEnabledForCurrentProfiles()) {
+            if (!isEnabledForUser()) {
                 return false;
             }
             return userId == USER_ALL || userId == this.userid;
         }
 
         public boolean enabledAndUserMatches(int nid) {
-            if (!isEnabledForCurrentProfiles()) {
+            if (!isEnabledForUser()) {
                 return false;
             }
             if (this.userid == USER_ALL) return true;
             if (this.isSystem) return true;
             if (nid == USER_ALL || nid == this.userid) return true;
+            if (managedServicesConcurrentMultiuser()
+                    && mUmInternal.getProfileParentId(nid)
+                        != mUmInternal.getProfileParentId(this.userid)) {
+                // If the profile parent IDs do not match each other,
+                // it is determined that the users do not match.
+                // This situation may occur when comparing the current user's ID
+                // with the visible background user's ID.
+                return false;
+            }
             return supportsProfiles()
                     && mUserProfiles.isCurrentProfile(nid)
                     && isPermittedForProfile(nid);
@@ -1969,12 +2157,21 @@
             removeServiceImpl(this.service, this.userid);
         }
 
-        /** convenience method for looking in mEnabledServicesForCurrentProfiles */
-        public boolean isEnabledForCurrentProfiles() {
+        /**
+         * convenience method for looking in mEnabledServicesByUser.
+         * If FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER is disabled, this manages the data using
+         * only UserHandle.USER_CURRENT as the key, in order to behave the same as the legacy logic.
+        */
+        public boolean isEnabledForUser() {
             if (this.isSystem) return true;
             if (this.connection == null) return false;
             synchronized (mMutex) {
-                return mEnabledServicesForCurrentProfiles.contains(this.component);
+                int resolvedUserId = managedServicesConcurrentMultiuser()
+                        ? resolveUserId(this.userid)
+                        : UserHandle.USER_CURRENT;
+                ArraySet<ComponentName> enabledServices =
+                        mEnabledServicesByUser.get(resolvedUserId);
+                return enabledServices != null && enabledServices.contains(this.component);
             }
         }
 
@@ -2017,10 +2214,30 @@
         }
     }
 
-    /** convenience method for looking in mEnabledServicesForCurrentProfiles */
+    /** convenience method for looking in mEnabledServicesByUser for UserHandle.USER_CURRENT.
+     * This is a legacy API. When FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER becomes
+     * trunk stable,  this API should be deprecated.  Additionally, when this method
+     * is deprecated, the unit tests written using this method should also be revised.
+     *
+     * @param component target component name
+     * @return boolean value that indicates whether it is enabled for the current profiles
+     */
     public boolean isComponentEnabledForCurrentProfiles(ComponentName component) {
+        return isComponentEnabledForUser(component, UserHandle.USER_CURRENT);
+    }
+
+    /** convenience method for looking in mEnabledServicesForUser
+     *
+     * @param component target component name
+     * @param userId the id of the target user
+     * @return boolean value that indicates whether it is enabled for the target user
+    */
+    @FlaggedApi(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
+    public boolean isComponentEnabledForUser(ComponentName component, int userId) {
         synchronized (mMutex) {
-            return mEnabledServicesForCurrentProfiles.contains(component);
+            ArraySet<ComponentName> enabledServicesForUser =
+                    mEnabledServicesByUser.get(resolveUserId(userId));
+            return enabledServicesForUser != null && enabledServicesForUser.contains(component);
         }
     }
 
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 3a3deb0..6fddfb5 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -173,6 +173,7 @@
 import static com.android.server.am.PendingIntentRecord.FLAG_BROADCAST_SENDER;
 import static com.android.server.am.PendingIntentRecord.FLAG_SERVICE_SENDER;
 import static com.android.server.notification.Flags.expireBitmaps;
+import static com.android.server.notification.Flags.managedServicesConcurrentMultiuser;
 import static com.android.server.policy.PhoneWindowManager.TOAST_WINDOW_ANIM_BUFFER;
 import static com.android.server.policy.PhoneWindowManager.TOAST_WINDOW_TIMEOUT;
 import static com.android.server.utils.PriorityDump.PRIORITY_ARG;
@@ -1207,7 +1208,7 @@
         }
 
         mAssistants.resetDefaultAssistantsIfNecessary();
-        mPreferencesHelper.syncChannelsBypassingDnd();
+        mPreferencesHelper.syncHasPriorityChannels();
     }
 
     @VisibleForTesting
@@ -2323,6 +2324,9 @@
                 if (userHandle >= 0) {
                     cancelAllNotificationsInt(MY_UID, MY_PID, null, null, 0, 0, userHandle,
                             REASON_USER_STOPPED);
+                    mConditionProviders.onUserStopped(userHandle);
+                    mListeners.onUserStopped(userHandle);
+                    mAssistants.onUserStopped(userHandle);
                 }
             } else if (
                     isProfileUnavailable(action)) {
@@ -2343,7 +2347,7 @@
                         mConditionProviders.onUserSwitched(userId);
                         mListeners.onUserSwitched(userId);
                         mZenModeHelper.onUserSwitched(userId);
-                        mPreferencesHelper.syncChannelsBypassingDnd();
+                        mPreferencesHelper.syncHasPriorityChannels();
                     }
                     // assistant is the only thing that cares about managed profiles specifically
                     mAssistants.onUserSwitched(userId);
@@ -2367,7 +2371,7 @@
                 mConditionProviders.onUserRemoved(userId);
                 mAssistants.onUserRemoved(userId);
                 mHistoryManager.onUserRemoved(userId);
-                mPreferencesHelper.syncChannelsBypassingDnd();
+                mPreferencesHelper.syncHasPriorityChannels();
                 handleSavePolicyFile();
             } else if (action.equals(Intent.ACTION_USER_UNLOCKED)) {
                 final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, USER_NULL);
@@ -2376,9 +2380,6 @@
                 if (!mUserProfiles.isProfileUser(userId, context)) {
                     mConditionProviders.onUserUnlocked(userId);
                     mListeners.onUserUnlocked(userId);
-                    if (!android.app.Flags.modesApi()) {
-                        mZenModeHelper.onUserUnlocked(userId);
-                    }
                 }
             }
         }
@@ -2767,9 +2768,7 @@
             void onPolicyChanged(Policy newPolicy) {
                 Binder.withCleanCallingIdentity(() -> {
                     Intent intent = new Intent(ACTION_NOTIFICATION_POLICY_CHANGED);
-                    if (android.app.Flags.modesApi()) {
-                        intent.putExtra(EXTRA_NOTIFICATION_POLICY, newPolicy);
-                    }
+                    intent.putExtra(EXTRA_NOTIFICATION_POLICY, newPolicy);
                     sendRegisteredOnlyBroadcast(intent);
                     mRankingHandler.requestSort();
                 });
@@ -2778,11 +2777,10 @@
             @Override
             void onConsolidatedPolicyChanged(Policy newConsolidatedPolicy) {
                 Binder.withCleanCallingIdentity(() -> {
-                    if (android.app.Flags.modesApi()) {
-                        Intent intent = new Intent(ACTION_CONSOLIDATED_NOTIFICATION_POLICY_CHANGED);
-                        intent.putExtra(EXTRA_NOTIFICATION_POLICY, newConsolidatedPolicy);
-                        sendRegisteredOnlyBroadcast(intent);
-                    }
+                    Intent intent = new Intent(ACTION_CONSOLIDATED_NOTIFICATION_POLICY_CHANGED);
+                    intent.putExtra(EXTRA_NOTIFICATION_POLICY, newConsolidatedPolicy);
+                    sendRegisteredOnlyBroadcast(intent);
+
                     mRankingHandler.requestSort();
                 });
             }
@@ -3368,7 +3366,7 @@
             migrateDefaultNAS();
             maybeShowInitialReviewPermissionsNotification();
 
-            if (android.app.Flags.modesApi() && !mZenModeHelper.hasDeviceEffectsApplier()) {
+            if (!mZenModeHelper.hasDeviceEffectsApplier()) {
                 // Cannot be done earlier, as some services aren't ready until this point.
                 mZenModeHelper.setDeviceEffectsApplier(
                         new DefaultDeviceEffectsApplier(getContext()));
@@ -3446,7 +3444,7 @@
             mConditionProviders.onUserSwitched(userId);
             mListeners.onUserSwitched(userId);
             mZenModeHelper.onUserSwitched(userId);
-            mPreferencesHelper.syncChannelsBypassingDnd();
+            mPreferencesHelper.syncHasPriorityChannels();
         }
         // assistant is the only thing that cares about managed profiles specifically
         mAssistants.onUserSwitched(userId);
@@ -5236,11 +5234,23 @@
 
         @Override
         public boolean areChannelsBypassingDnd() {
-            if (android.app.Flags.modesApi()) {
-                return mZenModeHelper.getConsolidatedNotificationPolicy().allowPriorityChannels()
-                        && mPreferencesHelper.areChannelsBypassingDnd();
+            return mZenModeHelper.getConsolidatedNotificationPolicy().allowPriorityChannels()
+                    && mPreferencesHelper.hasPriorityChannels();
+        }
+
+        @Override
+        @FlaggedApi(android.app.Flags.FLAG_NM_BINDER_PERF_GET_APPS_WITH_CHANNELS)
+        public List<String> getPackagesWithAnyChannels(int userId) throws RemoteException {
+            checkCallerIsSystem();
+            UserHandle user = UserHandle.of(userId);
+            List<String> packages = mPreferencesHelper.getPackagesWithAnyChannels(userId);
+            for (int i = packages.size() - 1; i >= 0; i--) {
+                String pkg = packages.get(i);
+                if (!areNotificationsEnabledForPackage(pkg, getUidForPackageAndUser(pkg, user))) {
+                    packages.remove(i);
+                }
             }
-            return mPreferencesHelper.areChannelsBypassingDnd();
+            return packages;
         }
 
         @Override
@@ -5715,12 +5725,13 @@
         public void requestBindListener(ComponentName component) {
             checkCallerIsSystemOrSameApp(component.getPackageName());
             int uid = Binder.getCallingUid();
+            int userId = UserHandle.getUserId(uid);
             final long identity = Binder.clearCallingIdentity();
             try {
-                ManagedServices manager =
-                        mAssistants.isComponentEnabledForCurrentProfiles(component)
-                        ? mAssistants
-                        : mListeners;
+                boolean isAssistantEnabled = managedServicesConcurrentMultiuser()
+                        ? mAssistants.isComponentEnabledForUser(component, userId)
+                        : mAssistants.isComponentEnabledForCurrentProfiles(component);
+                ManagedServices manager = isAssistantEnabled ? mAssistants : mListeners;
                 manager.setComponentState(component, UserHandle.getUserId(uid), true);
             } finally {
                 Binder.restoreCallingIdentity(identity);
@@ -5747,16 +5758,16 @@
         public void requestUnbindListenerComponent(ComponentName component) {
             checkCallerIsSameApp(component.getPackageName());
             int uid = Binder.getCallingUid();
+            int userId = UserHandle.getUserId(uid);
             final long identity = Binder.clearCallingIdentity();
             try {
                 synchronized (mNotificationLock) {
-                    ManagedServices manager =
-                            mAssistants.isComponentEnabledForCurrentProfiles(component)
-                                    ? mAssistants
-                                    : mListeners;
-                    if (manager.isPackageOrComponentAllowed(component.flattenToString(),
-                            UserHandle.getUserId(uid))) {
-                        manager.setComponentState(component, UserHandle.getUserId(uid), false);
+                    boolean isAssistantEnabled = managedServicesConcurrentMultiuser()
+                            ? mAssistants.isComponentEnabledForUser(component, userId)
+                            : mAssistants.isComponentEnabledForCurrentProfiles(component);
+                    ManagedServices manager = isAssistantEnabled ? mAssistants : mListeners;
+                    if (manager.isPackageOrComponentAllowed(component.flattenToString(), userId)) {
+                        manager.setComponentState(component, userId, false);
                     }
                 }
             } finally {
@@ -6077,43 +6088,27 @@
         @Override
         public void requestInterruptionFilterFromListener(INotificationListener token,
                 int interruptionFilter) throws RemoteException {
-            if (android.app.Flags.modesApi()) {
-                final int callingUid = Binder.getCallingUid();
-                ManagedServiceInfo info;
-                synchronized (mNotificationLock) {
-                    info = mListeners.checkServiceTokenLocked(token);
-                }
+            final int callingUid = Binder.getCallingUid();
+            ManagedServiceInfo info;
+            synchronized (mNotificationLock) {
+                info = mListeners.checkServiceTokenLocked(token);
+            }
 
-                final int zenMode = zenModeFromInterruptionFilter(interruptionFilter, -1);
-                if (zenMode == -1) return;
+            final int zenMode = zenModeFromInterruptionFilter(interruptionFilter, -1);
+            if (zenMode == -1) return;
 
-                UserHandle zenUser = getCallingZenUser();
-                if (!canManageGlobalZenPolicy(info.component.getPackageName(), callingUid)) {
-                    mZenModeHelper.applyGlobalZenModeAsImplicitZenRule(
-                            zenUser, info.component.getPackageName(), callingUid, zenMode);
-                } else {
-                    int origin = computeZenOrigin(/* fromUser= */ false);
-                    Binder.withCleanCallingIdentity(() -> {
-                        mZenModeHelper.setManualZenMode(zenUser, zenMode, /* conditionId= */ null,
-                                origin, "listener:" + info.component.flattenToShortString(),
-                                /* caller= */ info.component.getPackageName(),
-                                callingUid);
-                    });
-                }
+            UserHandle zenUser = getCallingZenUser();
+            if (!canManageGlobalZenPolicy(info.component.getPackageName(), callingUid)) {
+                mZenModeHelper.applyGlobalZenModeAsImplicitZenRule(
+                        zenUser, info.component.getPackageName(), callingUid, zenMode);
             } else {
-                final int callingUid = Binder.getCallingUid();
-                final boolean isSystemOrSystemUi = isCallerSystemOrSystemUi();
-                final long identity = Binder.clearCallingIdentity();
-                try {
-                    synchronized (mNotificationLock) {
-                        final ManagedServiceInfo info = mListeners.checkServiceTokenLocked(token);
-                        mZenModeHelper.requestFromListener(info.component, interruptionFilter,
-                                callingUid, isSystemOrSystemUi);
-                        updateInterruptionFilterLocked();
-                    }
-                } finally {
-                    Binder.restoreCallingIdentity(identity);
-                }
+                int origin = computeZenOrigin(/* fromUser= */ false);
+                Binder.withCleanCallingIdentity(() -> {
+                    mZenModeHelper.setManualZenMode(zenUser, zenMode, /* conditionId= */ null,
+                            origin, "listener:" + info.component.flattenToShortString(),
+                            /* caller= */ info.component.getPackageName(),
+                            callingUid);
+                });
             }
         }
 
@@ -6162,19 +6157,8 @@
             }
         }
 
-        // TODO: b/310620812 - Remove getZenRules() when MODES_API is inlined.
-        @Override
-        public List<ZenModeConfig.ZenRule> getZenRules() throws RemoteException {
-            int callingUid = Binder.getCallingUid();
-            enforcePolicyAccess(callingUid, "getZenRules");
-            return mZenModeHelper.getZenRules(getCallingZenUser(), callingUid);
-        }
-
         @Override
         public Map<String, AutomaticZenRule> getAutomaticZenRules() {
-            if (!android.app.Flags.modesApi()) {
-                throw new IllegalStateException("getAutomaticZenRules called with flag off!");
-            }
             int callingUid = Binder.getCallingUid();
             enforcePolicyAccess(callingUid, "getAutomaticZenRules");
             return mZenModeHelper.getAutomaticZenRules(getCallingZenUser(), callingUid);
@@ -6245,50 +6229,40 @@
             // Implicit rules have no ConditionProvider or Activity. We allow the user to customize
             // them (via Settings), but not the owner app. Should the app want to start using it as
             // a "normal" rule, it must provide a CP/ConfigActivity too.
-            if (android.app.Flags.modesApi()) {
-                boolean isImplicitRuleUpdateFromSystem = updateId != null
-                        && ZenModeConfig.isImplicitRuleId(updateId)
-                        && isCallerSystemOrSystemUi();
-                if (!isImplicitRuleUpdateFromSystem
-                        && rule.getOwner() == null
-                        && rule.getConfigurationActivity() == null) {
-                    throw new NullPointerException(
-                            "Rule must have a ConditionProviderService and/or configuration "
-                                    + "activity");
-                }
-            } else {
-                if (rule.getOwner() == null && rule.getConfigurationActivity() == null) {
-                    throw new NullPointerException(
-                            "Rule must have a ConditionProviderService and/or configuration "
-                                    + "activity");
-                }
+            boolean isImplicitRuleUpdateFromSystem = updateId != null
+                    && ZenModeConfig.isImplicitRuleId(updateId)
+                    && isCallerSystemOrSystemUi();
+            if (!isImplicitRuleUpdateFromSystem
+                    && rule.getOwner() == null
+                    && rule.getConfigurationActivity() == null) {
+                throw new NullPointerException(
+                        "Rule must have a ConditionProviderService and/or configuration "
+                                + "activity");
             }
             Objects.requireNonNull(rule.getConditionId(), "ConditionId is null");
 
-            if (android.app.Flags.modesApi()) {
-                if (isCallerSystemOrSystemUi()) {
-                    return; // System callers can use any type.
-                }
-                int uid = Binder.getCallingUid();
-                int userId = UserHandle.getUserId(uid);
+            if (isCallerSystemOrSystemUi()) {
+                return; // System callers can use any type.
+            }
+            int uid = Binder.getCallingUid();
+            int userId = UserHandle.getUserId(uid);
 
-                if (rule.getType() == AutomaticZenRule.TYPE_MANAGED) {
-                    boolean isDeviceOwner = Binder.withCleanCallingIdentity(
-                            () -> mDpm.isActiveDeviceOwner(uid));
-                    if (!isDeviceOwner) {
-                        throw new IllegalArgumentException(
-                                "Only Device Owners can use AutomaticZenRules with TYPE_MANAGED");
-                    }
-                } else if (rule.getType() == AutomaticZenRule.TYPE_BEDTIME) {
-                    String wellbeingPackage = getContext().getResources().getString(
-                            com.android.internal.R.string.config_systemWellbeing);
-                    boolean isCallerWellbeing = !TextUtils.isEmpty(wellbeingPackage)
-                            && mPackageManagerInternal.isSameApp(wellbeingPackage, uid, userId);
-                    if (!isCallerWellbeing) {
-                        throw new IllegalArgumentException(
-                                "Only the 'Wellbeing' package can use AutomaticZenRules with "
-                                        + "TYPE_BEDTIME");
-                    }
+            if (rule.getType() == AutomaticZenRule.TYPE_MANAGED) {
+                boolean isDeviceOwner = Binder.withCleanCallingIdentity(
+                        () -> mDpm.isActiveDeviceOwner(uid));
+                if (!isDeviceOwner) {
+                    throw new IllegalArgumentException(
+                            "Only Device Owners can use AutomaticZenRules with TYPE_MANAGED");
+                }
+            } else if (rule.getType() == AutomaticZenRule.TYPE_BEDTIME) {
+                String wellbeingPackage = getContext().getResources().getString(
+                        com.android.internal.R.string.config_systemWellbeing);
+                boolean isCallerWellbeing = !TextUtils.isEmpty(wellbeingPackage)
+                        && mPackageManagerInternal.isSameApp(wellbeingPackage, uid, userId);
+                if (!isCallerWellbeing) {
+                    throw new IllegalArgumentException(
+                            "Only the 'Wellbeing' package can use AutomaticZenRules with "
+                                    + "TYPE_BEDTIME");
                 }
             }
         }
@@ -6371,9 +6345,7 @@
 
         @ZenModeConfig.ConfigOrigin
         private int computeZenOrigin(boolean fromUser) {
-            // "fromUser" is introduced with MODES_API, so only consider it in that case.
-            // (Non-MODES_API behavior should also not depend at all on ORIGIN_USER_IN_X).
-            if (android.app.Flags.modesApi() && fromUser) {
+            if (fromUser) {
                 if (isCallerSystemOrSystemUi()) {
                     return ZenModeConfig.ORIGIN_USER_IN_SYSTEMUI;
                 } else {
@@ -6387,9 +6359,7 @@
         }
 
         private void enforceUserOriginOnlyFromSystem(boolean fromUser, String method) {
-            if (android.app.Flags.modesApi()
-                    && fromUser
-                    && !isCallerSystemOrSystemUiOrShell()) {
+            if (fromUser && !isCallerSystemOrSystemUiOrShell()) {
                 throw new SecurityException(TextUtils.formatSimple(
                         "Calling %s with fromUser == true is only allowed for system", method));
             }
@@ -6404,7 +6374,7 @@
             enforceUserOriginOnlyFromSystem(fromUser, "setInterruptionFilter");
             UserHandle zenUser = getCallingZenUser();
 
-            if (android.app.Flags.modesApi() && !canManageGlobalZenPolicy(pkg, callingUid)) {
+            if (!canManageGlobalZenPolicy(pkg, callingUid)) {
                 mZenModeHelper.applyGlobalZenModeAsImplicitZenRule(zenUser, pkg, callingUid, zen);
                 return;
             }
@@ -6534,6 +6504,13 @@
             } catch (NameNotFoundException e) {
                 return false;
             }
+            if (managedServicesConcurrentMultiuser()) {
+                return checkPackagePolicyAccess(pkg)
+                        || mListeners.isComponentEnabledForPackage(pkg,
+                            UserHandle.getCallingUserId())
+                        || (mDpm != null
+                            && (mDpm.isActiveProfileOwner(uid) || mDpm.isActiveDeviceOwner(uid)));
+            }
             //TODO(b/169395065) Figure out if this flow makes sense in Device Owner mode.
             return checkPackagePolicyAccess(pkg)
                     || mListeners.isComponentEnabledForPackage(pkg)
@@ -6708,7 +6685,7 @@
         public Policy getNotificationPolicy(String pkg) {
             final int callingUid = Binder.getCallingUid();
             UserHandle zenUser = getCallingZenUser();
-            if (android.app.Flags.modesApi() && !canManageGlobalZenPolicy(pkg, callingUid)) {
+            if (!canManageGlobalZenPolicy(pkg, callingUid)) {
                 return mZenModeHelper.getNotificationPolicyFromImplicitZenRule(zenUser, pkg);
             }
             final long identity = Binder.clearCallingIdentity();
@@ -6745,8 +6722,7 @@
             UserHandle zenUser = getCallingZenUser();
 
             boolean isSystemCaller = isCallerSystemOrSystemUiOrShell();
-            boolean shouldApplyAsImplicitRule = android.app.Flags.modesApi()
-                    && !canManageGlobalZenPolicy(pkg, callingUid);
+            boolean shouldApplyAsImplicitRule = !canManageGlobalZenPolicy(pkg, callingUid);
 
             final long identity = Binder.clearCallingIdentity();
             try {
@@ -6938,7 +6914,8 @@
                         android.Manifest.permission.INTERACT_ACROSS_USERS,
                         "setNotificationListenerAccessGrantedForUser for user " + userId);
             }
-            if (mUmInternal.isVisibleBackgroundFullUser(userId)) {
+            if (!managedServicesConcurrentMultiuser()
+                    && mUmInternal.isVisibleBackgroundFullUser(userId)) {
                 // The main use case for visible background users is the Automotive multi-display
                 // configuration where a passenger can use a secondary display while the driver is
                 // using the main display. NotificationListeners is designed only for the current
@@ -8204,9 +8181,6 @@
 
         @Override
         public void setDeviceEffectsApplier(DeviceEffectsApplier applier) {
-            if (!android.app.Flags.modesApi()) {
-                return;
-            }
             if (mZenModeHelper == null) {
                 throw new IllegalStateException("ZenModeHelper is not yet ready!");
             }
@@ -13150,7 +13124,8 @@
 
         @Override
         public void onUserUnlocked(int user) {
-            if (mUmInternal.isVisibleBackgroundFullUser(user)) {
+            if (!managedServicesConcurrentMultiuser()
+                    && mUmInternal.isVisibleBackgroundFullUser(user)) {
                 // The main use case for visible background users is the Automotive
                 // multi-display configuration where a passenger can use a secondary
                 // display while the driver is using the main display.
@@ -13790,7 +13765,7 @@
             // TODO (b/73052211): if the ranking update changed the notification type,
             // cancel notifications for NLSes that can't see them anymore
             for (final ManagedServiceInfo serviceInfo : getServices()) {
-                if (!serviceInfo.isEnabledForCurrentProfiles() || !isInteractionVisibleToListener(
+                if (!serviceInfo.isEnabledForUser() || !isInteractionVisibleToListener(
                         serviceInfo, ActivityManager.getCurrentUser())) {
                     continue;
                 }
@@ -13818,7 +13793,7 @@
         @GuardedBy("mNotificationLock")
         public void notifyListenerHintsChangedLocked(final int hints) {
             for (final ManagedServiceInfo serviceInfo : getServices()) {
-                if (!serviceInfo.isEnabledForCurrentProfiles() || !isInteractionVisibleToListener(
+                if (!serviceInfo.isEnabledForUser() || !isInteractionVisibleToListener(
                         serviceInfo, ActivityManager.getCurrentUser())) {
                     continue;
                 }
@@ -13874,7 +13849,7 @@
 
         public void notifyInterruptionFilterChanged(final int interruptionFilter) {
             for (final ManagedServiceInfo serviceInfo : getServices()) {
-                if (!serviceInfo.isEnabledForCurrentProfiles() || !isInteractionVisibleToListener(
+                if (!serviceInfo.isEnabledForUser() || !isInteractionVisibleToListener(
                         serviceInfo, ActivityManager.getCurrentUser())) {
                     continue;
                 }
diff --git a/services/core/java/com/android/server/notification/NotificationShellCmd.java b/services/core/java/com/android/server/notification/NotificationShellCmd.java
index c305d66..bc987ed 100644
--- a/services/core/java/com/android/server/notification/NotificationShellCmd.java
+++ b/services/core/java/com/android/server/notification/NotificationShellCmd.java
@@ -183,13 +183,8 @@
                             interruptionFilter = INTERRUPTION_FILTER_ALL;
                     }
                     final int filter = interruptionFilter;
-                    if (android.app.Flags.modesApi()) {
-                        mBinderService.setInterruptionFilter(callingPackage, filter,
-                                /* fromUser= */ true);
-                    } else {
-                        mBinderService.setInterruptionFilter(callingPackage, filter,
-                                /* fromUser= */ false);
-                    }
+                    mBinderService.setInterruptionFilter(callingPackage, filter,
+                            /* fromUser= */ true);
                 }
                 break;
                 case "allow_dnd": {
diff --git a/services/core/java/com/android/server/notification/PreferencesHelper.java b/services/core/java/com/android/server/notification/PreferencesHelper.java
index a171ffc..0fc182f 100644
--- a/services/core/java/com/android/server/notification/PreferencesHelper.java
+++ b/services/core/java/com/android/server/notification/PreferencesHelper.java
@@ -233,11 +233,9 @@
     private SparseBooleanArray mLockScreenShowNotifications;
     private SparseBooleanArray mLockScreenPrivateNotifications;
     private boolean mIsMediaNotificationFilteringEnabled;
-    // When modes_api flag is enabled, this value only tracks whether the current user has any
-    // channels marked as "priority channels", but not necessarily whether they are permitted
-    // to bypass DND by current zen policy.
-    // TODO: b/310620812 - Rename to be more accurate when modes_api flag is inlined.
-    private boolean mCurrentUserHasChannelsBypassingDnd;
+    // Whether the current user has any channels marked as "priority channels" -- but not
+    // necessarily whether they are permitted to bypass DND by current zen policy.
+    private boolean mCurrentUserHasPriorityChannels;
     private boolean mHideSilentStatusBarIcons = DEFAULT_HIDE_SILENT_STATUS_BAR_ICONS;
     private final boolean mShowReviewPermissionsNotification;
 
@@ -1063,7 +1061,7 @@
             r.groups.put(group.getId(), group);
         }
         if (needsDndChange) {
-            updateCurrentUserHasChannelsBypassingDnd(callingUid, fromSystemOrSystemUi);
+            updateCurrentUserHasPriorityChannels(callingUid, fromSystemOrSystemUi);
         }
         if (android.app.Flags.nmBinderPerfCacheChannels() && changed) {
             invalidateNotificationChannelGroupCache();
@@ -1150,7 +1148,7 @@
                         existing.setBypassDnd(bypassDnd);
                         needsPolicyFileChange = true;
 
-                        if (bypassDnd != mCurrentUserHasChannelsBypassingDnd
+                        if (bypassDnd != mCurrentUserHasPriorityChannels
                                 || previousExistingImportance != existing.getImportance()) {
                             needsDndChange = true;
                         }
@@ -1214,7 +1212,7 @@
                 }
 
                 r.channels.put(channel.getId(), channel);
-                if (channel.canBypassDnd() != mCurrentUserHasChannelsBypassingDnd) {
+                if (channel.canBypassDnd() != mCurrentUserHasPriorityChannels) {
                     needsDndChange = true;
                 }
                 MetricsLogger.action(getChannelLog(channel, pkg).setType(
@@ -1224,7 +1222,7 @@
         }
 
         if (needsDndChange) {
-            updateCurrentUserHasChannelsBypassingDnd(callingUid, fromSystemOrSystemUi);
+            updateCurrentUserHasPriorityChannels(callingUid, fromSystemOrSystemUi);
         }
 
         if (android.app.Flags.nmBinderPerfCacheChannels() && needsPolicyFileChange) {
@@ -1317,14 +1315,14 @@
                 // relevantly affected without the parent channel already having been.
             }
 
-            if (updatedChannel.canBypassDnd() != mCurrentUserHasChannelsBypassingDnd
+            if (updatedChannel.canBypassDnd() != mCurrentUserHasPriorityChannels
                     || channel.getImportance() != updatedChannel.getImportance()) {
                 needsDndChange = true;
                 changed = true;
             }
         }
         if (needsDndChange) {
-            updateCurrentUserHasChannelsBypassingDnd(callingUid, fromSystemOrSystemUi);
+            updateCurrentUserHasPriorityChannels(callingUid, fromSystemOrSystemUi);
         }
         if (changed) {
             if (android.app.Flags.nmBinderPerfCacheChannels()) {
@@ -1550,7 +1548,7 @@
             }
         }
         if (channelBypassedDnd) {
-            updateCurrentUserHasChannelsBypassingDnd(callingUid, fromSystemOrSystemUi);
+            updateCurrentUserHasPriorityChannels(callingUid, fromSystemOrSystemUi);
         }
 
         if (android.app.Flags.nmBinderPerfCacheChannels() && deletedChannel) {
@@ -1745,7 +1743,7 @@
             }
         }
         if (groupBypassedDnd) {
-            updateCurrentUserHasChannelsBypassingDnd(callingUid, fromSystemOrSystemUi);
+            updateCurrentUserHasPriorityChannels(callingUid, fromSystemOrSystemUi);
         }
         if (android.app.Flags.nmBinderPerfCacheChannels()) {
             if (deletedChannels.size() > 0) {
@@ -1906,8 +1904,8 @@
             }
         }
         if (!deletedChannelIds.isEmpty()) {
-            if (mCurrentUserHasChannelsBypassingDnd) {
-                updateCurrentUserHasChannelsBypassingDnd(callingUid, fromSystemOrSystemUi);
+            if (mCurrentUserHasPriorityChannels) {
+                updateCurrentUserHasPriorityChannels(callingUid, fromSystemOrSystemUi);
             }
             if (android.app.Flags.nmBinderPerfCacheChannels()) {
                 invalidateNotificationChannelCache();
@@ -2006,6 +2004,29 @@
     }
 
     /**
+     * Gets all apps for this user that have a nonzero number of channels. This count does not
+     * include deleted channels.
+     */
+    @FlaggedApi(android.app.Flags.FLAG_NM_BINDER_PERF_GET_APPS_WITH_CHANNELS)
+    public @NonNull List<String> getPackagesWithAnyChannels(@UserIdInt int userId) {
+        List<String> pkgs = new ArrayList<>();
+        synchronized (mLock) {
+            for (PackagePreferences p : mPackagePreferences.values()) {
+                if (UserHandle.getUserId(p.uid) != userId) {
+                    continue;
+                }
+                for (NotificationChannel c : p.channels.values()) {
+                    if (!c.isDeleted()) {
+                        pkgs.add(p.pkg);
+                        break;
+                    }
+                }
+            }
+        }
+        return pkgs;
+    }
+
+    /**
      * True for pre-O apps that only have the default channel, or pre O apps that have no
      * channels yet. This method will create the default channel for pre-O apps that don't have it.
      * Should never be true for O+ targeting apps, but that's enforced on boot/when an app
@@ -2075,7 +2096,7 @@
     }
 
     /**
-     * Syncs {@link #mCurrentUserHasChannelsBypassingDnd} with the current user's notification
+     * Syncs {@link #mCurrentUserHasPriorityChannels} with the current user's notification
      * policy before updating. Must be called:
      * <ul>
      *     <li>On system init, after channels and DND configurations are loaded.
@@ -2083,22 +2104,23 @@
      *     <li>If users are removed (the removed user could've been a profile of the current one).
      * </ul>
      */
-    void syncChannelsBypassingDnd() {
-        mCurrentUserHasChannelsBypassingDnd =
+    void syncHasPriorityChannels() {
+        mCurrentUserHasPriorityChannels =
                 (mZenModeHelper.getNotificationPolicy(UserHandle.CURRENT).state
-                        & NotificationManager.Policy.STATE_CHANNELS_BYPASSING_DND) != 0;
+                        & NotificationManager.Policy.STATE_HAS_PRIORITY_CHANNELS) != 0;
 
-        updateCurrentUserHasChannelsBypassingDnd(/* callingUid= */ Process.SYSTEM_UID,
+        updateCurrentUserHasPriorityChannels(/* callingUid= */ Process.SYSTEM_UID,
                 /* fromSystemOrSystemUi= */ true);
     }
 
     /**
      * Updates the user's NotificationPolicy based on whether the current userId has channels
-     * bypassing DND. It should be called whenever a channel is created, updated, or deleted, or
-     * when the current user (or its profiles) change.
+     * marked as "priority" (which might bypass DND, depending on the zen rule details). It should
+     * be called whenever a channel is created, updated, or deleted, or when the current user (or
+     * its profiles) change.
      */
     // TODO: b/368247671 - remove fromSystemOrSystemUi argument when modes_ui is inlined.
-    private void updateCurrentUserHasChannelsBypassingDnd(int callingUid,
+    private void updateCurrentUserHasPriorityChannels(int callingUid,
             boolean fromSystemOrSystemUi) {
         ArraySet<Pair<String, Integer>> candidatePkgs = new ArraySet<>();
 
@@ -2126,13 +2148,13 @@
             }
         }
         boolean haveBypassingApps = candidatePkgs.size() > 0;
-        if (mCurrentUserHasChannelsBypassingDnd != haveBypassingApps) {
-            mCurrentUserHasChannelsBypassingDnd = haveBypassingApps;
+        if (mCurrentUserHasPriorityChannels != haveBypassingApps) {
+            mCurrentUserHasPriorityChannels = haveBypassingApps;
             if (android.app.Flags.modesUi()) {
                 mZenModeHelper.updateHasPriorityChannels(UserHandle.CURRENT,
-                        mCurrentUserHasChannelsBypassingDnd);
+                        mCurrentUserHasPriorityChannels);
             } else {
-                updateZenPolicy(mCurrentUserHasChannelsBypassingDnd, callingUid,
+                updateZenPolicy(mCurrentUserHasPriorityChannels, callingUid,
                         fromSystemOrSystemUi);
             }
         }
@@ -2165,16 +2187,20 @@
                         policy.priorityCategories, policy.priorityCallSenders,
                         policy.priorityMessageSenders, policy.suppressedVisualEffects,
                         (areChannelsBypassingDnd
-                                ? NotificationManager.Policy.STATE_CHANNELS_BYPASSING_DND : 0),
+                                ? NotificationManager.Policy.STATE_HAS_PRIORITY_CHANNELS : 0),
                         policy.priorityConversationSenders),
                 fromSystemOrSystemUi ? ZenModeConfig.ORIGIN_SYSTEM
                         : ZenModeConfig.ORIGIN_APP,
                 callingUid);
     }
 
-    // TODO: b/310620812 - rename to hasPriorityChannels() when modes_api is inlined.
-    public boolean areChannelsBypassingDnd() {
-        return mCurrentUserHasChannelsBypassingDnd;
+    /**
+     * Whether the current user has any channels marked as "priority channels"
+     * ({@link NotificationChannel#canBypassDnd}), but not necessarily whether they are permitted
+     * to bypass the filters set by the current zen policy.
+     */
+    public boolean hasPriorityChannels() {
+        return mCurrentUserHasPriorityChannels;
     }
 
     /**
diff --git a/services/core/java/com/android/server/notification/ZenModeEventLogger.java b/services/core/java/com/android/server/notification/ZenModeEventLogger.java
index fcc5e97..ec9a2db 100644
--- a/services/core/java/com/android/server/notification/ZenModeEventLogger.java
+++ b/services/core/java/com/android/server/notification/ZenModeEventLogger.java
@@ -16,7 +16,7 @@
 
 package com.android.server.notification;
 
-import static android.app.NotificationManager.Policy.STATE_CHANNELS_BYPASSING_DND;
+import static android.app.NotificationManager.Policy.STATE_HAS_PRIORITY_CHANNELS;
 import static android.provider.Settings.Global.ZEN_MODE_OFF;
 import static android.service.notification.NotificationServiceProto.CHANNEL_POLICY_NONE;
 import static android.service.notification.NotificationServiceProto.CHANNEL_POLICY_PRIORITY;
@@ -285,11 +285,10 @@
                 return true;
             }
 
-            if (Flags.modesApi() && hasActiveRuleCountDiff()) {
-                // Rules with INTERRUPTION_FILTER_ALL were always possible but before MODES_API
-                // they were completely useless; now they can apply effects, so we want to log
-                // when they become active/inactive, even though DND itself (as in "notification
-                // blocking") is off.
+            if (hasActiveRuleCountDiff()) {
+                // Rules with INTERRUPTION_FILTER_ALL can apply effects, so we want to log when they
+                // become active/inactive, even though DND itself (as in "notification blocking")
+                // is off.
                 return true;
             }
 
@@ -331,7 +330,7 @@
                 }
             }
 
-            if (Flags.modesApi() && mNewZenMode == ZEN_MODE_OFF) {
+            if (mNewZenMode == ZEN_MODE_OFF) {
                 // If the mode is OFF -> OFF then there cannot be any *effective* change to policy.
                 // (Note that, in theory, a policy diff is impossible since we don't merge the
                 // policies of INTERRUPTION_FILTER_ALL rules; this is a "just in case" check).
@@ -439,24 +438,14 @@
 
         // Determine the number of (automatic & manual) rules active after the change takes place.
         int getNumRulesActive() {
-            if (!Flags.modesApi()) {
-                // If the zen mode has turned off, that means nothing can be active.
-                if (mNewZenMode == ZEN_MODE_OFF) {
-                    return 0;
-                }
-            }
             return numActiveRulesInConfig(mNewConfig);
         }
 
         /**
-         * Return a list of the types of each of the active rules in the configuration.
-         * Only available when {@code MODES_API} is active; otherwise returns an empty list.
+         * Return a list of the types of each of the active rules in the configuration (sorted by
+         * the numerical value of the type, and including duplicates).
          */
         int[] getActiveRuleTypes() {
-            if (!Flags.modesApi()) {
-                return new int[0];
-            }
-
             ArrayList<Integer> activeTypes = new ArrayList<>();
             List<ZenRule> activeRules = activeRulesList(mNewConfig);
             if (activeRules.size() == 0) {
@@ -476,77 +465,10 @@
             return out;
         }
 
-        /**
-         * Return our best guess as to whether the changes observed are due to a user action.
-         * Note that this (before {@code MODES_API}) won't be 100% accurate as we can't necessarily
-         * distinguish between a system uid call indicating "user interacted with Settings" vs "a
-         * system app changed something automatically".
-         */
+        /** Return whether the changes observed are due to a user action. */
         boolean getIsUserAction() {
-            if (Flags.modesApi()) {
-                return mOrigin == ZenModeConfig.ORIGIN_USER_IN_SYSTEMUI
-                        || mOrigin == ZenModeConfig.ORIGIN_USER_IN_APP;
-            }
-
-            // Approach for pre-MODES_API:
-            //   - if manual rule turned on or off, the calling UID is system, and the new manual
-            //     rule does not have an enabler set, guess that this is likely to be a user action.
-            //     This may represent a system app turning on DND automatically, but we guess "user"
-            //     in this case.
-            //         - note that this has a known failure mode of "manual rule turning off
-            //           automatically after the default time runs out". We currently have no way
-            //           of distinguishing this case from a user manually turning off the rule.
-            //         - the reason for checking the enabler field is that a call may look like it's
-            //           coming from a system UID, but if an enabler is set then the request came
-            //           from an external source. "enabler" will be blank when manual rule is turned
-            //           on from Quick Settings or Settings.
-            //   - if an automatic rule's state changes in whether it is "enabled", then
-            //     that is probably a user action.
-            //   - if an automatic rule goes from "not snoozing" to "snoozing", that is probably
-            //     a user action; that means that the user temporarily turned off DND associated
-            //     with that rule.
-            //   - if an automatic rule becomes active but does *not* change in its enabled state
-            //     (covered by a previous case anyway), we guess that this is an automatic change.
-            //   - if a rule is added or removed and the call comes from the system, we guess that
-            //     this is a user action (as system rules can't be added or removed without a user
-            //     action).
-            switch (getChangedRuleType()) {
-                case RULE_TYPE_MANUAL:
-                    // TODO(b/278888961): Distinguish the automatically-turned-off state
-                    return isFromSystemOrSystemUi() && (getNewManualRuleEnabler() == null);
-                case RULE_TYPE_AUTOMATIC:
-                    for (ZenModeDiff.RuleDiff d : getChangedAutomaticRules().values()) {
-                        if (d.wasAdded() || d.wasRemoved()) {
-                            // If the change comes from system, a rule being added/removed indicates
-                            // a likely user action. From an app, it's harder to know for sure.
-                            return isFromSystemOrSystemUi();
-                        }
-                        ZenModeDiff.FieldDiff enabled = d.getDiffForField(
-                                ZenModeDiff.RuleDiff.FIELD_ENABLED);
-                        if (enabled != null && enabled.hasDiff()) {
-                            return true;
-                        }
-                        ZenModeDiff.FieldDiff snoozing = d.getDiffForField(
-                                ZenModeDiff.RuleDiff.FIELD_SNOOZING);
-                        if (snoozing != null && snoozing.hasDiff() && (boolean) snoozing.to()) {
-                            return true;
-                        }
-                    }
-                    // If the change was in an automatic rule and none of the "probably triggered
-                    // by a user" cases apply, then it's probably an automatic change.
-                    return false;
-                case RULE_TYPE_UNKNOWN:
-                default:
-            }
-
-            // If the change wasn't in a rule, but was in the zen policy: consider to be user action
-            // if the calling uid is system
-            if (hasPolicyDiff() || hasChannelsBypassingDiff()) {
-                return mCallingUid == Process.SYSTEM_UID;
-            }
-
-            // don't know, or none of the other things triggered; assume not a user action
-            return false;
+            return mOrigin == ZenModeConfig.ORIGIN_USER_IN_SYSTEMUI
+                    || mOrigin == ZenModeConfig.ORIGIN_USER_IN_APP;
         }
 
         boolean isFromSystemOrSystemUi() {
@@ -587,7 +509,7 @@
          */
         @Nullable
         byte[] getDNDPolicyProto() {
-            if (Flags.modesApi() && mNewZenMode == ZEN_MODE_OFF) {
+            if (mNewZenMode == ZEN_MODE_OFF) {
                 return null;
             }
 
@@ -628,13 +550,10 @@
                                 mNewPolicy.allowMessagesFrom()));
                 proto.write(DNDPolicyProto.ALLOW_CONVERSATIONS_FROM,
                         mNewPolicy.allowConversationsFrom());
-
-                if (Flags.modesApi()) {
-                    proto.write(DNDPolicyProto.ALLOW_CHANNELS,
-                            mNewPolicy.allowPriorityChannels()
-                                    ? CHANNEL_POLICY_PRIORITY
-                                    : CHANNEL_POLICY_NONE);
-                }
+                proto.write(DNDPolicyProto.ALLOW_CHANNELS,
+                        mNewPolicy.allowPriorityChannels()
+                                ? CHANNEL_POLICY_PRIORITY
+                                : CHANNEL_POLICY_NONE);
             } else {
                 Log.wtf(TAG, "attempted to write zen mode log event with null policy");
             }
@@ -648,14 +567,14 @@
          */
         boolean getAreChannelsBypassing() {
             if (mNewPolicy != null) {
-                return (mNewPolicy.state & STATE_CHANNELS_BYPASSING_DND) != 0;
+                return (mNewPolicy.state & STATE_HAS_PRIORITY_CHANNELS) != 0;
             }
             return false;
         }
 
         private boolean hasChannelsBypassingDiff() {
             boolean prevChannelsBypassing = mPrevPolicy != null
-                    ? (mPrevPolicy.state & STATE_CHANNELS_BYPASSING_DND) != 0 : false;
+                    ? (mPrevPolicy.state & STATE_HAS_PRIORITY_CHANNELS) != 0 : false;
             return prevChannelsBypassing != getAreChannelsBypassing();
         }
 
diff --git a/services/core/java/com/android/server/notification/ZenModeFiltering.java b/services/core/java/com/android/server/notification/ZenModeFiltering.java
index bdca555..87ae781 100644
--- a/services/core/java/com/android/server/notification/ZenModeFiltering.java
+++ b/services/core/java/com/android/server/notification/ZenModeFiltering.java
@@ -19,7 +19,6 @@
 import static android.provider.Settings.Global.ZEN_MODE_OFF;
 import static android.service.notification.ZenPolicy.CONVERSATION_SENDERS_ANYONE;
 
-import android.app.Flags;
 import android.app.Notification;
 import android.app.NotificationManager;
 import android.content.ComponentName;
@@ -146,16 +145,12 @@
 
     // Returns whether the record is permitted to bypass DND when the zen mode is
     // ZEN_MODE_IMPORTANT_INTERRUPTIONS. This depends on whether the record's package priority is
-    // marked as PRIORITY_MAX (an indication of it belonging to a priority channel), and, if
-    // the modes_api flag is on, whether the given policy permits priority channels to bypass.
-    // TODO: b/310620812 - simplify when modes_api is inlined.
+    // marked as PRIORITY_MAX (an indication of it belonging to a priority channel), and whether the
+    // given policy permits priority channels to bypass.
     private boolean canRecordBypassDnd(NotificationRecord record,
             NotificationManager.Policy policy) {
         boolean inPriorityChannel = record.getPackagePriority() == Notification.PRIORITY_MAX;
-        if (Flags.modesApi()) {
-            return inPriorityChannel && policy.allowPriorityChannels();
-        }
-        return inPriorityChannel;
+        return inPriorityChannel && policy.allowPriorityChannels();
     }
 
     /**
diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java
index b39b6fd..f7a4d3d 100644
--- a/services/core/java/com/android/server/notification/ZenModeHelper.java
+++ b/services/core/java/com/android/server/notification/ZenModeHelper.java
@@ -326,9 +326,6 @@
      * applied immediately.
      */
     void setDeviceEffectsApplier(@NonNull DeviceEffectsApplier deviceEffectsApplier) {
-        if (!Flags.modesApi()) {
-            return;
-        }
         synchronized (mConfigLock) {
             if (mDeviceEffectsApplier != null) {
                 throw new IllegalStateException("Already set up a DeviceEffectsApplier!");
@@ -350,11 +347,6 @@
         }
     }
 
-    // TODO: b/310620812 - Remove when MODES_API is inlined (no more callers).
-    public void onUserUnlocked(int user) {
-        loadConfigForUser(user, "onUserUnlocked");
-    }
-
     void setPriorityOnlyDndExemptPackages(String[] packages) {
         mPriorityOnlyDndExemptPackages = packages;
     }
@@ -385,21 +377,6 @@
         return NotificationManager.zenModeToInterruptionFilter(mZenMode);
     }
 
-    // TODO: b/310620812 - Remove when MODES_API is inlined (no more callers).
-    public void requestFromListener(ComponentName name, int filter, int callingUid,
-            boolean fromSystemOrSystemUi) {
-        final int newZen = NotificationManager.zenModeFromInterruptionFilter(filter, -1);
-        if (newZen != -1) {
-            // This change is known to be for UserHandle.CURRENT because NLSes for
-            // background users are unbound.
-            setManualZenMode(UserHandle.CURRENT, newZen, null,
-                    fromSystemOrSystemUi ? ORIGIN_SYSTEM : ORIGIN_APP,
-                    /* reason= */ "listener:" + (name != null ? name.flattenToShortString() : null),
-                    /* caller= */ name != null ? name.getPackageName() : null,
-                    callingUid);
-        }
-    }
-
     public void setSuppressedEffects(long suppressedEffects) {
         if (mSuppressedEffects == suppressedEffects) return;
         mSuppressedEffects = suppressedEffects;
@@ -414,33 +391,24 @@
         return mZenMode;
     }
 
-    // TODO: b/310620812 - Make private (or inline) when MODES_API is inlined.
-    public List<ZenRule> getZenRules(UserHandle user, int callingUid) {
-        List<ZenRule> rules = new ArrayList<>();
-        synchronized (mConfigLock) {
-            ZenModeConfig config = getConfigLocked(user);
-            if (config == null) return rules;
-            for (ZenRule rule : config.automaticRules.values()) {
-                if (canManageAutomaticZenRule(rule, callingUid)) {
-                    rules.add(rule);
-                }
-            }
-        }
-        return rules;
-    }
-
     /**
      * Get the list of {@link AutomaticZenRule} instances that the calling package can manage
      * (which means the owned rules for a regular app, and every rule for system callers) together
      * with their ids.
      */
     Map<String, AutomaticZenRule> getAutomaticZenRules(UserHandle user, int callingUid) {
-        List<ZenRule> ruleList = getZenRules(user, callingUid);
-        HashMap<String, AutomaticZenRule> rules = new HashMap<>(ruleList.size());
-        for (ZenRule rule : ruleList) {
-            rules.put(rule.id, zenRuleToAutomaticZenRule(rule));
+        HashMap<String, AutomaticZenRule> rules = new HashMap<>();
+        synchronized (mConfigLock) {
+            ZenModeConfig config = getConfigLocked(user);
+            if (config == null) return rules;
+
+            for (ZenRule rule : config.automaticRules.values()) {
+                if (canManageAutomaticZenRule(rule, callingUid)) {
+                    rules.put(rule.id, zenRuleToAutomaticZenRule(rule));
+                }
+            }
+            return rules;
         }
-        return rules;
     }
 
     public AutomaticZenRule getAutomaticZenRule(UserHandle user, String id, int callingUid) {
@@ -511,9 +479,6 @@
     @GuardedBy("mConfigLock")
     private ZenRule maybeRestoreRemovedRule(ZenModeConfig config, String pkg, ZenRule ruleToAdd,
             AutomaticZenRule azrToAdd, @ConfigOrigin int origin) {
-        if (!Flags.modesApi()) {
-            return ruleToAdd;
-        }
         String deletedKey = ZenModeConfig.deletedRuleKey(ruleToAdd);
         if (deletedKey == null) {
             // Couldn't calculate the deletedRuleKey (condition or pkg null?). This should
@@ -561,9 +526,6 @@
      */
     private static void maybeReplaceDefaultRule(ZenModeConfig config, @Nullable ZenRule oldRule,
             AutomaticZenRule rule) {
-        if (!Flags.modesApi()) {
-            return;
-        }
         if (rule.getType() == AutomaticZenRule.TYPE_BEDTIME
                 && (oldRule == null || oldRule.type != rule.getType())) {
             // Note: we must not verify canManageAutomaticZenRule here, since most likely they
@@ -599,18 +561,10 @@
             }
             ZenModeConfig newConfig = config.copy();
             ZenModeConfig.ZenRule newRule = requireNonNull(newConfig.automaticRules.get(ruleId));
-            if (!Flags.modesApi()) {
-                if (newRule.enabled != automaticZenRule.isEnabled()) {
-                    dispatchOnAutomaticRuleStatusChanged(config.user, newRule.getPkg(), ruleId,
-                            automaticZenRule.isEnabled()
-                                    ? AUTOMATIC_RULE_STATUS_ENABLED
-                                    : AUTOMATIC_RULE_STATUS_DISABLED);
-                }
-            }
 
             boolean updated = populateZenRule(newRule.pkg, automaticZenRule, newConfig, newRule,
                     origin, /* isNew= */ false);
-            if (Flags.modesApi() && !updated) {
+            if (!updated) {
                 // Bail out so we don't have the side effects of updating a rule (i.e. dropping
                 // condition) when no changes happen.
                 return true;
@@ -643,10 +597,6 @@
      */
     void applyGlobalZenModeAsImplicitZenRule(UserHandle user, String callingPkg, int callingUid,
             int zenMode) {
-        if (!android.app.Flags.modesApi()) {
-            Log.wtf(TAG, "applyGlobalZenModeAsImplicitZenRule called with flag off!");
-            return;
-        }
         synchronized (mConfigLock) {
             ZenModeConfig config = getConfigLocked(user);
             if (config == null) {
@@ -712,10 +662,6 @@
      */
     void applyGlobalPolicyAsImplicitZenRule(UserHandle user, String callingPkg, int callingUid,
             NotificationManager.Policy policy) {
-        if (!android.app.Flags.modesApi()) {
-            Log.wtf(TAG, "applyGlobalPolicyAsImplicitZenRule called with flag off!");
-            return;
-        }
         synchronized (mConfigLock) {
             ZenModeConfig config = getConfigLocked(user);
             if (config == null) {
@@ -772,10 +718,6 @@
      */
     @Nullable
     Policy getNotificationPolicyFromImplicitZenRule(UserHandle user, String callingPkg) {
-        if (!android.app.Flags.modesApi()) {
-            Log.wtf(TAG, "getNotificationPolicyFromImplicitZenRule called with flag off!");
-            return getNotificationPolicy(user);
-        }
         synchronized (mConfigLock) {
             ZenModeConfig config = getConfigLocked(user);
             if (config == null) {
@@ -814,7 +756,6 @@
                 .appendPath(pkg)
                 .build();
         rule.enabled = true;
-        rule.modified = false;
         rule.component = null;
         rule.configurationActivity = null;
         return rule;
@@ -918,9 +859,6 @@
 
     private void maybePreserveRemovedRule(ZenModeConfig config, ZenRule ruleToRemove,
             @ConfigOrigin int origin) {
-        if (!Flags.modesApi()) {
-            return;
-        }
         // If an app deletes a previously customized rule, keep it around to preserve
         // the user's customization when/if it's recreated later.
         // We don't try to preserve system-owned rules because their conditionIds (used as
@@ -952,7 +890,7 @@
             if (rule == null || !canManageAutomaticZenRule(rule, callingUid)) {
                 return Condition.STATE_UNKNOWN;
             }
-            if (Flags.modesApi() && Flags.modesUi()) {
+            if (Flags.modesUi()) {
                 return rule.isActive() ? STATE_TRUE : STATE_FALSE;
             } else {
                 // Buggy, does not consider snoozing!
@@ -971,16 +909,9 @@
 
             newConfig = config.copy();
             ZenRule rule = newConfig.automaticRules.get(id);
-            if (Flags.modesApi()) {
-                if (rule != null && canManageAutomaticZenRule(rule, callingUid)) {
-                    setAutomaticZenRuleStateLocked(newConfig, Collections.singletonList(rule),
-                            condition, origin, "setAzrState: " + rule.id, callingUid);
-                }
-            } else {
-                ArrayList<ZenRule> rules = new ArrayList<>();
-                rules.add(rule); // rule may be null and throw NPE in the next method.
-                setAutomaticZenRuleStateLocked(newConfig, rules, condition, origin,
-                        "setAzrState: " + (rule != null ? rule.id : "null!"), callingUid);
+            if (rule != null && canManageAutomaticZenRule(rule, callingUid)) {
+                setAutomaticZenRuleStateLocked(newConfig, Collections.singletonList(rule),
+                        condition, origin, "setAzrState: " + rule.id, callingUid);
             }
         }
     }
@@ -995,13 +926,12 @@
             newConfig = config.copy();
 
             List<ZenRule> matchingRules = findMatchingRules(newConfig, ruleConditionId, condition);
-            if (Flags.modesApi()) {
-                for (int i = matchingRules.size() - 1; i >= 0; i--) {
-                    if (!canManageAutomaticZenRule(matchingRules.get(i), callingUid)) {
-                        matchingRules.remove(i);
-                    }
+            for (int i = matchingRules.size() - 1; i >= 0; i--) {
+                if (!canManageAutomaticZenRule(matchingRules.get(i), callingUid)) {
+                    matchingRules.remove(i);
                 }
             }
+
             setAutomaticZenRuleStateLocked(newConfig, matchingRules, condition, origin,
                     "setAzrStateFromCps: " + ruleConditionId, callingUid);
         }
@@ -1013,7 +943,7 @@
         if (rules == null || rules.isEmpty()) return;
 
         if (!Flags.modesUi()) {
-            if (Flags.modesApi() && condition.source == SOURCE_USER_ACTION) {
+            if (condition.source == SOURCE_USER_ACTION) {
                 origin = ORIGIN_USER_IN_APP; // Although coming from app, it's actually from user.
             }
         }
@@ -1026,7 +956,7 @@
 
     private static void applyConditionAndReconsiderOverride(ZenRule rule, Condition condition,
             int origin) {
-        if (Flags.modesApi() && Flags.modesUi()) {
+        if (Flags.modesUi()) {
             if (isImplicitRuleId(rule.id)) {
                 // Implicit rules do not use overrides, and always apply conditions directly.
                 // This is compatible with the previous behavior (where the package set the
@@ -1173,8 +1103,7 @@
                 // if default rule wasn't user-modified use localized name
                 // instead of previous system name
                 if (currRule != null
-                        && !currRule.modified
-                        && (currRule.zenPolicyUserModifiedFields & AutomaticZenRule.FIELD_NAME) == 0
+                        && (currRule.userModifiedFields & AutomaticZenRule.FIELD_NAME) == 0
                         && !defaultRule.name.equals(currRule.name)) {
                     if (DEBUG) {
                         Slog.d(TAG, "Locale change - updating default zen rule name "
@@ -1184,7 +1113,7 @@
                     updated = true;
                 }
             }
-            if (Flags.modesApi() && Flags.modesUi()) {
+            if (Flags.modesUi()) {
                 for (ZenRule rule : newConfig.automaticRules.values()) {
                     if (SystemZenRules.isSystemOwnedRule(rule)) {
                         updated |= SystemZenRules.updateTriggerDescription(mContext, rule);
@@ -1256,172 +1185,145 @@
     @GuardedBy("mConfigLock")
     private boolean populateZenRule(String pkg, AutomaticZenRule azr, ZenModeConfig config,
             ZenRule rule, @ConfigOrigin int origin, boolean isNew) {
-        if (Flags.modesApi()) {
-            boolean modified = false;
-            // These values can always be edited by the app, so we apply changes immediately.
-            if (isNew) {
-                rule.id = ZenModeConfig.newRuleId();
-                rule.creationTime = mClock.millis();
-                rule.component = azr.getOwner();
-                rule.pkg = pkg;
-                modified = true;
-            }
 
-            // Allow updating the CPS backing system rules (e.g. for custom manual -> schedule)
-            if (Flags.modesUi()
-                    && (origin == ORIGIN_SYSTEM || origin == ORIGIN_USER_IN_SYSTEMUI)
-                    && Objects.equals(rule.pkg, SystemZenRules.PACKAGE_ANDROID)
-                    && !Objects.equals(rule.component, azr.getOwner())) {
-                rule.component = azr.getOwner();
-                modified = true;
-            }
-
-            if (Flags.modesUi()) {
-                if (!azr.isEnabled() && (isNew || rule.enabled)) {
-                    // Creating a rule as disabled, or disabling a previously enabled rule.
-                    // Record whodunit.
-                    rule.disabledOrigin = origin;
-                } else if (azr.isEnabled()) {
-                    // Enabling or previously enabled. Clear disabler.
-                    rule.disabledOrigin = ORIGIN_UNKNOWN;
-                }
-            }
-
-            if (!Objects.equals(rule.conditionId, azr.getConditionId())) {
-                rule.conditionId = azr.getConditionId();
-                modified = true;
-            }
-            // This can be removed when {@link Flags#modesUi} is fully ramped up
-            final boolean isWatch =
-                    mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH);
-            boolean shouldPreserveCondition =
-                    Flags.modesApi()
-                            && (Flags.modesUi() || isWatch)
-                            && !isNew
-                            && origin == ORIGIN_USER_IN_SYSTEMUI
-                            && rule.enabled == azr.isEnabled()
-                            && rule.conditionId != null
-                            && rule.condition != null
-                            && rule.conditionId.equals(rule.condition.id);
-            if (!shouldPreserveCondition) {
-                // Do not update 'modified'. If only this changes we treat it as a no-op updateAZR.
-                rule.condition = null;
-            }
-
-            if (rule.enabled != azr.isEnabled()) {
-                rule.enabled = azr.isEnabled();
-                rule.resetConditionOverride();
-                modified = true;
-            }
-            if (!Objects.equals(rule.configurationActivity, azr.getConfigurationActivity())) {
-                rule.configurationActivity = azr.getConfigurationActivity();
-                modified = true;
-            }
-            if (rule.allowManualInvocation != azr.isManualInvocationAllowed()) {
-                rule.allowManualInvocation = azr.isManualInvocationAllowed();
-                modified = true;
-            }
-            if (!Flags.modesUi()) {
-                String iconResName = drawableResIdToResName(rule.pkg, azr.getIconResId());
-                if (!Objects.equals(rule.iconResName, iconResName)) {
-                    rule.iconResName = iconResName;
-                    modified = true;
-                }
-            }
-            if (!Objects.equals(rule.triggerDescription, azr.getTriggerDescription())) {
-                rule.triggerDescription = azr.getTriggerDescription();
-                modified = true;
-            }
-            if (rule.type != azr.getType()) {
-                rule.type = azr.getType();
-                modified = true;
-            }
-            // TODO: b/310620812 - Remove this once FLAG_MODES_API is inlined.
-            rule.modified = azr.isModified();
-
-            // Name is treated differently than other values:
-            // App is allowed to update name if the name was not modified by the user (even if
-            // other values have been modified). In this way, if the locale of an app changes,
-            // i18n of the rule name can still occur even if the user has customized the rule
-            // contents.
-            String previousName = rule.name;
-            if (isNew || doesOriginAlwaysUpdateValues(origin)
-                    || (rule.userModifiedFields & AutomaticZenRule.FIELD_NAME) == 0) {
-                rule.name = azr.getName();
-                modified |= !Objects.equals(rule.name, previousName);
-            }
-
-            // For the remaining values, rules can always have all values updated if:
-            // * the rule is newly added, or
-            // * the request comes from an origin that can always update values, like the user, or
-            // * the rule has not yet been user modified, and thus can be updated by the app.
-            boolean updateValues = isNew || doesOriginAlwaysUpdateValues(origin)
-                    || rule.canBeUpdatedByApp();
-
-            // For all other values, if updates are not allowed, we discard the update.
-            if (!updateValues) {
-                return modified;
-            }
-
-            // Updates the bitmasks if the origin of the change is the user.
-            boolean updateBitmask = (origin == ORIGIN_USER_IN_SYSTEMUI);
-
-            if (updateBitmask && !TextUtils.equals(previousName, azr.getName())) {
-                rule.userModifiedFields |= AutomaticZenRule.FIELD_NAME;
-            }
-            int newZenMode = NotificationManager.zenModeFromInterruptionFilter(
-                    azr.getInterruptionFilter(), Global.ZEN_MODE_OFF);
-            if (rule.zenMode != newZenMode) {
-                rule.zenMode = newZenMode;
-                if (updateBitmask) {
-                    rule.userModifiedFields |= AutomaticZenRule.FIELD_INTERRUPTION_FILTER;
-                }
-                modified = true;
-            }
-
-            if (Flags.modesUi()) {
-                String iconResName = drawableResIdToResName(rule.pkg, azr.getIconResId());
-                if (!Objects.equals(rule.iconResName, iconResName)) {
-                    rule.iconResName = iconResName;
-                    if (updateBitmask) {
-                        rule.userModifiedFields |= AutomaticZenRule.FIELD_ICON;
-                    }
-                    modified = true;
-                }
-            }
-
-            // Updates the bitmask and values for all policy fields, based on the origin.
-            modified |= updatePolicy(config, rule, azr.getZenPolicy(), updateBitmask, isNew);
-
-            // Updates the bitmask and values for all device effect fields, based on the origin.
-            modified |= updateZenDeviceEffects(rule, azr.getDeviceEffects(),
-                    origin == ORIGIN_APP, updateBitmask);
-
-            return modified;
-        } else {
-            if (rule.enabled != azr.isEnabled()) {
-                rule.resetConditionOverride();
-            }
-            rule.name = azr.getName();
-            rule.condition = null;
-            rule.conditionId = azr.getConditionId();
-            rule.enabled = azr.isEnabled();
-            rule.modified = azr.isModified();
-            rule.zenPolicy = azr.getZenPolicy();
-            rule.zenMode = NotificationManager.zenModeFromInterruptionFilter(
-                    azr.getInterruptionFilter(), Global.ZEN_MODE_OFF);
-            rule.configurationActivity = azr.getConfigurationActivity();
-
-            if (isNew) {
-                rule.id = ZenModeConfig.newRuleId();
-                rule.creationTime = System.currentTimeMillis();
-                rule.component = azr.getOwner();
-                rule.pkg = pkg;
-            }
-
-            // Only the MODES_API path cares about the result, so just return whatever here.
-            return true;
+        boolean modified = false;
+        // These values can always be edited by the app, so we apply changes immediately.
+        if (isNew) {
+            rule.id = ZenModeConfig.newRuleId();
+            rule.creationTime = mClock.millis();
+            rule.component = azr.getOwner();
+            rule.pkg = pkg;
+            modified = true;
         }
+
+        // Allow updating the CPS backing system rules (e.g. for custom manual -> schedule)
+        if (Flags.modesUi()
+                && (origin == ORIGIN_SYSTEM || origin == ORIGIN_USER_IN_SYSTEMUI)
+                && Objects.equals(rule.pkg, SystemZenRules.PACKAGE_ANDROID)
+                && !Objects.equals(rule.component, azr.getOwner())) {
+            rule.component = azr.getOwner();
+            modified = true;
+        }
+
+        if (Flags.modesUi()) {
+            if (!azr.isEnabled() && (isNew || rule.enabled)) {
+                // Creating a rule as disabled, or disabling a previously enabled rule.
+                // Record whodunit.
+                rule.disabledOrigin = origin;
+            } else if (azr.isEnabled()) {
+                // Enabling or previously enabled. Clear disabler.
+                rule.disabledOrigin = ORIGIN_UNKNOWN;
+            }
+        }
+
+        if (!Objects.equals(rule.conditionId, azr.getConditionId())) {
+            rule.conditionId = azr.getConditionId();
+            modified = true;
+        }
+        // This can be removed when {@link Flags#modesUi} is fully ramped up
+        final boolean isWatch =
+                mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH);
+        boolean shouldPreserveCondition =
+                (Flags.modesUi() || isWatch)
+                        && !isNew
+                        && origin == ORIGIN_USER_IN_SYSTEMUI
+                        && rule.enabled == azr.isEnabled()
+                        && rule.conditionId != null
+                        && rule.condition != null
+                        && rule.conditionId.equals(rule.condition.id);
+        if (!shouldPreserveCondition) {
+            // Do not update 'modified'. If only this changes we treat it as a no-op updateAZR.
+            rule.condition = null;
+        }
+
+        if (rule.enabled != azr.isEnabled()) {
+            rule.enabled = azr.isEnabled();
+            rule.resetConditionOverride();
+            modified = true;
+        }
+        if (!Objects.equals(rule.configurationActivity, azr.getConfigurationActivity())) {
+            rule.configurationActivity = azr.getConfigurationActivity();
+            modified = true;
+        }
+        if (rule.allowManualInvocation != azr.isManualInvocationAllowed()) {
+            rule.allowManualInvocation = azr.isManualInvocationAllowed();
+            modified = true;
+        }
+        if (!Flags.modesUi()) {
+            String iconResName = drawableResIdToResName(rule.pkg, azr.getIconResId());
+            if (!Objects.equals(rule.iconResName, iconResName)) {
+                rule.iconResName = iconResName;
+                modified = true;
+            }
+        }
+        if (!Objects.equals(rule.triggerDescription, azr.getTriggerDescription())) {
+            rule.triggerDescription = azr.getTriggerDescription();
+            modified = true;
+        }
+        if (rule.type != azr.getType()) {
+            rule.type = azr.getType();
+            modified = true;
+        }
+
+        // Name is treated differently than other values:
+        // App is allowed to update name if the name was not modified by the user (even if
+        // other values have been modified). In this way, if the locale of an app changes,
+        // i18n of the rule name can still occur even if the user has customized the rule
+        // contents.
+        String previousName = rule.name;
+        if (isNew || doesOriginAlwaysUpdateValues(origin)
+                || (rule.userModifiedFields & AutomaticZenRule.FIELD_NAME) == 0) {
+            rule.name = azr.getName();
+            modified |= !Objects.equals(rule.name, previousName);
+        }
+
+        // For the remaining values, rules can always have all values updated if:
+        // * the rule is newly added, or
+        // * the request comes from an origin that can always update values, like the user, or
+        // * the rule has not yet been user modified, and thus can be updated by the app.
+        boolean updateValues = isNew || doesOriginAlwaysUpdateValues(origin)
+                || rule.canBeUpdatedByApp();
+
+        // For all other values, if updates are not allowed, we discard the update.
+        if (!updateValues) {
+            return modified;
+        }
+
+        // Updates the bitmasks if the origin of the change is the user.
+        boolean updateBitmask = (origin == ORIGIN_USER_IN_SYSTEMUI);
+
+        if (updateBitmask && !TextUtils.equals(previousName, azr.getName())) {
+            rule.userModifiedFields |= AutomaticZenRule.FIELD_NAME;
+        }
+        int newZenMode = NotificationManager.zenModeFromInterruptionFilter(
+                azr.getInterruptionFilter(), Global.ZEN_MODE_OFF);
+        if (rule.zenMode != newZenMode) {
+            rule.zenMode = newZenMode;
+            if (updateBitmask) {
+                rule.userModifiedFields |= AutomaticZenRule.FIELD_INTERRUPTION_FILTER;
+            }
+            modified = true;
+        }
+
+        if (Flags.modesUi()) {
+            String iconResName = drawableResIdToResName(rule.pkg, azr.getIconResId());
+            if (!Objects.equals(rule.iconResName, iconResName)) {
+                rule.iconResName = iconResName;
+                if (updateBitmask) {
+                    rule.userModifiedFields |= AutomaticZenRule.FIELD_ICON;
+                }
+                modified = true;
+            }
+        }
+
+        // Updates the bitmask and values for all policy fields, based on the origin.
+        modified |= updatePolicy(config, rule, azr.getZenPolicy(), updateBitmask, isNew);
+
+        // Updates the bitmask and values for all device effect fields, based on the origin.
+        modified |= updateZenDeviceEffects(rule, azr.getDeviceEffects(),
+                origin == ORIGIN_APP, updateBitmask);
+
+        return modified;
     }
 
     /**
@@ -1629,32 +1531,21 @@
     }
 
     private AutomaticZenRule zenRuleToAutomaticZenRule(ZenRule rule) {
-        AutomaticZenRule azr;
-        if (Flags.modesApi()) {
-            azr = new AutomaticZenRule.Builder(rule.name, rule.conditionId)
-                    .setManualInvocationAllowed(rule.allowManualInvocation)
-                    .setPackage(rule.pkg)
-                    .setCreationTime(rule.creationTime)
-                    .setIconResId(drawableResNameToResId(rule.pkg, rule.iconResName))
-                    .setType(rule.type)
-                    .setZenPolicy(rule.zenPolicy)
-                    .setDeviceEffects(rule.zenDeviceEffects)
-                    .setEnabled(rule.enabled)
-                    .setInterruptionFilter(
-                            NotificationManager.zenModeToInterruptionFilter(rule.zenMode))
-                    .setOwner(rule.component)
-                    .setConfigurationActivity(rule.configurationActivity)
-                    .setTriggerDescription(rule.triggerDescription)
-                    .build();
-        } else {
-            azr = new AutomaticZenRule(rule.name, rule.component,
-                    rule.configurationActivity,
-                    rule.conditionId, rule.zenPolicy,
-                    NotificationManager.zenModeToInterruptionFilter(rule.zenMode),
-                    rule.enabled, rule.creationTime);
-            azr.setPackageName(rule.pkg);
-        }
-        return azr;
+        return new AutomaticZenRule.Builder(rule.name, rule.conditionId)
+                .setManualInvocationAllowed(rule.allowManualInvocation)
+                .setPackage(rule.pkg)
+                .setCreationTime(rule.creationTime)
+                .setIconResId(drawableResNameToResId(rule.pkg, rule.iconResName))
+                .setType(rule.type)
+                .setZenPolicy(rule.zenPolicy)
+                .setDeviceEffects(rule.zenDeviceEffects)
+                .setEnabled(rule.enabled)
+                .setInterruptionFilter(
+                        NotificationManager.zenModeToInterruptionFilter(rule.zenMode))
+                .setOwner(rule.component)
+                .setConfigurationActivity(rule.configurationActivity)
+                .setTriggerDescription(rule.triggerDescription)
+                .build();
     }
 
     // Update only the hasPriorityChannels state (aka areChannelsBypassingDnd) without modifying
@@ -1669,12 +1560,12 @@
             if (config == null) return;
 
             // If it already matches, do nothing
-            if (config.areChannelsBypassingDnd == hasPriorityChannels) {
+            if (config.hasPriorityChannels == hasPriorityChannels) {
                 return;
             }
 
             ZenModeConfig newConfig = config.copy();
-            newConfig.areChannelsBypassingDnd = hasPriorityChannels;
+            newConfig.hasPriorityChannels = hasPriorityChannels;
             // The updated calculation of whether there are priority channels is always done by
             // the system, even if the event causing the calculation had a different origin.
             setConfigLocked(newConfig, null, ORIGIN_SYSTEM, "updateHasPriorityChannels",
@@ -1754,9 +1645,7 @@
                     newRule.zenMode = zenMode;
                     newRule.conditionId = conditionId;
                     newRule.enabler = caller;
-                    if (Flags.modesApi()) {
-                        newRule.allowManualInvocation = true;
-                    }
+                    newRule.allowManualInvocation = true;
                     newConfig.manualRule = newRule;
                 }
             }
@@ -1849,7 +1738,7 @@
             boolean hasDefaultRules = config.automaticRules.containsAll(
                     ZenModeConfig.getDefaultRuleIds());
 
-            long time = Flags.modesApi() ? mClock.millis() : System.currentTimeMillis();
+            long time = mClock.millis();
             if (config.automaticRules != null && config.automaticRules.size() > 0) {
                 for (ZenRule automaticRule : config.automaticRules.values()) {
                     if (forRestore) {
@@ -1863,7 +1752,7 @@
 
                     // Upon upgrading to a version with modes_api enabled, keep all behaviors of
                     // rules with null ZenPolicies explicitly as a copy of the global policy.
-                    if (Flags.modesApi() && config.version < ZenModeConfig.XML_VERSION_MODES_API) {
+                    if (config.version < ZenModeConfig.XML_VERSION_MODES_API) {
                         // Keep the manual ("global") policy that from config.
                         ZenPolicy manualRulePolicy = config.getZenPolicy();
                         if (automaticRule.zenPolicy == null) {
@@ -1877,8 +1766,7 @@
                         }
                     }
 
-                    if (Flags.modesApi() && Flags.modesUi()
-                            && config.version < ZenModeConfig.XML_VERSION_MODES_UI) {
+                    if (Flags.modesUi() && config.version < ZenModeConfig.XML_VERSION_MODES_UI) {
                         // Clear icons from implicit rules. App icons are not suitable for some
                         // surfaces, so juse use a default (the user can select a different one).
                         if (ZenModeConfig.isImplicitRuleId(automaticRule.id)) {
@@ -1904,11 +1792,11 @@
                 reason += ", reset to default rules";
             }
 
-            if (Flags.modesApi() && Flags.modesUi()) {
+            if (Flags.modesUi()) {
                 SystemZenRules.maybeUpgradeRules(mContext, config);
             }
 
-            if (Flags.modesApi() && forRestore) {
+            if (forRestore) {
                 // Note: forBackup doesn't write deletedRules, but just in case.
                 config.deletedRules.clear();
             }
@@ -1995,7 +1883,7 @@
             if (config == null) return;
 
             final ZenModeConfig newConfig = config.copy();
-            if (Flags.modesApi() && !Flags.modesUi()) {
+            if (!Flags.modesUi()) {
                 // Fix for b/337193321 -- propagate changes to notificationPolicy to rules where
                 // the user cannot edit zen policy to emulate the previous "inheritance".
                 ZenPolicy previousPolicy = ZenAdapters.notificationPolicyToZenPolicy(
@@ -2034,14 +1922,13 @@
             final ZenModeConfig newConfig = mConfig.copy();
 
             deleteRulesWithoutOwner(newConfig.automaticRules);
-            if (Flags.modesApi()) {
-                deleteRulesWithoutOwner(newConfig.deletedRules);
-                for (int i = newConfig.deletedRules.size() - 1; i >= 0; i--) {
-                    ZenRule deletedRule = newConfig.deletedRules.valueAt(i);
-                    if (deletedRule.deletionInstant == null
-                            || deletedRule.deletionInstant.isBefore(keptRuleThreshold)) {
-                        newConfig.deletedRules.removeAt(i);
-                    }
+            deleteRulesWithoutOwner(newConfig.deletedRules);
+
+            for (int i = newConfig.deletedRules.size() - 1; i >= 0; i--) {
+                ZenRule deletedRule = newConfig.deletedRules.valueAt(i);
+                if (deletedRule.deletionInstant == null
+                        || deletedRule.deletionInstant.isBefore(keptRuleThreshold)) {
+                    newConfig.deletedRules.removeAt(i);
                 }
             }
 
@@ -2053,7 +1940,7 @@
     }
 
     private void deleteRulesWithoutOwner(ArrayMap<String, ZenRule> ruleList) {
-        long currentTime = Flags.modesApi() ? mClock.millis() : System.currentTimeMillis();
+        long currentTime = mClock.millis();
         if (ruleList != null) {
             for (int i = ruleList.size() - 1; i >= 0; i--) {
                 ZenRule rule = ruleList.valueAt(i);
@@ -2188,7 +2075,7 @@
                 mZenMode, mConfig, mConsolidatedPolicy);
         if (!config.equals(mConfig)) {
             // Schedule broadcasts. Cannot be sent during boot, though.
-            if (Flags.modesApi() && origin != ORIGIN_INIT) {
+            if (origin != ORIGIN_INIT) {
                 for (ZenRule rule : config.automaticRules.values()) {
                     ZenRule original = mConfig.automaticRules.get(rule.id);
                     if (original != null) {
@@ -2295,7 +2182,7 @@
     private void applyCustomPolicy(ZenModeConfig config, ZenPolicy policy, ZenRule rule,
             boolean useManualConfig) {
         if (rule.zenMode == Global.ZEN_MODE_NO_INTERRUPTIONS) {
-            if (Flags.modesApi() && Flags.modesUi()) {
+            if (Flags.modesUi()) {
                 policy.apply(ZenPolicy.getBasePolicyInterruptionFilterNone());
             } else {
                 policy.apply(new ZenPolicy.Builder()
@@ -2304,7 +2191,7 @@
                         .build());
             }
         } else if (rule.zenMode == Global.ZEN_MODE_ALARMS) {
-            if (Flags.modesApi() && Flags.modesUi()) {
+            if (Flags.modesUi()) {
                 policy.apply(ZenPolicy.getBasePolicyInterruptionFilterAlarms());
             } else {
                 policy.apply(new ZenPolicy.Builder()
@@ -2317,22 +2204,17 @@
         } else if (rule.zenPolicy != null) {
             policy.apply(rule.zenPolicy);
         } else {
-            if (Flags.modesApi()) {
-                if (useManualConfig) {
-                    // manual rule is configured using the settings stored directly in ZenModeConfig
-                    policy.apply(config.getZenPolicy());
-                } else {
-                    // under modes_api flag, an active automatic rule with no specified policy
-                    // inherits the device default settings as stored in mDefaultConfig. While the
-                    // rule's policy fields should be set upon creation, this is a fallback to
-                    // catch any that may have fallen through the cracks.
-                    Log.wtf(TAG, "active automatic rule found with no specified policy: " + rule);
-                    policy.apply(Flags.modesUi()
-                            ? mDefaultConfig.getZenPolicy() : config.getZenPolicy());
-                }
-            } else {
-                // active rule with no specified policy inherits the manual rule config settings
+            if (useManualConfig) {
+                // manual rule is configured using the settings stored directly in ZenModeConfig
                 policy.apply(config.getZenPolicy());
+            } else {
+                // An active automatic rule with no specified policy inherits the device default
+                // settings as stored in mDefaultConfig. While the rule's policy fields should be
+                // set upon creation, this is a fallback to catch any that may have fallen through
+                // the cracks.
+                Log.wtf(TAG, "active automatic rule found with no specified policy: " + rule);
+                policy.apply(Flags.modesUi()
+                        ? mDefaultConfig.getZenPolicy() : config.getZenPolicy());
             }
         }
     }
@@ -2346,9 +2228,7 @@
             ZenDeviceEffects.Builder deviceEffectsBuilder = new ZenDeviceEffects.Builder();
             if (mConfig.isManualActive()) {
                 applyCustomPolicy(mConfig, policy, mConfig.manualRule, true);
-                if (Flags.modesApi()) {
-                    deviceEffectsBuilder.add(mConfig.manualRule.zenDeviceEffects);
-                }
+                deviceEffectsBuilder.add(mConfig.manualRule.zenDeviceEffects);
             }
 
             for (ZenRule automaticRule : mConfig.automaticRules.values()) {
@@ -2356,12 +2236,10 @@
                     // Active rules with INTERRUPTION_FILTER_ALL are not included in consolidated
                     // policy. This is relevant in case some other active rule has a more
                     // restrictive INTERRUPTION_FILTER but a more lenient ZenPolicy!
-                    if (!Flags.modesApi() || automaticRule.zenMode != Global.ZEN_MODE_OFF) {
+                    if (automaticRule.zenMode != Global.ZEN_MODE_OFF) {
                         applyCustomPolicy(mConfig, policy, automaticRule, false);
                     }
-                    if (Flags.modesApi()) {
-                        deviceEffectsBuilder.add(automaticRule.zenDeviceEffects);
-                    }
+                    deviceEffectsBuilder.add(automaticRule.zenDeviceEffects);
                 }
             }
 
@@ -2380,40 +2258,35 @@
                 ZenLog.traceSetConsolidatedZenPolicy(mConsolidatedPolicy, reason);
             }
 
-            if (Flags.modesApi()) {
-                // Prevent other rules from applying grayscale if Driving is active (but allow it
-                // if _Driving itself_ wants grayscale).
-                if (Flags.modesUi() && preventZenDeviceEffectsWhileDriving()) {
-                    boolean hasActiveDriving = false;
-                    boolean hasActiveDrivingWithGrayscale = false;
-                    for (ZenRule rule : mConfig.automaticRules.values()) {
-                        if (rule.isActive() && rule.type == TYPE_DRIVING) {
-                            hasActiveDriving = true;
-                            if (rule.zenDeviceEffects != null
-                                    && rule.zenDeviceEffects.shouldDisplayGrayscale()) {
-                                hasActiveDrivingWithGrayscale = true;
-                                break; // Further rules won't affect decision.
-                            }
+            // Prevent other rules from applying grayscale if Driving is active (but allow it
+            // if _Driving itself_ wants grayscale).
+            if (Flags.modesUi() && preventZenDeviceEffectsWhileDriving()) {
+                boolean hasActiveDriving = false;
+                boolean hasActiveDrivingWithGrayscale = false;
+                for (ZenRule rule : mConfig.automaticRules.values()) {
+                    if (rule.isActive() && rule.type == TYPE_DRIVING) {
+                        hasActiveDriving = true;
+                        if (rule.zenDeviceEffects != null
+                                && rule.zenDeviceEffects.shouldDisplayGrayscale()) {
+                            hasActiveDrivingWithGrayscale = true;
+                            break; // Further rules won't affect decision.
                         }
                     }
-                    if (hasActiveDriving && !hasActiveDrivingWithGrayscale) {
-                        deviceEffectsBuilder.setShouldDisplayGrayscale(false);
-                    }
                 }
+                if (hasActiveDriving && !hasActiveDrivingWithGrayscale) {
+                    deviceEffectsBuilder.setShouldDisplayGrayscale(false);
+                }
+            }
 
-                ZenDeviceEffects deviceEffects = deviceEffectsBuilder.build();
-                if (!deviceEffects.equals(mConsolidatedDeviceEffects)) {
-                    mConsolidatedDeviceEffects = deviceEffects;
-                    mHandler.postApplyDeviceEffects(origin);
-                }
+            ZenDeviceEffects deviceEffects = deviceEffectsBuilder.build();
+            if (!deviceEffects.equals(mConsolidatedDeviceEffects)) {
+                mConsolidatedDeviceEffects = deviceEffects;
+                mHandler.postApplyDeviceEffects(origin);
             }
         }
     }
 
     private void applyConsolidatedDeviceEffects(@ConfigOrigin int source) {
-        if (!Flags.modesApi()) {
-            return;
-        }
         DeviceEffectsApplier applier;
         ZenDeviceEffects effects;
         synchronized (mConfigLock) {
@@ -2434,10 +2307,8 @@
      * to the current locale.
      */
     private static void updateDefaultConfig(Context context, ZenModeConfig defaultConfig) {
-        if (Flags.modesApi()) {
-            updateDefaultAutomaticRulePolicies(defaultConfig);
-        }
-        if (Flags.modesApi() && Flags.modesUi()) {
+        updateDefaultAutomaticRulePolicies(defaultConfig);
+        if (Flags.modesUi()) {
             SystemZenRules.maybeUpgradeRules(context, defaultConfig);
         }
         updateRuleStringsForCurrentLocale(context, defaultConfig);
@@ -2453,7 +2324,7 @@
                 rule.name = context.getResources()
                         .getString(R.string.zen_mode_default_every_night_name);
             }
-            if (Flags.modesApi() && Flags.modesUi()) {
+            if (Flags.modesUi()) {
                 SystemZenRules.updateTriggerDescription(context, rule);
             }
         }
@@ -2462,10 +2333,6 @@
     // Updates the policies in the default automatic rules (provided via default XML config) to
     // be fully filled in default values.
     private static void updateDefaultAutomaticRulePolicies(ZenModeConfig defaultConfig) {
-        if (!Flags.modesApi()) {
-            // Should be checked before calling, but just in case.
-            return;
-        }
         ZenPolicy defaultPolicy = defaultConfig.getZenPolicy();
         for (ZenRule rule : defaultConfig.automaticRules.values()) {
             if (ZenModeConfig.getDefaultRuleIds().contains(rule.id) && rule.zenPolicy == null) {
@@ -2611,6 +2478,7 @@
         }
     }
 
+    // TODO: b/368247671 - Delete this method AND default_zen_mode_config.xml when inlining modes_ui
     private ZenModeConfig readDefaultConfig(Resources resources) {
         XmlResourceParser parser = null;
         try {
@@ -2649,7 +2517,7 @@
                 events.add(FrameworkStatsLog.buildStatsEvent(DND_MODE_RULE,
                         /* optional int32 user = 1 */ user,
                         /* optional bool enabled = 2 */ config.isManualActive(),
-                        /* optional bool channels_bypassing = 3 */ config.areChannelsBypassingDnd,
+                        /* optional bool channels_bypassing = 3 */ config.hasPriorityChannels,
                         /* optional LoggedZenMode zen_mode = 4 */ ROOT_CONFIG,
                         /* optional string id = 5 */ "", // empty for root config
                         /* optional int32 uid = 6 */ Process.SYSTEM_UID, // system owns root config
@@ -2924,9 +2792,6 @@
      * ({@link #addAutomaticZenRule}, {@link #removeAutomaticZenRule}, etc, makes sense.
      */
     private static void checkManageRuleOrigin(String method, @ConfigOrigin int origin) {
-        if (!Flags.modesApi()) {
-            return;
-        }
         checkArgument(origin == ORIGIN_APP || origin == ORIGIN_SYSTEM
                         || origin == ORIGIN_USER_IN_SYSTEMUI,
                 "Expected one of ORIGIN_APP, ORIGIN_SYSTEM, or "
@@ -2939,9 +2804,6 @@
      * {@link #setAutomaticZenRuleStateFromConditionProvider} makes sense.
      */
     private static void checkSetRuleStateOrigin(String method, @ConfigOrigin int origin) {
-        if (!Flags.modesApi()) {
-            return;
-        }
         checkArgument(origin == ORIGIN_APP || origin == ORIGIN_USER_IN_APP
                         || origin == ORIGIN_SYSTEM || origin == ORIGIN_USER_IN_SYSTEMUI,
                 "Expected one of ORIGIN_APP, ORIGIN_USER_IN_APP, ORIGIN_SYSTEM, or "
diff --git a/services/core/java/com/android/server/notification/flags.aconfig b/services/core/java/com/android/server/notification/flags.aconfig
index 048f2b6..76cd5c8 100644
--- a/services/core/java/com/android/server/notification/flags.aconfig
+++ b/services/core/java/com/android/server/notification/flags.aconfig
@@ -210,3 +210,10 @@
     purpose: PURPOSE_BUGFIX
   }
 }
+
+flag {
+  name: "managed_services_concurrent_multiuser"
+  namespace: "systemui"
+  description: "Enables ManagedServices to support Concurrent multi user environment"
+  bug: "380297485"
+}
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java
index 55d2508..15688c0 100644
--- a/services/core/java/com/android/server/pm/InstallPackageHelper.java
+++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java
@@ -1021,7 +1021,7 @@
      *
      * Failure at any phase will result in a full failure to install all packages.
      */
-    void installPackagesTraced(List<InstallRequest> requests) {
+    void installPackagesTraced(List<InstallRequest> requests, MoveInfo moveInfo) {
         Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "installPackages");
         boolean success = false;
         final Map<String, Boolean> createdAppId = new ArrayMap<>(requests.size());
@@ -1049,10 +1049,37 @@
         } finally {
             completeInstallProcess(requests, createdAppId, success);
             Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
+            doPostInstall(requests, moveInfo);
             releaseWakeLock(acquireTime, requests.size());
         }
     }
 
+    private void doPostInstall(List<InstallRequest> requests, MoveInfo moveInfo) {
+        for (InstallRequest request : requests) {
+            doPostInstallCleanUp(request, moveInfo);
+        }
+
+        for (InstallRequest request : requests) {
+            restoreAndPostInstall(request);
+        }
+    }
+
+    private void doPostInstallCleanUp(InstallRequest request, MoveInfo moveInfo) {
+        if (moveInfo != null) {
+            if (request.getReturnCode() == PackageManager.INSTALL_SUCCEEDED) {
+                mRemovePackageHelper.cleanUpForMoveInstall(moveInfo.mFromUuid,
+                        moveInfo.mPackageName, moveInfo.mFromCodePath);
+            } else {
+                mRemovePackageHelper.cleanUpForMoveInstall(moveInfo.mToUuid,
+                        moveInfo.mPackageName, moveInfo.mFromCodePath);
+            }
+        } else {
+            if (request.getReturnCode() != PackageManager.INSTALL_SUCCEEDED) {
+                mRemovePackageHelper.removeCodePath(request.getCodeFile());
+            }
+        }
+    }
+
     private long acquireWakeLock(int count) {
         if (!mPm.isSystemReady()) {
             return -1;
diff --git a/services/core/java/com/android/server/pm/InstallingSession.java b/services/core/java/com/android/server/pm/InstallingSession.java
index 6a2bf83..3d8f2bb 100644
--- a/services/core/java/com/android/server/pm/InstallingSession.java
+++ b/services/core/java/com/android/server/pm/InstallingSession.java
@@ -550,31 +550,11 @@
                     cleanUpForFailedInstall(request);
                 }
             }
-        } else {
-            mPm.installPackagesTraced(installRequests);
-
             for (InstallRequest request : installRequests) {
-                doPostInstall(request);
-            }
-        }
-        for (InstallRequest request : installRequests) {
-            mPm.restoreAndPostInstall(request);
-        }
-    }
-
-    private void doPostInstall(InstallRequest request) {
-        if (mMoveInfo != null) {
-            if (request.getReturnCode() == PackageManager.INSTALL_SUCCEEDED) {
-                mPm.cleanUpForMoveInstall(mMoveInfo.mFromUuid,
-                        mMoveInfo.mPackageName, mMoveInfo.mFromCodePath);
-            } else {
-                mPm.cleanUpForMoveInstall(mMoveInfo.mToUuid,
-                        mMoveInfo.mPackageName, mMoveInfo.mFromCodePath);
+                mPm.restoreAndPostInstall(request);
             }
         } else {
-            if (request.getReturnCode() != PackageManager.INSTALL_SUCCEEDED) {
-                mPm.removeCodePath(request.getCodeFile());
-            }
+            mPm.installPackagesTraced(installRequests, mMoveInfo);
         }
     }
 
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 8343935..2464a29 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -8214,8 +8214,8 @@
         return mInstallPackageHelper.enableCompressedPackage(stubPkg, stubPs);
     }
 
-    void installPackagesTraced(List<InstallRequest> requests) {
-        mInstallPackageHelper.installPackagesTraced(requests);
+    void installPackagesTraced(List<InstallRequest> requests, MoveInfo moveInfo) {
+        mInstallPackageHelper.installPackagesTraced(requests, moveInfo);
     }
 
     void restoreAndPostInstall(InstallRequest request) {
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 0aaa0fe..4153cd1 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -1163,6 +1163,15 @@
         }
     }
 
+    private boolean shouldShowHub() {
+        final boolean hubEnabled = Settings.Secure.getIntForUser(
+                mContext.getContentResolver(), Settings.Secure.GLANCEABLE_HUB_ENABLED,
+                1, mCurrentUserId) == 1;
+
+        return mUserManagerInternal.isUserUnlocked(mCurrentUserId) && hubEnabled
+                && mDreamManagerInternal.dreamConditionActive();
+    }
+
     @VisibleForTesting
     void powerPress(long eventTime, int count, int displayId) {
         // SideFPS still needs to know about suppressed power buttons, in case it needs to block
@@ -1261,9 +1270,10 @@
                     // show hub.
                     boolean keyguardAvailable = !mLockPatternUtils.isLockScreenDisabled(
                             mCurrentUserId);
-                    if (mUserManagerInternal.isUserUnlocked(mCurrentUserId) && hubEnabled
-                            && keyguardAvailable && mDreamManagerInternal.dreamConditionActive()) {
-                        // If the hub can be launched, send a message to keyguard.
+                    if (shouldShowHub() && keyguardAvailable) {
+                        // If the hub can be launched, send a message to keyguard. We do not know if
+                        // the hub is already running or not, keyguard handles turning screen off if
+                        // it is.
                         Bundle options = new Bundle();
                         options.putBoolean(EXTRA_TRIGGER_HUB, true);
                         lockNow(options);
@@ -1324,14 +1334,14 @@
      * @param isScreenOn Whether the screen is currently on.
      * @param noDreamAction The action to perform if dreaming is not possible.
      */
-    private void attemptToDreamFromShortPowerButtonPress(
+    private boolean attemptToDreamFromShortPowerButtonPress(
             boolean isScreenOn, Runnable noDreamAction) {
         if (mShortPressOnPowerBehavior != SHORT_PRESS_POWER_DREAM_OR_SLEEP
                 && mShortPressOnPowerBehavior != SHORT_PRESS_POWER_HUB_OR_DREAM_OR_SLEEP) {
             // If the power button behavior isn't one that should be able to trigger the dream, give
             // up.
             noDreamAction.run();
-            return;
+            return false;
         }
 
         final DreamManagerInternal dreamManagerInternal = getDreamManagerInternal();
@@ -1339,7 +1349,7 @@
             Slog.d(TAG, "Can't start dreaming when attempting to dream from short power"
                     + " press (isScreenOn=" + isScreenOn + ")");
             noDreamAction.run();
-            return;
+            return false;
         }
 
         synchronized (mLock) {
@@ -1350,6 +1360,8 @@
         }
 
         dreamManagerInternal.requestDream();
+
+        return true;
     }
 
     /**
@@ -3733,8 +3745,7 @@
                 }
                 break;
             case KeyEvent.KEYCODE_3:
-                if (InputSettings.isAccessibilityBounceKeysFeatureEnabled()
-                        && keyboardA11yShortcutControl()) {
+                if (keyboardA11yShortcutControl()) {
                     if (firstDown && event.isMetaPressed()
                             && event.isAltPressed()) {
                         final boolean bounceKeysEnabled =
@@ -3765,8 +3776,7 @@
                 }
                 break;
             case KeyEvent.KEYCODE_5:
-                if (InputSettings.isAccessibilityStickyKeysFeatureEnabled()
-                        && keyboardA11yShortcutControl()) {
+                if (keyboardA11yShortcutControl()) {
                     if (firstDown && event.isMetaPressed() && event.isAltPressed()) {
                         final boolean stickyKeysEnabled =
                                 InputSettings.isAccessibilityStickyKeysEnabled(
@@ -3780,8 +3790,7 @@
                 }
                 break;
             case KeyEvent.KEYCODE_6:
-                if (InputSettings.isAccessibilitySlowKeysFeatureFlagEnabled()
-                        && keyboardA11yShortcutControl()) {
+                if (keyboardA11yShortcutControl()) {
                     if (firstDown && event.isMetaPressed() && event.isAltPressed()) {
                         final boolean slowKeysEnabled =
                                 InputSettings.isAccessibilitySlowKeysEnabled(mContext);
@@ -6401,6 +6410,17 @@
                 event.getDisplayId(), event.getKeyCode(), "wakeUpFromWakeKey")) {
             return;
         }
+
+        if (!shouldShowHub()
+                && mShortPressOnPowerBehavior == SHORT_PRESS_POWER_HUB_OR_DREAM_OR_SLEEP
+                && event.getKeyCode() == KEYCODE_POWER
+                && attemptToDreamFromShortPowerButtonPress(false, () -> {})) {
+            // In the case that we should wake to dream and successfully initiate dreaming, do not
+            // continue waking up. Doing so will exit the dream state and cause UI to react
+            // accordingly.
+            return;
+        }
+
         wakeUpFromWakeKey(
                 event.getEventTime(),
                 event.getKeyCode(),
diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
index 587447b..9d7e9f5 100644
--- a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
+++ b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
@@ -92,6 +92,8 @@
         public boolean bootCompleted;
         public int screenState;
         public int interactiveState;
+        boolean doKeyguardTimeoutRequested;
+        Bundle doKeyguardTimeoutRequestedOptions;
 
         private void reset() {
             // Assume keyguard is showing and secure until we know for sure. This is here in
@@ -225,6 +227,12 @@
             if (mKeyguardState.dreaming) {
                 mKeyguardService.onDreamingStarted();
             }
+            if (mKeyguardState.doKeyguardTimeoutRequested) {
+                mKeyguardService.doKeyguardTimeout(
+                        mKeyguardState.doKeyguardTimeoutRequestedOptions);
+                mKeyguardState.doKeyguardTimeoutRequested = false;
+                mKeyguardState.doKeyguardTimeoutRequestedOptions = null;
+            }
         }
 
         @Override
@@ -410,6 +418,11 @@
     public void doKeyguardTimeout(Bundle options) {
         if (mKeyguardService != null) {
             mKeyguardService.doKeyguardTimeout(options);
+        } else {
+            mKeyguardState.doKeyguardTimeoutRequested = true;
+            if (options != null) {
+                mKeyguardState.doKeyguardTimeoutRequestedOptions = options;
+            }
         }
     }
 
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index 8fae875..e3eced2 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -3379,7 +3379,7 @@
                 }
                 changed = sleepPowerGroupLocked(powerGroup, time,
                         PowerManager.GO_TO_SLEEP_REASON_INATTENTIVE, Process.SYSTEM_UID);
-            } else if (shouldNapAtBedTimeLocked()) {
+            } else if (shouldNapAtBedTimeLocked(powerGroup)) {
                 changed = dreamPowerGroupLocked(powerGroup, time,
                         Process.SYSTEM_UID, /* allowWake= */ false);
             } else {
@@ -3395,7 +3395,10 @@
      * activity timeout has expired and it's bedtime.
      */
     @GuardedBy("mLock")
-    private boolean shouldNapAtBedTimeLocked() {
+    private boolean shouldNapAtBedTimeLocked(PowerGroup powerGroup) {
+        if (!powerGroup.supportsSandmanLocked()) {
+            return false;
+        }
         return mDreamsActivateOnSleepSetting
                 || (mDreamsActivateOnDockSetting
                         && mDockState != Intent.EXTRA_DOCK_STATE_UNDOCKED)
@@ -3617,9 +3620,10 @@
         if (!mDreamsDisabledByAmbientModeSuppressionConfig) {
             return;
         }
+        final PowerGroup defaultPowerGroup = mPowerGroups.get(Display.DEFAULT_DISPLAY_GROUP);
         if (!isSuppressed && mIsPowered && mDreamsSupportedConfig && mDreamsEnabledSetting
-                && shouldNapAtBedTimeLocked() && isItBedTimeYetLocked(
-                mPowerGroups.get(Display.DEFAULT_DISPLAY_GROUP))) {
+                && shouldNapAtBedTimeLocked(defaultPowerGroup)
+                && isItBedTimeYetLocked(defaultPowerGroup)) {
             napInternal(SystemClock.uptimeMillis(), Process.SYSTEM_UID, /* allowWake= */ true);
         } else if (isSuppressed) {
             mDirty |= DIRTY_SETTINGS;
diff --git a/services/core/java/com/android/server/resources/ResourcesManagerShellCommand.java b/services/core/java/com/android/server/resources/ResourcesManagerShellCommand.java
index a75d110..1773971 100644
--- a/services/core/java/com/android/server/resources/ResourcesManagerShellCommand.java
+++ b/services/core/java/com/android/server/resources/ResourcesManagerShellCommand.java
@@ -88,6 +88,5 @@
         out.println("    Print this help text.");
         out.println("  dump <PROCESS>");
         out.println("    Dump the Resources objects in use as well as the history of Resources");
-
     }
 }
diff --git a/services/core/java/com/android/server/security/AttestationVerificationPeerDeviceVerifier.java b/services/core/java/com/android/server/security/AttestationVerificationPeerDeviceVerifier.java
index dc1f936..82df310 100644
--- a/services/core/java/com/android/server/security/AttestationVerificationPeerDeviceVerifier.java
+++ b/services/core/java/com/android/server/security/AttestationVerificationPeerDeviceVerifier.java
@@ -17,8 +17,8 @@
 package com.android.server.security;
 
 import static android.security.attestationverification.AttestationVerificationManager.FLAG_FAILURE_BOOT_STATE;
-import static android.security.attestationverification.AttestationVerificationManager.FLAG_FAILURE_KEYSTORE_REQUIREMENTS;
 import static android.security.attestationverification.AttestationVerificationManager.FLAG_FAILURE_CERTS;
+import static android.security.attestationverification.AttestationVerificationManager.FLAG_FAILURE_KEYSTORE_REQUIREMENTS;
 import static android.security.attestationverification.AttestationVerificationManager.FLAG_FAILURE_LOCAL_BINDING_REQUIREMENTS;
 import static android.security.attestationverification.AttestationVerificationManager.FLAG_FAILURE_PATCH_LEVEL_DIFF;
 import static android.security.attestationverification.AttestationVerificationManager.FLAG_FAILURE_UNKNOWN;
@@ -47,12 +47,8 @@
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.server.security.AttestationVerificationManagerService.DumpLogger;
 
-import org.json.JSONObject;
-
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
 import java.security.InvalidAlgorithmParameterException;
 import java.security.cert.CertPath;
 import java.security.cert.CertPathValidator;
@@ -60,7 +56,6 @@
 import java.security.cert.Certificate;
 import java.security.cert.CertificateException;
 import java.security.cert.CertificateFactory;
-import java.security.cert.PKIXCertPathChecker;
 import java.security.cert.PKIXParameters;
 import java.security.cert.TrustAnchor;
 import java.security.cert.X509Certificate;
@@ -69,7 +64,6 @@
 import java.time.temporal.ChronoUnit;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
@@ -126,6 +120,7 @@
     private final LocalDate mTestLocalPatchDate;
     private final CertificateFactory mCertificateFactory;
     private final CertPathValidator mCertPathValidator;
+    private final CertificateRevocationStatusManager mCertificateRevocationStatusManager;
     private final DumpLogger mDumpLogger;
 
     AttestationVerificationPeerDeviceVerifier(@NonNull Context context,
@@ -135,6 +130,7 @@
         mCertificateFactory = CertificateFactory.getInstance("X.509");
         mCertPathValidator = CertPathValidator.getInstance("PKIX");
         mTrustAnchors = getTrustAnchors();
+        mCertificateRevocationStatusManager = new CertificateRevocationStatusManager(mContext);
         mRevocationEnabled = true;
         mTestSystemDate = null;
         mTestLocalPatchDate = null;
@@ -150,6 +146,7 @@
         mCertificateFactory = CertificateFactory.getInstance("X.509");
         mCertPathValidator = CertPathValidator.getInstance("PKIX");
         mTrustAnchors = trustAnchors;
+        mCertificateRevocationStatusManager = new CertificateRevocationStatusManager(mContext);
         mRevocationEnabled = revocationEnabled;
         mTestSystemDate = systemDate;
         mTestLocalPatchDate = localPatchDate;
@@ -300,15 +297,18 @@
 
         CertPath certificatePath = mCertificateFactory.generateCertPath(certificates);
         PKIXParameters validationParams = new PKIXParameters(mTrustAnchors);
-        if (mRevocationEnabled) {
-            // Checks Revocation Status List based on
-            // https://developer.android.com/training/articles/security-key-attestation#certificate_status
-            PKIXCertPathChecker checker = new AndroidRevocationStatusListChecker();
-            validationParams.addCertPathChecker(checker);
-        }
         // Do not use built-in revocation status checker.
         validationParams.setRevocationEnabled(false);
         mCertPathValidator.validate(certificatePath, validationParams);
+        if (mRevocationEnabled) {
+            // Checks Revocation Status List based on
+            // https://developer.android.com/training/articles/security-key-attestation#certificate_status
+            // The first certificate is the leaf, which is generated at runtime with the attestation
+            // attributes such as the challenge. It is specific to this attestation instance and
+            // does not need to be checked for revocation.
+            mCertificateRevocationStatusManager.checkRevocationStatus(
+                    new ArrayList<>(certificates.subList(1, certificates.size())));
+        }
     }
 
     private Set<TrustAnchor> getTrustAnchors() throws CertPathValidatorException {
@@ -574,96 +574,6 @@
                 <= maxPatchLevelDiffMonths;
     }
 
-    /**
-     * Checks certificate revocation status.
-     *
-     * Queries status list from android.googleapis.com/attestation/status and checks for
-     * the existence of certificate's serial number. If serial number exists in map, then fail.
-     */
-    private final class AndroidRevocationStatusListChecker extends PKIXCertPathChecker {
-        private static final String TOP_LEVEL_JSON_PROPERTY_KEY = "entries";
-        private static final String STATUS_PROPERTY_KEY = "status";
-        private static final String REASON_PROPERTY_KEY = "reason";
-        private String mStatusUrl;
-        private JSONObject mJsonStatusMap;
-
-        @Override
-        public void init(boolean forward) throws CertPathValidatorException {
-            mStatusUrl = getRevocationListUrl();
-            if (mStatusUrl == null || mStatusUrl.isEmpty()) {
-                throw new CertPathValidatorException(
-                        "R.string.vendor_required_attestation_revocation_list_url is empty.");
-            }
-            // TODO(b/221067843): Update to only pull status map on non critical path and if
-            // out of date (24hrs).
-            mJsonStatusMap = getStatusMap(mStatusUrl);
-        }
-
-        @Override
-        public boolean isForwardCheckingSupported() {
-            return false;
-        }
-
-        @Override
-        public Set<String> getSupportedExtensions() {
-            return null;
-        }
-
-        @Override
-        public void check(Certificate cert, Collection<String> unresolvedCritExts)
-                throws CertPathValidatorException {
-            X509Certificate x509Certificate = (X509Certificate) cert;
-            // The json key is the certificate's serial number converted to lowercase hex.
-            String serialNumber = x509Certificate.getSerialNumber().toString(16);
-
-            if (serialNumber == null) {
-                throw new CertPathValidatorException("Certificate serial number can not be null.");
-            }
-
-            if (mJsonStatusMap.has(serialNumber)) {
-                JSONObject revocationStatus;
-                String status;
-                String reason;
-                try {
-                    revocationStatus = mJsonStatusMap.getJSONObject(serialNumber);
-                    status = revocationStatus.getString(STATUS_PROPERTY_KEY);
-                    reason = revocationStatus.getString(REASON_PROPERTY_KEY);
-                } catch (Throwable t) {
-                    throw new CertPathValidatorException("Unable get properties for certificate "
-                            + "with serial number " + serialNumber);
-                }
-                throw new CertPathValidatorException(
-                        "Invalid certificate with serial number " + serialNumber
-                                + " has status " + status
-                                + " because reason " + reason);
-            }
-        }
-
-        private JSONObject getStatusMap(String stringUrl) throws CertPathValidatorException {
-            URL url;
-            try {
-                url = new URL(stringUrl);
-            } catch (Throwable t) {
-                throw new CertPathValidatorException(
-                        "Unable to get revocation status from " + mStatusUrl, t);
-            }
-
-            try (InputStream inputStream = url.openStream()) {
-                JSONObject statusListJson = new JSONObject(
-                        new String(inputStream.readAllBytes(), UTF_8));
-                return statusListJson.getJSONObject(TOP_LEVEL_JSON_PROPERTY_KEY);
-            } catch (Throwable t) {
-                throw new CertPathValidatorException(
-                        "Unable to parse revocation status from " + mStatusUrl, t);
-            }
-        }
-
-        private String getRevocationListUrl() {
-            return mContext.getResources().getString(
-                    R.string.vendor_required_attestation_revocation_list_url);
-        }
-    }
-
     /* Mutable data class for tracking dump data from verifications. */
     private static class MyDumpData extends AttestationVerificationManagerService.DumpData {
 
diff --git a/services/core/java/com/android/server/security/CertificateRevocationStatusManager.java b/services/core/java/com/android/server/security/CertificateRevocationStatusManager.java
new file mode 100644
index 0000000..4cd4b3b
--- /dev/null
+++ b/services/core/java/com/android/server/security/CertificateRevocationStatusManager.java
@@ -0,0 +1,387 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.security;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import android.app.job.JobInfo;
+import android.app.job.JobScheduler;
+import android.content.ComponentName;
+import android.content.Context;
+import android.net.NetworkCapabilities;
+import android.net.NetworkRequest;
+import android.os.Environment;
+import android.os.PersistableBundle;
+import android.util.Slog;
+
+import com.android.internal.R;
+import com.android.internal.annotations.VisibleForTesting;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.security.cert.CertPathValidatorException;
+import java.security.cert.X509Certificate;
+import java.time.Duration;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeParseException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/** Manages the revocation status of certificates used in remote attestation. */
+class CertificateRevocationStatusManager {
+    private static final String TAG = "AVF_CRL";
+    // Must be unique within system server
+    private static final int JOB_ID = 1737671340;
+    private static final String REVOCATION_STATUS_FILE_NAME = "certificate_revocation_status.txt";
+    private static final String REVOCATION_STATUS_FILE_FIELD_DELIMITER = ",";
+
+    /**
+     * The number of days since last update for which a stored revocation status can be accepted.
+     */
+    @VisibleForTesting static final int MAX_DAYS_SINCE_LAST_CHECK = 30;
+
+    @VisibleForTesting static final int NUM_HOURS_BEFORE_NEXT_CHECK = 24;
+
+    /**
+     * The number of days since issue date for an intermediary certificate to be considered fresh
+     * and not require a revocation list check.
+     */
+    private static final int FRESH_INTERMEDIARY_CERT_DAYS = 70;
+
+    /**
+     * The expected number of days between a certificate's issue date and notBefore date. Used to
+     * infer a certificate's issue date from its notBefore date.
+     */
+    private static final int DAYS_BETWEEN_ISSUE_AND_NOT_BEFORE_DATES = 2;
+
+    private static final String TOP_LEVEL_JSON_PROPERTY_KEY = "entries";
+    private static final Object sFileLock = new Object();
+
+    private final Context mContext;
+    private final String mTestRemoteRevocationListUrl;
+    private final File mTestRevocationStatusFile;
+    private final boolean mShouldScheduleJob;
+
+    CertificateRevocationStatusManager(Context context) {
+        this(context, null, null, true);
+    }
+
+    @VisibleForTesting
+    CertificateRevocationStatusManager(
+            Context context,
+            String testRemoteRevocationListUrl,
+            File testRevocationStatusFile,
+            boolean shouldScheduleJob) {
+        mContext = context;
+        mTestRemoteRevocationListUrl = testRemoteRevocationListUrl;
+        mTestRevocationStatusFile = testRevocationStatusFile;
+        mShouldScheduleJob = shouldScheduleJob;
+    }
+
+    /**
+     * Check the revocation status of the provided {@link X509Certificate}s.
+     *
+     * <p>The provided certificates should have been validated and ordered from leaf to a
+     * certificate issued by the trust anchor, per the convention specified in the javadoc of {@link
+     * java.security.cert.CertPath}.
+     *
+     * @param certificates List of certificates to be checked
+     * @throws CertPathValidatorException if the check failed
+     */
+    void checkRevocationStatus(List<X509Certificate> certificates)
+            throws CertPathValidatorException {
+        if (!needToCheckRevocationStatus(certificates)) {
+            return;
+        }
+        List<String> serialNumbers = new ArrayList<>();
+        for (X509Certificate certificate : certificates) {
+            String serialNumber = certificate.getSerialNumber().toString(16);
+            if (serialNumber == null) {
+                throw new CertPathValidatorException("Certificate serial number cannot be null.");
+            }
+            serialNumbers.add(serialNumber);
+        }
+        try {
+            if (isLastCheckedWithin(Duration.ofHours(NUM_HOURS_BEFORE_NEXT_CHECK), serialNumbers)) {
+                Slog.d(
+                        TAG,
+                        "All certificates have been checked for revocation recently. No need to"
+                                + " check this time.");
+                return;
+            }
+        } catch (IOException ignored) {
+            // Proceed to check the revocation status
+        }
+        try {
+            JSONObject revocationList = fetchRemoteRevocationList();
+            Map<String, Boolean> areCertificatesRevoked = new HashMap<>();
+            for (String serialNumber : serialNumbers) {
+                areCertificatesRevoked.put(serialNumber, revocationList.has(serialNumber));
+            }
+            updateLastRevocationCheckData(areCertificatesRevoked);
+            for (Map.Entry<String, Boolean> entry : areCertificatesRevoked.entrySet()) {
+                if (entry.getValue()) {
+                    throw new CertPathValidatorException(
+                            "Certificate " + entry.getKey() + " has been revoked.");
+                }
+            }
+        } catch (IOException | JSONException ex) {
+            Slog.d(TAG, "Fallback to check stored revocation status", ex);
+            if (ex instanceof IOException && mShouldScheduleJob) {
+                scheduleJobToUpdateStoredDataWithRemoteRevocationList(serialNumbers);
+            }
+            for (X509Certificate certificate : certificates) {
+                // Assume recently issued certificates are not revoked.
+                if (isIssuedWithinDays(certificate, MAX_DAYS_SINCE_LAST_CHECK)) {
+                    String serialNumber = certificate.getSerialNumber().toString(16);
+                    serialNumbers.remove(serialNumber);
+                }
+            }
+            try {
+                if (!isLastCheckedWithin(
+                        Duration.ofDays(MAX_DAYS_SINCE_LAST_CHECK), serialNumbers)) {
+                    throw new CertPathValidatorException(
+                            "Unable to verify the revocation status of one of the certificates "
+                                    + serialNumbers);
+                }
+            } catch (IOException ex2) {
+                throw new CertPathValidatorException(
+                        "Unable to load stored revocation status", ex2);
+            }
+        }
+    }
+
+    private boolean isLastCheckedWithin(Duration lastCheckedWithin, List<String> serialNumbers)
+            throws IOException {
+        Map<String, LocalDateTime> lastRevocationCheckData = getLastRevocationCheckData();
+        for (String serialNumber : serialNumbers) {
+            if (!lastRevocationCheckData.containsKey(serialNumber)
+                    || lastRevocationCheckData
+                            .get(serialNumber)
+                            .isBefore(LocalDateTime.now().minus(lastCheckedWithin))) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private static boolean needToCheckRevocationStatus(
+            List<X509Certificate> certificatesOrderedLeafFirst) {
+        if (certificatesOrderedLeafFirst.isEmpty()) {
+            return false;
+        }
+        // A certificate isn't revoked when it is first issued, so we treat it as checked on its
+        // issue date.
+        if (!isIssuedWithinDays(certificatesOrderedLeafFirst.get(0), MAX_DAYS_SINCE_LAST_CHECK)) {
+            return true;
+        }
+        for (int i = 1; i < certificatesOrderedLeafFirst.size(); i++) {
+            if (!isIssuedWithinDays(
+                    certificatesOrderedLeafFirst.get(i), FRESH_INTERMEDIARY_CERT_DAYS)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private static boolean isIssuedWithinDays(X509Certificate certificate, int days) {
+        LocalDate notBeforeDate =
+                LocalDate.ofInstant(certificate.getNotBefore().toInstant(), ZoneId.systemDefault());
+        LocalDate expectedIssueData =
+                notBeforeDate.plusDays(DAYS_BETWEEN_ISSUE_AND_NOT_BEFORE_DATES);
+        return LocalDate.now().minusDays(days + 1).isBefore(expectedIssueData);
+    }
+
+    void updateLastRevocationCheckDataForAllPreviouslySeenCertificates(
+            JSONObject revocationList, Collection<String> otherCertificatesToCheck) {
+        Set<String> allCertificatesToCheck = new HashSet<>(otherCertificatesToCheck);
+        try {
+            allCertificatesToCheck.addAll(getLastRevocationCheckData().keySet());
+        } catch (IOException ex) {
+            Slog.e(TAG, "Unable to update last check date of stored data.", ex);
+        }
+        Map<String, Boolean> areCertificatesRevoked = new HashMap<>();
+        for (String serialNumber : allCertificatesToCheck) {
+            areCertificatesRevoked.put(serialNumber, revocationList.has(serialNumber));
+        }
+        updateLastRevocationCheckData(areCertificatesRevoked);
+    }
+
+    /**
+     * Update the last revocation check data stored on this device.
+     *
+     * @param areCertificatesRevoked A Map whose keys are certificate serial numbers and values are
+     *     whether that certificate has been revoked
+     */
+    void updateLastRevocationCheckData(Map<String, Boolean> areCertificatesRevoked) {
+        LocalDateTime now = LocalDateTime.now();
+        synchronized (sFileLock) {
+            Map<String, LocalDateTime> lastRevocationCheckData;
+            try {
+                lastRevocationCheckData = getLastRevocationCheckData();
+            } catch (IOException ex) {
+                Slog.e(TAG, "Unable to updateLastRevocationCheckData", ex);
+                return;
+            }
+            for (Map.Entry<String, Boolean> entry : areCertificatesRevoked.entrySet()) {
+                if (entry.getValue()) {
+                    lastRevocationCheckData.remove(entry.getKey());
+                } else {
+                    lastRevocationCheckData.put(entry.getKey(), now);
+                }
+            }
+            storeLastRevocationCheckData(lastRevocationCheckData);
+        }
+    }
+
+    Map<String, LocalDateTime> getLastRevocationCheckData() throws IOException {
+        Map<String, LocalDateTime> data = new HashMap<>();
+        File dataFile = getLastRevocationCheckDataFile();
+        synchronized (sFileLock) {
+            if (!dataFile.exists()) {
+                return data;
+            }
+            String dataString;
+            try (FileInputStream in = new FileInputStream(dataFile)) {
+                dataString = new String(in.readAllBytes(), UTF_8);
+            }
+            for (String line : dataString.split(System.lineSeparator())) {
+                String[] elements = line.split(REVOCATION_STATUS_FILE_FIELD_DELIMITER);
+                if (elements.length != 2) {
+                    continue;
+                }
+                try {
+                    data.put(elements[0], LocalDateTime.parse(elements[1]));
+                } catch (DateTimeParseException ex) {
+                    Slog.e(
+                            TAG,
+                            "Unable to parse last checked LocalDateTime from file. Deleting the"
+                                    + " potentially corrupted file.",
+                            ex);
+                    dataFile.delete();
+                    return data;
+                }
+            }
+        }
+        return data;
+    }
+
+    @VisibleForTesting
+    void storeLastRevocationCheckData(Map<String, LocalDateTime> lastRevocationCheckData) {
+        StringBuilder dataStringBuilder = new StringBuilder();
+        for (Map.Entry<String, LocalDateTime> entry : lastRevocationCheckData.entrySet()) {
+            dataStringBuilder
+                    .append(entry.getKey())
+                    .append(REVOCATION_STATUS_FILE_FIELD_DELIMITER)
+                    .append(entry.getValue())
+                    .append(System.lineSeparator());
+        }
+        synchronized (sFileLock) {
+            try (FileOutputStream fileOutputStream =
+                    new FileOutputStream(getLastRevocationCheckDataFile())) {
+                fileOutputStream.write(dataStringBuilder.toString().getBytes(UTF_8));
+                Slog.d(TAG, "Successfully stored revocation status data.");
+            } catch (IOException ex) {
+                Slog.e(TAG, "Failed to store revocation status data.", ex);
+            }
+        }
+    }
+
+    private File getLastRevocationCheckDataFile() {
+        if (mTestRevocationStatusFile != null) {
+            return mTestRevocationStatusFile;
+        }
+        return new File(Environment.getDataSystemDirectory(), REVOCATION_STATUS_FILE_NAME);
+    }
+
+    private void scheduleJobToUpdateStoredDataWithRemoteRevocationList(List<String> serialNumbers) {
+        JobScheduler jobScheduler = mContext.getSystemService(JobScheduler.class);
+        if (jobScheduler == null) {
+            Slog.e(TAG, "Unable to get job scheduler.");
+            return;
+        }
+        Slog.d(TAG, "Scheduling job to fetch remote CRL.");
+        PersistableBundle extras = new PersistableBundle();
+        extras.putStringArray(
+                UpdateCertificateRevocationStatusJobService.EXTRA_KEY_CERTIFICATES_TO_CHECK,
+                serialNumbers.toArray(new String[0]));
+        jobScheduler.schedule(
+                new JobInfo.Builder(
+                                JOB_ID,
+                                new ComponentName(
+                                        mContext,
+                                        UpdateCertificateRevocationStatusJobService.class))
+                        .setExtras(extras)
+                        .setRequiredNetwork(
+                                new NetworkRequest.Builder()
+                                        .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
+                                        .build())
+                        .build());
+    }
+
+    /**
+     * Fetches the revocation list from the URL specified in
+     * R.string.vendor_required_attestation_revocation_list_url
+     *
+     * @return The remote revocation list entries in a JSONObject
+     * @throws CertPathValidatorException if the URL is not defined or is malformed.
+     * @throws IOException if the URL is valid but the fetch failed.
+     * @throws JSONException if the revocation list content cannot be parsed
+     */
+    JSONObject fetchRemoteRevocationList()
+            throws CertPathValidatorException, IOException, JSONException {
+        String urlString = getRemoteRevocationListUrl();
+        if (urlString == null || urlString.isEmpty()) {
+            throw new CertPathValidatorException(
+                    "R.string.vendor_required_attestation_revocation_list_url is empty.");
+        }
+        URL url;
+        try {
+            url = new URL(urlString);
+        } catch (MalformedURLException ex) {
+            throw new CertPathValidatorException("Unable to parse the URL " + urlString, ex);
+        }
+        byte[] revocationListBytes;
+        try (InputStream inputStream = url.openStream()) {
+            revocationListBytes = inputStream.readAllBytes();
+        }
+        JSONObject revocationListJson = new JSONObject(new String(revocationListBytes, UTF_8));
+        return revocationListJson.getJSONObject(TOP_LEVEL_JSON_PROPERTY_KEY);
+    }
+
+    private String getRemoteRevocationListUrl() {
+        if (mTestRemoteRevocationListUrl != null) {
+            return mTestRemoteRevocationListUrl;
+        }
+        return mContext.getResources()
+                .getString(R.string.vendor_required_attestation_revocation_list_url);
+    }
+}
diff --git a/services/core/java/com/android/server/security/FileIntegrityService.java b/services/core/java/com/android/server/security/FileIntegrityService.java
index bfd86d7..9f9a980 100644
--- a/services/core/java/com/android/server/security/FileIntegrityService.java
+++ b/services/core/java/com/android/server/security/FileIntegrityService.java
@@ -54,11 +54,6 @@
             super(PermissionEnforcer.fromContext(context));
         }
 
-        @Override
-        public boolean isApkVeritySupported() {
-            return VerityUtils.isFsVeritySupported();
-        }
-
         private void checkCallerPackageName(String packageName) {
             final int callingUid = Binder.getCallingUid();
             final int callingUserId = UserHandle.getUserId(callingUid);
diff --git a/services/core/java/com/android/server/security/UpdateCertificateRevocationStatusJobService.java b/services/core/java/com/android/server/security/UpdateCertificateRevocationStatusJobService.java
new file mode 100644
index 0000000..768c812
--- /dev/null
+++ b/services/core/java/com/android/server/security/UpdateCertificateRevocationStatusJobService.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.security;
+
+import android.app.job.JobParameters;
+import android.app.job.JobService;
+import android.util.Slog;
+
+import org.json.JSONObject;
+
+import java.util.Arrays;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/** A {@link JobService} that fetches the certificate revocation list from a remote location. */
+public class UpdateCertificateRevocationStatusJobService extends JobService {
+
+    static final String EXTRA_KEY_CERTIFICATES_TO_CHECK =
+            "com.android.server.security.extra.CERTIFICATES_TO_CHECK";
+    private static final String TAG = "AVF_CRL";
+    private ExecutorService mExecutorService;
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        mExecutorService = Executors.newSingleThreadExecutor();
+    }
+
+    @Override
+    public boolean onStartJob(JobParameters params) {
+        mExecutorService.execute(
+                () -> {
+                    try {
+                        CertificateRevocationStatusManager certificateRevocationStatusManager =
+                                new CertificateRevocationStatusManager(this);
+                        Slog.d(TAG, "Starting to fetch remote CRL from job service.");
+                        JSONObject revocationList =
+                                certificateRevocationStatusManager.fetchRemoteRevocationList();
+                        String[] certificatesToCheckFromJobParams =
+                                params.getExtras().getStringArray(EXTRA_KEY_CERTIFICATES_TO_CHECK);
+                        if (certificatesToCheckFromJobParams == null) {
+                            Slog.e(TAG, "Extras not found: " + EXTRA_KEY_CERTIFICATES_TO_CHECK);
+                            return;
+                        }
+                        certificateRevocationStatusManager
+                                .updateLastRevocationCheckDataForAllPreviouslySeenCertificates(
+                                        revocationList,
+                                        Arrays.asList(certificatesToCheckFromJobParams));
+                    } catch (Throwable t) {
+                        Slog.e(TAG, "Unable to update the stored revocation status.", t);
+                    }
+                    jobFinished(params, false);
+                });
+        return true;
+    }
+
+    @Override
+    public boolean onStopJob(JobParameters params) {
+        return false;
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        mExecutorService.shutdown();
+    }
+}
diff --git a/services/core/java/com/android/server/security/intrusiondetection/DataAggregator.java b/services/core/java/com/android/server/security/intrusiondetection/DataAggregator.java
index 687442b..cdeacaa 100644
--- a/services/core/java/com/android/server/security/intrusiondetection/DataAggregator.java
+++ b/services/core/java/com/android/server/security/intrusiondetection/DataAggregator.java
@@ -62,7 +62,7 @@
     /** Initialize DataSources */
     private void initialize() {
         mDataSources.add(new SecurityLogSource(mContext, this));
-        mDataSources.add(new NetworkLogSource(mContext, this));
+        mDataSources.add(new NetworkLogSource(this));
     }
 
     /**
diff --git a/services/core/java/com/android/server/security/intrusiondetection/NetworkLogSource.java b/services/core/java/com/android/server/security/intrusiondetection/NetworkLogSource.java
index f303a58..fe0cf80 100644
--- a/services/core/java/com/android/server/security/intrusiondetection/NetworkLogSource.java
+++ b/services/core/java/com/android/server/security/intrusiondetection/NetworkLogSource.java
@@ -18,7 +18,6 @@
 
 import android.app.admin.ConnectEvent;
 import android.app.admin.DnsEvent;
-import android.content.Context;
 import android.content.pm.PackageManagerInternal;
 import android.net.IIpConnectivityMetrics;
 import android.net.INetdEventCallback;
@@ -44,8 +43,7 @@
     private IIpConnectivityMetrics mIpConnectivityMetrics;
     private long mId;
 
-    public NetworkLogSource(Context context, DataAggregator dataAggregator)
-            throws SecurityException {
+    public NetworkLogSource(DataAggregator dataAggregator) throws SecurityException {
         mDataAggregator = dataAggregator;
         mPm = LocalServices.getService(PackageManagerInternal.class);
         mId = 0;
diff --git a/services/core/java/com/android/server/security/intrusiondetection/SecurityLogSource.java b/services/core/java/com/android/server/security/intrusiondetection/SecurityLogSource.java
index 142094c..7501799 100644
--- a/services/core/java/com/android/server/security/intrusiondetection/SecurityLogSource.java
+++ b/services/core/java/com/android/server/security/intrusiondetection/SecurityLogSource.java
@@ -19,14 +19,15 @@
 import android.Manifest.permission;
 import android.annotation.RequiresPermission;
 import android.app.admin.DevicePolicyManager;
+import android.app.admin.DevicePolicyManagerInternal;
 import android.app.admin.SecurityLog.SecurityEvent;
 import android.content.Context;
 import android.security.intrusiondetection.IntrusionDetectionEvent;
 import android.util.Slog;
 
+import com.android.server.LocalServices;
+
 import java.util.List;
-import java.util.concurrent.Executor;
-import java.util.concurrent.Executors;
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
 
@@ -36,13 +37,13 @@
 
     private SecurityEventCallback mEventCallback;
     private DevicePolicyManager mDpm;
-    private Executor mExecutor;
+    private DevicePolicyManagerInternal mDpmInternal;
     private DataAggregator mDataAggregator;
 
     public SecurityLogSource(Context context, DataAggregator dataAggregator) {
         mDataAggregator = dataAggregator;
         mDpm = context.getSystemService(DevicePolicyManager.class);
-        mExecutor = Executors.newSingleThreadExecutor();
+        mDpmInternal = LocalServices.getService(DevicePolicyManagerInternal.class);
         mEventCallback = new SecurityEventCallback();
     }
 
@@ -50,12 +51,13 @@
     @RequiresPermission(permission.MANAGE_DEVICE_POLICY_AUDIT_LOGGING)
     public void enable() {
         enableAuditLog();
-        mDpm.setAuditLogEventCallback(mExecutor, mEventCallback);
+        mDpmInternal.setInternalEventsCallback(mEventCallback);
     }
 
     @Override
     @RequiresPermission(permission.MANAGE_DEVICE_POLICY_AUDIT_LOGGING)
     public void disable() {
+        mDpmInternal.setInternalEventsCallback(null);
         disableAuditLog();
     }
 
@@ -82,10 +84,11 @@
 
         @Override
         public void accept(List<SecurityEvent> events) {
-            if (events.size() == 0) {
+            if (events == null || events.size() == 0) {
                 Slog.w(TAG, "No events received; caller may not be authorized");
                 return;
             }
+
             List<IntrusionDetectionEvent> intrusionDetectionEvents =
                     events.stream()
                             .filter(event -> event != null)
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 7f2c68f..889b494 100644
--- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
+++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
@@ -3661,16 +3661,17 @@
 
                     if (!packageNames.isEmpty()) {
                         for (String packageName : packageNames) {
-                            PackageInfo pkg;
+                            int uid = INVALID_UID;
                             try {
-                                pkg = pm.getPackageInfoAsUser(packageName, 0, userId);
+                                PackageInfo pkg = pm.getPackageInfoAsUser(packageName, 0, userId);
+                                uid = pkg.applicationInfo.uid;
                             } catch (PackageManager.NameNotFoundException e) {
-                                Slog.w(TAG, "Role holder " + packageName + " not found");
-                                return StatsManager.PULL_SKIP;
+                                Slog.w(TAG, "Role holder " + packageName + " not found for user "
+                                        + userId);
                             }
 
                             pulledData.add(FrameworkStatsLog.buildStatsEvent(
-                                    atomTag, pkg.applicationInfo.uid, packageName, roleName));
+                                    atomTag, uid, packageName, roleName));
                         }
                     } else {
                         // Ensure that roles set to None are logged with an empty state.
@@ -3679,6 +3680,9 @@
                     }
                 }
             }
+        } catch (Throwable t) {
+            Log.e(TAG, "Could not read role holders", t);
+            return StatsManager.PULL_SKIP;
         } finally {
             Binder.restoreCallingIdentity(callingToken);
         }
diff --git a/services/core/java/com/android/server/updates/CertPinInstallReceiver.java b/services/core/java/com/android/server/updates/CertPinInstallReceiver.java
index c03fbc3..250e99b 100644
--- a/services/core/java/com/android/server/updates/CertPinInstallReceiver.java
+++ b/services/core/java/com/android/server/updates/CertPinInstallReceiver.java
@@ -16,9 +16,19 @@
 
 package com.android.server.updates;
 
+import android.content.Context;
+import android.content.Intent;
+
 public class CertPinInstallReceiver extends ConfigUpdateInstallReceiver {
 
     public CertPinInstallReceiver() {
         super("/data/misc/keychain/", "pins", "metadata/", "version");
     }
+
+    @Override
+    public void onReceive(final Context context, final Intent intent) {
+        if (!com.android.server.flags.Flags.certpininstallerRemoval()) {
+            super.onReceive(context, intent);
+        }
+    }
 }
diff --git a/services/core/java/com/android/server/wearable/WearableSensingManagerPerUserService.java b/services/core/java/com/android/server/wearable/WearableSensingManagerPerUserService.java
index 3958169..d06827a 100644
--- a/services/core/java/com/android/server/wearable/WearableSensingManagerPerUserService.java
+++ b/services/core/java/com/android/server/wearable/WearableSensingManagerPerUserService.java
@@ -273,6 +273,9 @@
 
                                     @Override
                                     public void onError() {
+                                        synchronized (mLock) {
+                                            ensureRemoteServiceInitiated();
+                                        }
                                         synchronized (mSecureChannelLock) {
                                             if (mSecureChannel != null
                                                     && mSecureChannel
diff --git a/services/core/java/com/android/server/wearable/WearableSensingSecureChannel.java b/services/core/java/com/android/server/wearable/WearableSensingSecureChannel.java
index a16ff51..9f14ab7 100644
--- a/services/core/java/com/android/server/wearable/WearableSensingSecureChannel.java
+++ b/services/core/java/com/android/server/wearable/WearableSensingSecureChannel.java
@@ -156,6 +156,7 @@
                     new AssociationRequest.Builder()
                             .setDisplayName(CDM_ASSOCIATION_DISPLAY_NAME)
                             .setSelfManaged(true)
+                            .setDeviceProfile(AssociationRequest.DEVICE_PROFILE_WEARABLE_SENSING)
                             .build(),
                     mLightWeightExecutor,
                     new CompanionDeviceManager.Callback() {
@@ -195,7 +196,8 @@
             mCompanionDeviceManager.attachSystemDataTransport(
                     associationId,
                     new AutoCloseInputStream(mUnderlyingTransport),
-                    new AutoCloseOutputStream(mUnderlyingTransport));
+                    new AutoCloseOutputStream(mUnderlyingTransport),
+                    CompanionDeviceManager.TRANSPORT_FLAG_EXTEND_PATCH_DIFF);
         }
     }
 
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index d84016b..c37b5a0 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -46,9 +46,6 @@
 import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
 import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
 import static android.app.WindowConfiguration.activityTypeToString;
-import static android.app.admin.DevicePolicyResources.Drawables.Source.PROFILE_SWITCH_ANIMATION;
-import static android.app.admin.DevicePolicyResources.Drawables.Style.OUTLINE;
-import static android.app.admin.DevicePolicyResources.Drawables.WORK_PROFILE_ICON;
 import static android.content.Context.CONTEXT_RESTRICTED;
 import static android.content.Intent.ACTION_MAIN;
 import static android.content.Intent.CATEGORY_HOME;
@@ -113,7 +110,6 @@
 import static android.view.WindowManager.PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED;
 import static android.view.WindowManager.PROPERTY_ALLOW_UNTRUSTED_ACTIVITY_EMBEDDING_STATE_SHARING;
 import static android.view.WindowManager.TRANSIT_CLOSE;
-import static android.view.WindowManager.TRANSIT_FLAG_OPEN_BEHIND;
 import static android.view.WindowManager.TRANSIT_OLD_UNSET;
 import static android.view.WindowManager.TRANSIT_RELAUNCH;
 import static android.view.WindowManager.hasWindowExtensionsEnabled;
@@ -190,7 +186,6 @@
 import static com.android.server.wm.ActivityRecordProto.STARTING_MOVED;
 import static com.android.server.wm.ActivityRecordProto.STARTING_WINDOW;
 import static com.android.server.wm.ActivityRecordProto.STATE;
-import static com.android.server.wm.ActivityRecordProto.THUMBNAIL;
 import static com.android.server.wm.ActivityRecordProto.TRANSLUCENT;
 import static com.android.server.wm.ActivityRecordProto.VISIBLE;
 import static com.android.server.wm.ActivityRecordProto.VISIBLE_REQUESTED;
@@ -266,7 +261,6 @@
 import android.app.ResultInfo;
 import android.app.WaitResult;
 import android.app.WindowConfiguration;
-import android.app.admin.DevicePolicyManager;
 import android.app.assist.ActivityId;
 import android.app.compat.CompatChanges;
 import android.app.servertransaction.ActivityConfigurationChangeItem;
@@ -301,7 +295,6 @@
 import android.graphics.PixelFormat;
 import android.graphics.Point;
 import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
 import android.gui.DropInputMode;
 import android.hardware.HardwareBuffer;
 import android.net.Uri;
@@ -334,7 +327,6 @@
 import android.view.InputApplicationHandle;
 import android.view.RemoteAnimationAdapter;
 import android.view.RemoteAnimationDefinition;
-import android.view.RemoteAnimationTarget;
 import android.view.SurfaceControl;
 import android.view.SurfaceControl.Transaction;
 import android.view.WindowInsets;
@@ -342,7 +334,6 @@
 import android.view.WindowManager;
 import android.view.WindowManager.LayoutParams;
 import android.view.WindowManager.TransitionOldType;
-import android.view.animation.Animation;
 import android.window.ActivityWindowInfo;
 import android.window.ITaskFragmentOrganizer;
 import android.window.RemoteTransition;
@@ -381,7 +372,6 @@
 import com.android.server.wm.ActivityMetricsLogger.TransitionInfoSnapshot;
 import com.android.server.wm.SurfaceAnimator.AnimationType;
 import com.android.server.wm.WindowManagerService.H;
-import com.android.server.wm.utils.InsetUtils;
 import com.android.window.flags.Flags;
 
 import dalvik.annotation.optimization.NeverCompile;
@@ -658,8 +648,6 @@
 
     private RemoteAnimationDefinition mRemoteAnimationDefinition;
 
-    AnimatingActivityRegistry mAnimatingActivityRegistry;
-
     // Set to the previous Task parent of the ActivityRecord when it is reparented to a new Task
     // due to picture-in-picture. This gets cleared whenever this activity or the Task
     // it references to gets removed. This should also be cleared when we move out of pip.
@@ -856,12 +844,6 @@
     })
     @interface SplashScreenBehavior { }
 
-    // Force an app transition to be ran in the case the visibility of the app did not change.
-    // We use this for the case of moving a Root Task to the back with multiple activities, and the
-    // top activity enters PIP; the bottom activity's visibility stays the same, but we need to
-    // run the transition.
-    boolean mRequestForceTransition;
-
     boolean mEnteringAnimation;
     boolean mOverrideTaskTransition;
     boolean mDismissKeyguardIfInsecure;
@@ -1586,9 +1568,6 @@
             }
         }
         final Task rootTask = getRootTask();
-
-        updateAnimatingActivityRegistry();
-
         if (task == mLastParentBeforePip && task != null) {
             // Notify the TaskFragmentOrganizer that the activity is reparented back from pip.
             mAtmService.mWindowOrganizerController.mTaskFragmentOrganizerController
@@ -1690,20 +1669,6 @@
         return !organizedTaskFragment.isAllowedToEmbedActivityInTrustedMode(this);
     }
 
-    void updateAnimatingActivityRegistry() {
-        final Task rootTask = getRootTask();
-        final AnimatingActivityRegistry registry = rootTask != null
-                ? rootTask.getAnimatingActivityRegistry()
-                : null;
-
-        // If we reparent, make sure to remove ourselves from the old animation registry.
-        if (mAnimatingActivityRegistry != null && mAnimatingActivityRegistry != registry) {
-            mAnimatingActivityRegistry.notifyFinished(this);
-        }
-
-        mAnimatingActivityRegistry = registry;
-    }
-
     boolean canAutoEnterPip() {
         // beforeStopping=false since the actual pip-ing will take place after startPausing()
         final boolean activityCanPip = checkEnterPictureInPictureState(
@@ -1788,7 +1753,6 @@
         if (prevDc.mOpeningApps.remove(this)) {
             // Transfer opening transition to new display.
             mDisplayContent.mOpeningApps.add(this);
-            mDisplayContent.transferAppTransitionFrom(prevDc);
             mDisplayContent.executeAppTransition();
         }
 
@@ -4631,12 +4595,6 @@
                 }
             }
 
-            // In this case, the starting icon has already been displayed, so start
-            // letting windows get shown immediately without any more transitions.
-            if (fromActivity.mVisible) {
-                mDisplayContent.mSkipAppTransitionAnimation = true;
-            }
-
             ProtoLog.v(WM_DEBUG_STARTING_WINDOW, "Moving existing starting %s"
                     + " from %s to %s", tStartingWindow, fromActivity, this);
 
@@ -4734,8 +4692,6 @@
             return true;
         }
 
-        // TODO: Transfer thumbnail
-
         return false;
     }
 
@@ -5667,76 +5623,17 @@
             mTransitionController.mValidateCommitVis.add(this);
             return;
         }
-        // If we are preparing an app transition, then delay changing
-        // the visibility of this token until we execute that transition.
-        if (deferCommitVisibilityChange(visible)) {
-            return;
-        }
 
         commitVisibility(visible, true /* performLayout */);
         updateReportedVisibilityLocked();
     }
 
-    /**
-     * Returns {@code true} if this activity is either added to opening-apps or closing-apps.
-     * Then its visibility will be committed until the transition is ready.
-     */
-    private boolean deferCommitVisibilityChange(boolean visible) {
-        if (mTransitionController.isShellTransitionsEnabled()) {
-            // Shell transition doesn't use opening/closing sets.
-            return false;
-        }
-        if (!mDisplayContent.mAppTransition.isTransitionSet()) {
-            return false;
-        }
-        if (mWaitForEnteringPinnedMode && mVisible == visible) {
-            // If the visibility is not changed during enter PIP, we don't want to include it in
-            // app transition to affect the animation theme, because the Pip organizer will
-            // animate the entering PIP instead.
-            return false;
-        }
-
-        // The animation will be visible soon so do not skip by screen off.
-        final boolean ignoreScreenOn = canTurnScreenOn() || mTaskSupervisor.getKeyguardController()
-                .isKeyguardGoingAway(mDisplayContent.mDisplayId);
-        // Ignore display frozen so the opening / closing transition type can be updated correctly
-        // even if the display is frozen. And it's safe since in applyAnimation will still check
-        // DC#okToAnimate again if the transition animation is fine to apply.
-        if (!okToAnimate(true /* ignoreFrozen */, ignoreScreenOn)) {
-            return false;
-        }
-        if (visible) {
-            mDisplayContent.mOpeningApps.add(this);
-            mEnteringAnimation = true;
-        } else if (mVisible) {
-            mDisplayContent.mClosingApps.add(this);
-            mEnteringAnimation = false;
-        }
-        if ((mDisplayContent.mAppTransition.getTransitFlags() & TRANSIT_FLAG_OPEN_BEHIND) != 0) {
-            // Add the launching-behind activity to mOpeningApps.
-            final WindowState win = mDisplayContent.findFocusedWindow();
-            if (win != null) {
-                final ActivityRecord focusedActivity = win.mActivityRecord;
-                if (focusedActivity != null) {
-                    ProtoLog.d(WM_DEBUG_APP_TRANSITIONS,
-                            "TRANSIT_FLAG_OPEN_BEHIND,  adding %s to mOpeningApps",
-                            focusedActivity);
-                    // Force animation to be loaded.
-                    mDisplayContent.mOpeningApps.add(focusedActivity);
-                }
-            }
-        }
-        return true;
-    }
-
     @Override
     boolean applyAnimation(LayoutParams lp, @TransitionOldType int transit, boolean enter,
             boolean isVoiceInteraction, @Nullable ArrayList<WindowContainer> sources) {
         if ((mTransitionChangeFlags & FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT) != 0) {
             return false;
         }
-        // If it was set to true, reset the last request to force the transition.
-        mRequestForceTransition = false;
         return super.applyAnimation(lp, transit, enter, isVoiceInteraction, sources);
     }
 
@@ -5799,7 +5696,21 @@
         displayContent.getInputMonitor().updateInputWindowsLw(false /*force*/);
         mTransitionChangeFlags = 0;
 
-        postApplyAnimation(visible, fromTransition);
+        // Set client visibility if:
+        // 1. The activity is becoming visible. This is usually no-op because assume that
+        //    setVisibility(true) should have been called. Just in case if that was missed.
+        // 2. The activity is becoming invisible and not RESUMED state (it is usually PAUSED unless
+        //    the activity is transient-hide). If the state is RESUMED, setVisibility(false) will be
+        //    called until activityStopped. This is to avoid crashing apps that assume its view root
+        //    won't be invisible before the activity is paused.
+        if (visible || mState != RESUMED) {
+            setClientVisible(visible);
+        }
+        // Notify the visibility change outside of transition in case onTransitionFinish is not
+        // called for updating snapshot states.
+        if (!fromTransition) {
+            mWmService.mSnapshotController.notifyAppVisibilityChanged(this, visible);
+        }
     }
 
     void commitVisibility(boolean visible, boolean performLayout) {
@@ -5818,75 +5729,6 @@
         return mNeedsLetterboxedAnimation && isAnimating();
     }
 
-    /**
-     * Post process after applying an app transition animation.
-     *
-     * <p class="note"><strong>Note: </strong> This function must be called after the animations
-     * have been applied and {@link #commitVisibility}.</p>
-     *
-     * @param visible {@code true} if this {@link ActivityRecord} has become visible, otherwise
-     *                this has become invisible.
-     * @param fromTransition {@code true} if this call is part of finishing a transition. This is
-     *                       needed because the shell transition is no-longer active by the time
-     *                       commitVisibility is called.
-     */
-    private void postApplyAnimation(boolean visible, boolean fromTransition) {
-        final boolean usingShellTransitions = mTransitionController.isShellTransitionsEnabled();
-        final boolean delayed = !usingShellTransitions && isAnimating(PARENTS | CHILDREN,
-                ANIMATION_TYPE_APP_TRANSITION | ANIMATION_TYPE_WINDOW_ANIMATION);
-        if (!delayed && !usingShellTransitions) {
-            // We aren't delayed anything, but exiting windows rely on the animation finished
-            // callback being called in case the ActivityRecord was pretending to be delayed,
-            // which we might have done because we were in closing/opening apps list.
-            onAnimationFinished(ANIMATION_TYPE_APP_TRANSITION, null /* AnimationAdapter */);
-            if (visible) {
-                // The token was made immediately visible, there will be no entrance animation.
-                // We need to inform the client the enter animation was finished.
-                mEnteringAnimation = true;
-                mWmService.mActivityManagerAppTransitionNotifier.onAppTransitionFinishedLocked(
-                        token);
-            }
-        }
-
-        // If we're becoming visible, immediately change client visibility as well. there seem
-        // to be some edge cases where we change our visibility but client visibility never gets
-        // updated.
-        // If we're becoming invisible, update the client visibility if we are not running an
-        // animation and aren't in RESUMED state. Otherwise, we'll update client visibility in
-        // onAnimationFinished or activityStopped.
-        if (visible || (mState != RESUMED && (usingShellTransitions || !isAnimating(
-                PARENTS, ANIMATION_TYPE_APP_TRANSITION)))) {
-            setClientVisible(visible);
-        }
-
-        final DisplayContent displayContent = getDisplayContent();
-        if (!displayContent.mClosingApps.contains(this)
-                && !displayContent.mOpeningApps.contains(this)
-                && !fromTransition) {
-            // Take the screenshot before possibly hiding the WSA, otherwise the screenshot
-            // will not be taken.
-            mWmService.mSnapshotController.notifyAppVisibilityChanged(this, visible);
-        }
-
-        // If we are hidden but there is no delay needed we immediately
-        // apply the Surface transaction so that the ActivityManager
-        // can have some guarantee on the Surface state following
-        // setting the visibility. This captures cases like dismissing
-        // the docked or root pinned task where there is no app transition.
-        //
-        // In the case of a "Null" animation, there will be
-        // no animation but there will still be a transition set.
-        // We still need to delay hiding the surface such that it
-        // can be synchronized with showing the next surface in the transition.
-        if (!usingShellTransitions && !isVisible() && !delayed
-                && !displayContent.mAppTransition.isTransitionSet()) {
-            forAllWindows(win -> {
-                win.mWinAnimator.hide(getPendingTransaction(), "immediately hidden");
-            }, true);
-            scheduleAnimation();
-        }
-    }
-
     /** Updates draw state and shows drawn windows. */
     void commitFinishDrawing(SurfaceControl.Transaction t) {
         boolean committed = false;
@@ -5899,27 +5741,6 @@
     }
 
     /**
-     * Check if visibility of this {@link ActivityRecord} should be updated as part of an app
-     * transition.
-     *
-     * <p class="note><strong>Note:</strong> If the visibility of this {@link ActivityRecord} is
-     * already set to {@link #mVisible}, we don't need to update the visibility. So {@code false} is
-     * returned.</p>
-     *
-     * @param visible {@code true} if this {@link ActivityRecord} should become visible,
-     *                {@code false} if this should become invisible.
-     * @return {@code true} if visibility of this {@link ActivityRecord} should be updated, and
-     *         an app transition animation should be run.
-     */
-    boolean shouldApplyAnimation(boolean visible) {
-        // Allow for state update and animation to be applied if:
-        // * activity is transitioning visibility state
-        // * or the activity was marked as hidden and is exiting before we had a chance to play the
-        // transition animation
-        return isVisible() != visible || mRequestForceTransition || (!isVisible() && mIsExiting);
-    }
-
-    /**
      * See {@link Activity#setRecentsScreenshotEnabled}.
      */
     void setRecentsScreenshotEnabled(boolean enabled) {
@@ -7629,13 +7450,6 @@
     }
 
     @Override
-    public boolean shouldDeferAnimationFinish(Runnable endDeferFinishCallback) {
-        return mAnimatingActivityRegistry != null
-                && mAnimatingActivityRegistry.notifyAboutToFinish(
-                this, endDeferFinishCallback);
-    }
-
-    @Override
     boolean isWaitingForTransitionStart() {
         final DisplayContent dc = getDisplayContent();
         return dc != null && dc.mAppTransition.isTransitionSet()
@@ -7656,10 +7470,6 @@
 
     @Override
     public void onLeashAnimationStarting(Transaction t, SurfaceControl leash) {
-        if (mAnimatingActivityRegistry != null) {
-            mAnimatingActivityRegistry.notifyStarting(this);
-        }
-
         if (mNeedsLetterboxedAnimation) {
             updateLetterboxSurfaceIfNeeded(findMainWindow(), t);
             mNeedsAnimationBoundsLayer = true;
@@ -7670,17 +7480,7 @@
         // new layer.
         if (mNeedsAnimationBoundsLayer) {
             mTmpRect.setEmpty();
-            if (getDisplayContent().mAppTransitionController.isTransitWithinTask(
-                    getTransit(), task)) {
-                task.getBounds(mTmpRect);
-            } else {
-                final Task rootTask = getRootTask();
-                if (rootTask == null) {
-                    return;
-                }
-                // Set clip rect to root task bounds.
-                rootTask.getBounds(mTmpRect);
-            }
+            task.getBounds(mTmpRect);
             mAnimationBoundsLayer = createAnimationBoundsLayer(t);
 
             // Crop to root task bounds.
@@ -7731,9 +7531,6 @@
                 mActivityRecordInputSink.applyChangesToSurfaceIfChanged(getPendingTransaction());
             }
         }
-        if (mThumbnail != null) {
-            mThumbnail.setShowing(getPendingTransaction(), show);
-        }
         mLastSurfaceShowing = show;
         super.prepareSurfaces();
     }
@@ -7745,84 +7542,6 @@
         return mLastSurfaceShowing;
     }
 
-    void attachThumbnailAnimation() {
-        if (!isAnimating(PARENTS, ANIMATION_TYPE_APP_TRANSITION)) {
-            return;
-        }
-        final HardwareBuffer thumbnailHeader =
-                getDisplayContent().mAppTransition.getAppTransitionThumbnailHeader(task);
-        if (thumbnailHeader == null) {
-            ProtoLog.d(WM_DEBUG_APP_TRANSITIONS, "No thumbnail header bitmap for: %s", task);
-            return;
-        }
-        clearThumbnail();
-        final Transaction transaction = getAnimatingContainer().getPendingTransaction();
-        mThumbnail = new WindowContainerThumbnail(transaction, getAnimatingContainer(),
-                thumbnailHeader);
-        mThumbnail.startAnimation(transaction, loadThumbnailAnimation(thumbnailHeader));
-    }
-
-    /**
-     * Attaches a surface with a thumbnail for the
-     * {@link android.app.ActivityOptions#ANIM_OPEN_CROSS_PROFILE_APPS} animation.
-     */
-    void attachCrossProfileAppsThumbnailAnimation() {
-        if (!isAnimating(PARENTS, ANIMATION_TYPE_APP_TRANSITION)) {
-            return;
-        }
-        clearThumbnail();
-
-        final WindowState win = findMainWindow();
-        if (win == null) {
-            return;
-        }
-        final Rect frame = win.getRelativeFrame();
-        final Context context = mAtmService.getUiContext();
-        final Drawable thumbnailDrawable;
-        if (task.mUserId == mWmService.mCurrentUserId) {
-            thumbnailDrawable = context.getDrawable(R.drawable.ic_account_circle);
-        } else {
-            final DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
-            thumbnailDrawable = dpm.getResources().getDrawable(
-                    WORK_PROFILE_ICON, OUTLINE, PROFILE_SWITCH_ANIMATION,
-                    () -> context.getDrawable(R.drawable.ic_corp_badge));
-        }
-        final HardwareBuffer thumbnail = getDisplayContent().mAppTransition
-                .createCrossProfileAppsThumbnail(thumbnailDrawable, frame);
-        if (thumbnail == null) {
-            return;
-        }
-        final Transaction transaction = getPendingTransaction();
-        mThumbnail = new WindowContainerThumbnail(transaction, getTask(), thumbnail);
-        final Animation animation =
-                getDisplayContent().mAppTransition.createCrossProfileAppsThumbnailAnimationLocked(
-                        frame);
-        mThumbnail.startAnimation(transaction, animation, new Point(frame.left, frame.top));
-    }
-
-    private Animation loadThumbnailAnimation(HardwareBuffer thumbnailHeader) {
-        final DisplayInfo displayInfo = mDisplayContent.getDisplayInfo();
-
-        // If this is a multi-window scenario, we use the windows frame as
-        // destination of the thumbnail header animation. If this is a full screen
-        // window scenario, we use the whole display as the target.
-        WindowState win = findMainWindow();
-        Rect insets;
-        Rect appRect;
-        if (win != null) {
-            insets = win.getInsetsStateWithVisibilityOverride().calculateInsets(
-                    win.getFrame(), Type.systemBars(), false /* ignoreVisibility */).toRect();
-            appRect = new Rect(win.getFrame());
-            appRect.inset(insets);
-        } else {
-            insets = null;
-            appRect = new Rect(0, 0, displayInfo.appWidth, displayInfo.appHeight);
-        }
-        final Configuration displayConfig = mDisplayContent.getConfiguration();
-        return getDisplayContent().mAppTransition.createThumbnailAspectScaleAnimationLocked(
-                appRect, insets, thumbnailHeader, task, displayConfig.orientation);
-    }
-
     @Override
     public void onAnimationLeashLost(Transaction t) {
         super.onAnimationLeashLost(t);
@@ -7836,10 +7555,6 @@
             mNeedsLetterboxedAnimation = false;
             updateLetterboxSurfaceIfNeeded(findMainWindow(), t);
         }
-
-        if (mAnimatingActivityRegistry != null) {
-            mAnimatingActivityRegistry.notifyFinished(this);
-        }
     }
 
     @Override
@@ -7853,7 +7568,6 @@
         setAppLayoutChanges(FINISH_LAYOUT_REDO_ANIM | FINISH_LAYOUT_REDO_WALLPAPER,
                 "ActivityRecord");
 
-        clearThumbnail();
         setClientVisible(isVisible() || mVisibleRequested);
 
         getDisplayContent().computeImeTargetIfNeeded(this);
@@ -7863,12 +7577,6 @@
                 this, reportedVisible, okToDisplay(), okToAnimate(),
                 isStartingWindowDisplayed());
 
-        // clean up thumbnail window
-        if (mThumbnail != null) {
-            mThumbnail.destroy();
-            mThumbnail = null;
-        }
-
         // WindowState.onExitAnimationDone might modify the children list, so make a copy and then
         // traverse the copy.
         final ArrayList<WindowState> children = new ArrayList<>(mChildren);
@@ -7907,20 +7615,6 @@
         }
     }
 
-    @Override
-    void cancelAnimation() {
-        super.cancelAnimation();
-        clearThumbnail();
-    }
-
-    private void clearThumbnail() {
-        if (mThumbnail == null) {
-            return;
-        }
-        mThumbnail.destroy();
-        mThumbnail = null;
-    }
-
     public @TransitionOldType int getTransit() {
         return mTransit;
     }
@@ -8357,6 +8051,7 @@
         mConfigurationSeq = Math.max(++mConfigurationSeq, 1);
         getResolvedOverrideConfiguration().seq = mConfigurationSeq;
 
+        // TODO(b/392069771): Move to AppCompatSandboxingPolicy.
         // Sandbox max bounds by setting it to the activity bounds, if activity is letterboxed, or
         // has or will have mAppCompatDisplayInsets for size compat. Also forces an activity to be
         // sandboxed or not depending upon the configuration settings.
@@ -8385,6 +8080,9 @@
             resolvedConfig.windowConfiguration.setMaxBounds(mTmpBounds);
         }
 
+        mAppCompatController.getSandboxingPolicy().sandboxBoundsIfNeeded(resolvedConfig,
+                parentWindowingMode);
+
         applySizeOverrideIfNeeded(
                 mDisplayContent,
                 info.applicationInfo,
@@ -9866,9 +9564,6 @@
         proto.write(IS_WAITING_FOR_TRANSITION_START, isWaitingForTransitionStart());
         proto.write(IS_ANIMATING, isAnimating(TRANSITION | PARENTS | CHILDREN,
                 ANIMATION_TYPE_APP_TRANSITION | ANIMATION_TYPE_WINDOW_ANIMATION));
-        if (mThumbnail != null){
-            mThumbnail.dumpDebug(proto, THUMBNAIL);
-        }
         proto.write(FILLS_PARENT, fillsParent());
         proto.write(APP_STOPPED, mAppStopped);
         proto.write(TRANSLUCENT, !occludesParent());
@@ -9972,31 +9667,6 @@
     }
 
     @Override
-    RemoteAnimationTarget createRemoteAnimationTarget(
-            RemoteAnimationController.RemoteAnimationRecord record) {
-        final WindowState mainWindow = findMainWindow();
-        if (task == null || mainWindow == null) {
-            return null;
-        }
-        final Rect insets = mainWindow.getInsetsStateWithVisibilityOverride().calculateInsets(
-                task.getBounds(), Type.systemBars(), false /* ignoreVisibility */).toRect();
-        InsetUtils.addInsets(insets, getLetterboxInsets());
-
-        final RemoteAnimationTarget target = new RemoteAnimationTarget(task.mTaskId,
-                record.getMode(), record.mAdapter.mCapturedLeash, !fillsParent(),
-                new Rect(), insets,
-                getPrefixOrderIndex(), record.mAdapter.mPosition, record.mAdapter.mLocalBounds,
-                record.mAdapter.mEndBounds, task.getWindowConfiguration(),
-                false /*isNotInRecents*/,
-                record.mThumbnailAdapter != null ? record.mThumbnailAdapter.mCapturedLeash : null,
-                record.mStartBounds, task.getTaskInfo(), checkEnterPictureInPictureAppOpsState());
-        target.setShowBackdrop(record.mShowBackdrop);
-        target.setWillShowImeOnTarget(mStartingData != null && mStartingData.hasImeSurface());
-        target.hasAnimatingParent = record.hasAnimatingParent();
-        return target;
-    }
-
-    @Override
     boolean canCreateRemoteAnimationTarget() {
         return true;
     }
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 254127d..819e117 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -4128,22 +4128,7 @@
     @Override
     public void registerRemoteAnimationsForDisplay(int displayId,
             RemoteAnimationDefinition definition) {
-        mAmInternal.enforceCallingPermission(CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS,
-                "registerRemoteAnimations");
-        definition.setCallingPidUid(Binder.getCallingPid(), Binder.getCallingUid());
-        synchronized (mGlobalLock) {
-            final DisplayContent display = mRootWindowContainer.getDisplayContent(displayId);
-            if (display == null) {
-                Slog.e(TAG, "Couldn't find display with id: " + displayId);
-                return;
-            }
-            final long origId = Binder.clearCallingIdentity();
-            try {
-                display.registerRemoteAnimations(definition);
-            } finally {
-                Binder.restoreCallingIdentity(origId);
-            }
-        }
+        // TODO(b/365884835): Remove callers.
     }
 
     /** @see android.app.ActivityManager#alwaysShowUnsupportedCompileSdkWarning */
diff --git a/services/core/java/com/android/server/wm/AnimatingActivityRegistry.java b/services/core/java/com/android/server/wm/AnimatingActivityRegistry.java
deleted file mode 100644
index 18ec96c..0000000
--- a/services/core/java/com/android/server/wm/AnimatingActivityRegistry.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.server.wm;
-
-import android.util.ArrayMap;
-import android.util.ArraySet;
-
-import java.io.PrintWriter;
-import java.util.ArrayList;
-
-/**
- * Keeps track of all {@link ActivityRecord} that are animating and makes sure all animations are
- * finished at the same time such that we don't run into issues with z-ordering: An activity A
- * that has a shorter animation that is above another activity B with a longer animation in the same
- * task, the animation layer would put the B on top of A, but from the hierarchy, A needs to be on
- * top of B. Thus, we defer reparenting A to the original hierarchy such that it stays on top of B
- * until B finishes animating.
- */
-class AnimatingActivityRegistry {
-
-    private ArraySet<ActivityRecord> mAnimatingActivities = new ArraySet<>();
-    private ArrayMap<ActivityRecord, Runnable> mFinishedTokens = new ArrayMap<>();
-
-    private ArrayList<Runnable> mTmpRunnableList = new ArrayList<>();
-
-    private boolean mEndingDeferredFinish;
-
-    /**
-     * Notifies that an {@link ActivityRecord} has started animating.
-     */
-    void notifyStarting(ActivityRecord token) {
-        mAnimatingActivities.add(token);
-    }
-
-    /**
-     * Notifies that an {@link ActivityRecord} has finished animating.
-     */
-    void notifyFinished(ActivityRecord activity) {
-        mAnimatingActivities.remove(activity);
-        mFinishedTokens.remove(activity);
-
-        // If we were the last activity, make sure the end all deferred finishes.
-        if (mAnimatingActivities.isEmpty()) {
-            endDeferringFinished();
-        }
-    }
-
-    /**
-     * Called when an {@link ActivityRecord} is about to finish animating.
-     *
-     * @param endDeferFinishCallback Callback to run when defer finish should be ended.
-     * @return {@code true} if finishing the animation should be deferred, {@code false} otherwise.
-     */
-    boolean notifyAboutToFinish(ActivityRecord activity, Runnable endDeferFinishCallback) {
-        final boolean removed = mAnimatingActivities.remove(activity);
-        if (!removed) {
-            return false;
-        }
-
-        if (mAnimatingActivities.isEmpty()) {
-
-            // If no animations are animating anymore, finish all others.
-            endDeferringFinished();
-            return false;
-        } else {
-
-            // Otherwise let's put it into the pending list of to be finished animations.
-            mFinishedTokens.put(activity, endDeferFinishCallback);
-            return true;
-        }
-    }
-
-    private void endDeferringFinished() {
-
-        // Don't start recursing. Running the finished listener invokes notifyFinished, which may
-        // invoked us again.
-        if (mEndingDeferredFinish) {
-            return;
-        }
-        try {
-            mEndingDeferredFinish = true;
-
-            // Copy it into a separate temp list to avoid modifying the collection while iterating
-            // as calling the callback may call back into notifyFinished.
-            for (int i = mFinishedTokens.size() - 1; i >= 0; i--) {
-                mTmpRunnableList.add(mFinishedTokens.valueAt(i));
-            }
-            mFinishedTokens.clear();
-            for (int i = mTmpRunnableList.size() - 1; i >= 0; i--) {
-                mTmpRunnableList.get(i).run();
-            }
-            mTmpRunnableList.clear();
-        } finally {
-            mEndingDeferredFinish = false;
-        }
-    }
-
-    void dump(PrintWriter pw, String header, String prefix) {
-        if (!mAnimatingActivities.isEmpty() || !mFinishedTokens.isEmpty()) {
-            pw.print(prefix); pw.println(header);
-            prefix = prefix + "  ";
-            pw.print(prefix); pw.print("mAnimatingActivities="); pw.println(mAnimatingActivities);
-            pw.print(prefix); pw.print("mFinishedTokens="); pw.println(mFinishedTokens);
-        }
-    }
-}
diff --git a/services/core/java/com/android/server/wm/AnimationAdapter.java b/services/core/java/com/android/server/wm/AnimationAdapter.java
index 3dc377d..4458ed7 100644
--- a/services/core/java/com/android/server/wm/AnimationAdapter.java
+++ b/services/core/java/com/android/server/wm/AnimationAdapter.java
@@ -109,15 +109,6 @@
      * Gets called when the animation is about to finish and gives the client the opportunity to
      * defer finishing the animation, i.e. it keeps the leash around until the client calls
      * endDeferFinishCallback.
-     * <p>
-     * This has the same effect as
-     * {@link com.android.server.wm.SurfaceAnimator.Animatable#shouldDeferAnimationFinish(Runnable)}
-     * . The later will be evaluated first and has precedence over this method if it returns true,
-     * which means that if the {@link com.android.server.wm.SurfaceAnimator.Animatable} requests to
-     * defer its finish, this method won't be called so this adapter will never have access to the
-     * finish callback. On the other hand, if the
-     * {@link com.android.server.wm.SurfaceAnimator.Animatable}, doesn't request to defer, this
-     * {@link AnimationAdapter} is responsible for ending the animation.
      *
      * @param endDeferFinishCallback The callback to call when defer finishing should be ended.
      * @return Whether the client would like to defer the animation finish.
diff --git a/services/core/java/com/android/server/wm/AppCompatController.java b/services/core/java/com/android/server/wm/AppCompatController.java
index bed95fa..fc50479 100644
--- a/services/core/java/com/android/server/wm/AppCompatController.java
+++ b/services/core/java/com/android/server/wm/AppCompatController.java
@@ -44,6 +44,8 @@
     private final AppCompatLetterboxPolicy mLetterboxPolicy;
     @NonNull
     private final AppCompatSizeCompatModePolicy mSizeCompatModePolicy;
+    @NonNull
+    private final AppCompatSandboxingPolicy mSandboxingPolicy;
 
     AppCompatController(@NonNull WindowManagerService wmService,
                         @NonNull ActivityRecord activityRecord) {
@@ -66,6 +68,7 @@
                 mAppCompatOverrides, mTransparentPolicy, wmService.mAppCompatConfiguration);
         mSizeCompatModePolicy = new AppCompatSizeCompatModePolicy(activityRecord,
                 mAppCompatOverrides);
+        mSandboxingPolicy = new AppCompatSandboxingPolicy(activityRecord);
     }
 
     @NonNull
@@ -143,6 +146,11 @@
         return mSizeCompatModePolicy;
     }
 
+    @NonNull
+    AppCompatSandboxingPolicy getSandboxingPolicy() {
+        return mSandboxingPolicy;
+    }
+
     void dump(@NonNull PrintWriter pw, @NonNull String prefix) {
         getTransparentPolicy().dump(pw, prefix);
         getLetterboxPolicy().dump(pw, prefix);
diff --git a/services/core/java/com/android/server/wm/AppCompatSandboxingPolicy.java b/services/core/java/com/android/server/wm/AppCompatSandboxingPolicy.java
new file mode 100644
index 0000000..26cf32b
--- /dev/null
+++ b/services/core/java/com/android/server/wm/AppCompatSandboxingPolicy.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.AppCompatUtils.isInDesktopMode;
+
+import android.annotation.NonNull;
+import android.app.WindowConfiguration.WindowingMode;
+import android.content.res.Configuration;
+import android.graphics.Rect;
+
+import com.android.window.flags.Flags;
+
+/**
+ * Encapsulate logic related to sandboxing for app compatibility.
+ */
+class AppCompatSandboxingPolicy {
+
+    @NonNull
+    private final ActivityRecord mActivityRecord;
+
+    AppCompatSandboxingPolicy(@NonNull ActivityRecord activityRecord) {
+        mActivityRecord = activityRecord;
+    }
+
+    /**
+     * In freeform, the container bounds are scaled with app bounds. Activity bounds can be
+     * outside of its container bounds if insets are coupled with configuration outside of
+     * freeform and maintained in freeform for size compat mode.
+     *
+     * <p>Sandbox activity bounds in freeform to app bounds to force app to display within the
+     * container. This prevents UI cropping when activities can draw below insets which are
+     * normally excluded from appBounds before targetSDK < 35
+     * (see ConfigurationContainer#applySizeOverrideIfNeeded).
+     */
+    void sandboxBoundsIfNeeded(@NonNull Configuration resolvedConfig,
+            @WindowingMode int windowingMode) {
+        if (!Flags.excludeCaptionFromAppBounds()) {
+            return;
+        }
+
+        if (isInDesktopMode(mActivityRecord.mAtmService.mContext, windowingMode)) {
+            Rect appBounds = resolvedConfig.windowConfiguration.getAppBounds();
+            if (appBounds == null || appBounds.isEmpty()) {
+                // When there is no override bounds, the activity will inherit the bounds from
+                // parent.
+                appBounds = mActivityRecord.mResolveConfigHint.mParentAppBoundsOverride;
+            }
+            resolvedConfig.windowConfiguration.setBounds(appBounds);
+        }
+    }
+}
diff --git a/services/core/java/com/android/server/wm/AppCompatSizeCompatModePolicy.java b/services/core/java/com/android/server/wm/AppCompatSizeCompatModePolicy.java
index bbc3300..2cfa242 100644
--- a/services/core/java/com/android/server/wm/AppCompatSizeCompatModePolicy.java
+++ b/services/core/java/com/android/server/wm/AppCompatSizeCompatModePolicy.java
@@ -17,14 +17,13 @@
 package com.android.server.wm;
 
 import static android.app.WindowConfiguration.ROTATION_UNDEFINED;
-import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
 import static android.content.pm.ActivityInfo.SIZE_CHANGES_SUPPORTED_METADATA;
 import static android.content.pm.ActivityInfo.SIZE_CHANGES_SUPPORTED_OVERRIDE;
 import static android.content.pm.ActivityInfo.SIZE_CHANGES_UNSUPPORTED_METADATA;
 import static android.content.pm.ActivityInfo.SIZE_CHANGES_UNSUPPORTED_OVERRIDE;
 import static android.content.res.Configuration.ORIENTATION_UNDEFINED;
 
-import static com.android.server.wm.DesktopModeHelper.canEnterDesktopMode;
+import static com.android.server.wm.AppCompatUtils.isInDesktopMode;
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
@@ -545,9 +544,8 @@
         // Allow an application to be up-scaled if its window is smaller than its
         // original container or if it's a freeform window in desktop mode.
         boolean shouldAllowUpscaling = !(contentW <= viewportW && contentH <= viewportH)
-                || (canEnterDesktopMode(mActivityRecord.mAtmService.mContext)
-                && newParentConfig.windowConfiguration.getWindowingMode()
-                    == WINDOWING_MODE_FREEFORM);
+                || isInDesktopMode(mActivityRecord.mAtmService.mContext,
+                newParentConfig.windowConfiguration.getWindowingMode());
         return shouldAllowUpscaling ? Math.min(
                 (float) viewportW / contentW, (float) viewportH / contentH) : 1f;
     }
diff --git a/services/core/java/com/android/server/wm/AppCompatUtils.java b/services/core/java/com/android/server/wm/AppCompatUtils.java
index 3e054fc..1460440 100644
--- a/services/core/java/com/android/server/wm/AppCompatUtils.java
+++ b/services/core/java/com/android/server/wm/AppCompatUtils.java
@@ -16,16 +16,20 @@
 
 package com.android.server.wm;
 
+import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
 import static android.content.res.Configuration.UI_MODE_TYPE_MASK;
 import static android.content.res.Configuration.UI_MODE_TYPE_VR_HEADSET;
 
 import static com.android.server.wm.ActivityRecord.State.RESUMED;
+import static com.android.server.wm.DesktopModeHelper.canEnterDesktopMode;
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.AppCompatTaskInfo;
 import android.app.CameraCompatTaskInfo;
 import android.app.TaskInfo;
+import android.app.WindowConfiguration.WindowingMode;
+import android.content.Context;
 import android.content.res.Configuration;
 import android.graphics.Rect;
 import android.view.InsetsSource;
@@ -276,6 +280,14 @@
         inOutConfig.windowConfiguration.getAppBounds().offset(offsetX, offsetY);
     }
 
+    /**
+     * Return {@code true} if window is currently in desktop mode.
+     */
+    static boolean isInDesktopMode(@NonNull Context context,
+            @WindowingMode int parentWindowingMode) {
+        return parentWindowingMode == WINDOWING_MODE_FREEFORM && canEnterDesktopMode(context);
+    }
+
     private static void clearAppCompatTaskInfo(@NonNull AppCompatTaskInfo info) {
         info.topActivityLetterboxVerticalPosition = TaskInfo.PROPERTY_VALUE_UNSET;
         info.topActivityLetterboxHorizontalPosition = TaskInfo.PROPERTY_VALUE_UNSET;
diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java
index 932f268..d98ad8b 100644
--- a/services/core/java/com/android/server/wm/AppTransition.java
+++ b/services/core/java/com/android/server/wm/AppTransition.java
@@ -231,8 +231,6 @@
     private final int mDefaultWindowAnimationStyleResId;
     private boolean mOverrideTaskTransition;
 
-    private RemoteAnimationController mRemoteAnimationController;
-
     final Handler mHandler;
     final Runnable mHandleAppTransitionTimeoutRunnable = () -> handleAppTransitionTimeout();
 
@@ -398,9 +396,7 @@
                         : SystemClock.uptimeMillis(),
                 AnimationAdapter.STATUS_BAR_TRANSITION_DURATION);
 
-        if (mRemoteAnimationController != null) {
-            mRemoteAnimationController.goodToGo(transit);
-        } else if ((isTaskOpenTransitOld(transit) || transit == TRANSIT_OLD_WALLPAPER_CLOSE)
+        if ((isTaskOpenTransitOld(transit) || transit == TRANSIT_OLD_WALLPAPER_CLOSE)
                 && topOpeningAnim != null) {
             if (mDisplayContent.getDisplayPolicy().shouldAttachNavBarToAppDuringTransition()) {
                 final NavBarFadeAnimationController controller =
@@ -424,7 +420,6 @@
         mNextAppTransitionType = NEXT_TRANSIT_TYPE_NONE;
         mNextAppTransitionOverrideRequested = false;
         mNextAppTransitionAnimationsSpecs.clear();
-        mRemoteAnimationController = null;
         mNextAppTransitionAnimationsSpecsFuture = null;
         mDefaultNextAppTransitionAnimationSpec = null;
         mAnimationFinishedCallback = null;
@@ -442,13 +437,6 @@
         final boolean keyguardGoingAwayCancelled = mNextAppTransitionRequests.contains(
                 TRANSIT_KEYGUARD_GOING_AWAY);
 
-        // The RemoteAnimationControl didn't register AppTransitionListener and
-        // only initialized the finish and timeout callback when goodToGo().
-        // So cancel the remote animation here to prevent the animation can't do
-        // finish after transition state cleared.
-        if (mRemoteAnimationController != null) {
-            mRemoteAnimationController.cancelAnimation("freeze");
-        }
         mNextAppTransitionRequests.clear();
         clear();
         setReady();
@@ -719,10 +707,6 @@
                 && !mNextAppTransitionRequests.contains(TRANSIT_KEYGUARD_GOING_AWAY);
     }
 
-    RemoteAnimationController getRemoteAnimationController() {
-        return mRemoteAnimationController;
-    }
-
     /**
      *
      * @param frame These are the bounds of the window when it finishes the animation. This is where
@@ -1082,17 +1066,6 @@
 
     void overridePendingAppTransitionRemote(RemoteAnimationAdapter remoteAnimationAdapter,
             boolean sync, boolean isActivityEmbedding) {
-        ProtoLog.i(WM_DEBUG_APP_TRANSITIONS, "Override pending remote transitionSet=%b adapter=%s",
-                        isTransitionSet(), remoteAnimationAdapter);
-        if (isTransitionSet() && !mNextAppTransitionIsSync) {
-            // ActivityEmbedding animation will run by the app process for which we want to respect
-            // the app override for whether or not to show background color.
-            clear(!isActivityEmbedding /* clearAppOverride */);
-            mNextAppTransitionType = NEXT_TRANSIT_TYPE_REMOTE;
-            mRemoteAnimationController = new RemoteAnimationController(mService, mDisplayContent,
-                    remoteAnimationAdapter, mHandler, isActivityEmbedding);
-            mNextAppTransitionIsSync = sync;
-        }
     }
 
     void overrideInPlaceAppTransition(String packageName, int anim) {
@@ -1462,7 +1435,7 @@
     }
 
     boolean prepareAppTransition(@TransitionType int transit, @TransitionFlags int flags) {
-        if (mDisplayContent.mTransitionController.isShellTransitionsEnabled()) {
+        if (WindowManagerService.sEnableShellTransitions) {
             return false;
         }
         mNextAppTransitionRequests.add(transit);
diff --git a/services/core/java/com/android/server/wm/AppTransitionController.java b/services/core/java/com/android/server/wm/AppTransitionController.java
deleted file mode 100644
index d5fe056..0000000
--- a/services/core/java/com/android/server/wm/AppTransitionController.java
+++ /dev/null
@@ -1,1352 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.server.wm;
-
-import static android.app.WindowConfiguration.ACTIVITY_TYPE_DREAM;
-import static android.view.WindowManager.TRANSIT_CHANGE;
-import static android.view.WindowManager.TRANSIT_CLOSE;
-import static android.view.WindowManager.TRANSIT_FLAG_APP_CRASHED;
-import static android.view.WindowManager.TRANSIT_FLAG_OPEN_BEHIND;
-import static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY;
-import static android.view.WindowManager.TRANSIT_KEYGUARD_OCCLUDE;
-import static android.view.WindowManager.TRANSIT_KEYGUARD_UNOCCLUDE;
-import static android.view.WindowManager.TRANSIT_NONE;
-import static android.view.WindowManager.TRANSIT_OLD_ACTIVITY_CLOSE;
-import static android.view.WindowManager.TRANSIT_OLD_ACTIVITY_OPEN;
-import static android.view.WindowManager.TRANSIT_OLD_ACTIVITY_RELAUNCH;
-import static android.view.WindowManager.TRANSIT_OLD_CRASHING_ACTIVITY_CLOSE;
-import static android.view.WindowManager.TRANSIT_OLD_DREAM_ACTIVITY_CLOSE;
-import static android.view.WindowManager.TRANSIT_OLD_DREAM_ACTIVITY_OPEN;
-import static android.view.WindowManager.TRANSIT_OLD_KEYGUARD_GOING_AWAY;
-import static android.view.WindowManager.TRANSIT_OLD_KEYGUARD_GOING_AWAY_ON_WALLPAPER;
-import static android.view.WindowManager.TRANSIT_OLD_KEYGUARD_OCCLUDE;
-import static android.view.WindowManager.TRANSIT_OLD_KEYGUARD_OCCLUDE_BY_DREAM;
-import static android.view.WindowManager.TRANSIT_OLD_KEYGUARD_UNOCCLUDE;
-import static android.view.WindowManager.TRANSIT_OLD_NONE;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_CHANGE_WINDOWING_MODE;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_CLOSE;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_FRAGMENT_CHANGE;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_FRAGMENT_CLOSE;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_FRAGMENT_OPEN;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_OPEN;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_OPEN_BEHIND;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_TO_BACK;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_TO_FRONT;
-import static android.view.WindowManager.TRANSIT_OLD_TRANSLUCENT_ACTIVITY_CLOSE;
-import static android.view.WindowManager.TRANSIT_OLD_TRANSLUCENT_ACTIVITY_OPEN;
-import static android.view.WindowManager.TRANSIT_OLD_WALLPAPER_CLOSE;
-import static android.view.WindowManager.TRANSIT_OLD_WALLPAPER_INTRA_CLOSE;
-import static android.view.WindowManager.TRANSIT_OLD_WALLPAPER_INTRA_OPEN;
-import static android.view.WindowManager.TRANSIT_OLD_WALLPAPER_OPEN;
-import static android.view.WindowManager.TRANSIT_OPEN;
-import static android.view.WindowManager.TRANSIT_RELAUNCH;
-import static android.view.WindowManager.TRANSIT_TO_BACK;
-import static android.view.WindowManager.TRANSIT_TO_FRONT;
-
-import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_APP_TRANSITIONS;
-import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_APP_TRANSITIONS_ANIM;
-import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG;
-import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT;
-import static com.android.server.wm.ActivityTaskManagerInternal.APP_TRANSITION_SNAPSHOT;
-import static com.android.server.wm.ActivityTaskManagerInternal.APP_TRANSITION_SPLASH_SCREEN;
-import static com.android.server.wm.ActivityTaskManagerInternal.APP_TRANSITION_WINDOWS_DRAWN;
-import static com.android.server.wm.AppTransition.isNormalTransit;
-import static com.android.server.wm.NonAppWindowAnimationAdapter.shouldAttachNavBarToApp;
-import static com.android.server.wm.NonAppWindowAnimationAdapter.shouldStartNonAppWindowAnimationsForKeyguardExit;
-import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_APP_TRANSITION;
-import static com.android.server.wm.WallpaperAnimationAdapter.shouldStartWallpaperAnimation;
-import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS;
-import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
-import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
-
-import android.annotation.IntDef;
-import android.annotation.Nullable;
-import android.graphics.Rect;
-import android.os.Trace;
-import android.util.ArrayMap;
-import android.util.ArraySet;
-import android.util.Pair;
-import android.view.RemoteAnimationAdapter;
-import android.view.RemoteAnimationDefinition;
-import android.view.WindowManager;
-import android.view.WindowManager.LayoutParams;
-import android.view.WindowManager.TransitionFlags;
-import android.view.WindowManager.TransitionOldType;
-import android.view.WindowManager.TransitionType;
-import android.window.ITaskFragmentOrganizer;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.protolog.ProtoLog;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.ArrayDeque;
-import java.util.ArrayList;
-import java.util.function.Consumer;
-import java.util.function.Predicate;
-
-/**
- * Checks for app transition readiness, resolves animation attributes and performs visibility
- * change for apps that animate as part of an app transition.
- */
-public class AppTransitionController {
-    private static final String TAG = TAG_WITH_CLASS_NAME ? "AppTransitionController" : TAG_WM;
-    private final WindowManagerService mService;
-    private final DisplayContent mDisplayContent;
-    private final WallpaperController mWallpaperControllerLocked;
-    private RemoteAnimationDefinition mRemoteAnimationDefinition = null;
-
-    private static final int TYPE_NONE = 0;
-    private static final int TYPE_ACTIVITY = 1;
-    private static final int TYPE_TASK_FRAGMENT = 2;
-    private static final int TYPE_TASK = 3;
-
-    @IntDef(prefix = { "TYPE_" }, value = {
-            TYPE_NONE,
-            TYPE_ACTIVITY,
-            TYPE_TASK_FRAGMENT,
-            TYPE_TASK
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    @interface TransitContainerType {}
-
-    private final ArrayMap<WindowContainer, Integer> mTempTransitionReasons = new ArrayMap<>();
-    private final ArrayList<WindowContainer> mTempTransitionWindows = new ArrayList<>();
-
-    AppTransitionController(WindowManagerService service, DisplayContent displayContent) {
-        mService = service;
-        mDisplayContent = displayContent;
-        mWallpaperControllerLocked = mDisplayContent.mWallpaperController;
-    }
-
-    void registerRemoteAnimations(RemoteAnimationDefinition definition) {
-        mRemoteAnimationDefinition = definition;
-    }
-
-    /**
-     * Returns the currently visible window that is associated with the wallpaper in case we are
-     * transitioning from an activity with a wallpaper to one without.
-     */
-    @Nullable
-    private WindowState getOldWallpaper() {
-        final WindowState wallpaperTarget = mWallpaperControllerLocked.getWallpaperTarget();
-        final @TransitionType int firstTransit =
-                mDisplayContent.mAppTransition.getFirstAppTransition();
-
-        final ArraySet<WindowContainer> openingWcs = getAnimationTargets(
-                mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps, true /* visible */);
-        final boolean showWallpaper = wallpaperTarget != null
-                && (wallpaperTarget.hasWallpaper()
-                // Update task open transition to wallpaper transition when wallpaper is visible.
-                // (i.e.launching app info activity from recent tasks)
-                || ((firstTransit == TRANSIT_OPEN || firstTransit == TRANSIT_TO_FRONT)
-                && (!openingWcs.isEmpty() && openingWcs.valueAt(0).asTask() != null)
-                && mWallpaperControllerLocked.isWallpaperVisible()));
-        // If wallpaper is animating or wallpaperTarget doesn't have SHOW_WALLPAPER flag set,
-        // don't consider upgrading to wallpaper transition.
-        return (mWallpaperControllerLocked.isWallpaperTargetAnimating() || !showWallpaper)
-                ? null : wallpaperTarget;
-    }
-
-    /**
-     * Handle application transition for given display.
-     */
-    void handleAppTransitionReady() {
-        mTempTransitionReasons.clear();
-        if (!transitionGoodToGo(mDisplayContent.mOpeningApps, mTempTransitionReasons)
-                || !transitionGoodToGo(mDisplayContent.mChangingContainers, mTempTransitionReasons)
-                || !transitionGoodToGoForTaskFragments()) {
-            return;
-        }
-
-        Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "AppTransitionReady");
-
-        ProtoLog.v(WM_DEBUG_APP_TRANSITIONS, "**** GOOD TO GO");
-        // TODO(b/205335975): Remove window which stuck in animatingExit status. Find actual cause.
-        mDisplayContent.forAllWindows(WindowState::cleanupAnimatingExitWindow,
-                true /* traverseTopToBottom */);
-        // TODO(new-app-transition): Remove code using appTransition.getAppTransition()
-        final AppTransition appTransition = mDisplayContent.mAppTransition;
-
-        mDisplayContent.mNoAnimationNotifyOnTransitionFinished.clear();
-
-        appTransition.removeAppTransitionTimeoutCallbacks();
-
-        mDisplayContent.mWallpaperMayChange = false;
-
-        int appCount = mDisplayContent.mOpeningApps.size();
-        for (int i = 0; i < appCount; ++i) {
-            // Clearing the mAnimatingExit flag before entering animation. It's set to true if app
-            // window is removed, or window relayout to invisible. This also affects window
-            // visibility. We need to clear it *before* maybeUpdateTransitToWallpaper() as the
-            // transition selection depends on wallpaper target visibility.
-            mDisplayContent.mOpeningApps.valueAtUnchecked(i).clearAnimatingFlags();
-        }
-        appCount = mDisplayContent.mChangingContainers.size();
-        for (int i = 0; i < appCount; ++i) {
-            // Clearing for same reason as above.
-            final ActivityRecord activity = getAppFromContainer(
-                    mDisplayContent.mChangingContainers.valueAtUnchecked(i));
-            if (activity != null) {
-                activity.clearAnimatingFlags();
-            }
-        }
-
-        // Adjust wallpaper before we pull the lower/upper target, since pending changes
-        // (like the clearAnimatingFlags() above) might affect wallpaper target result.
-        // Or, the opening app window should be a wallpaper target.
-        mWallpaperControllerLocked.adjustWallpaperWindowsForAppTransitionIfNeeded(
-                mDisplayContent.mOpeningApps);
-
-        ArraySet<ActivityRecord> tmpOpenApps = mDisplayContent.mOpeningApps;
-        ArraySet<ActivityRecord> tmpCloseApps = mDisplayContent.mClosingApps;
-        if (mDisplayContent.mAtmService.mBackNavigationController.isMonitoringFinishTransition()) {
-            tmpOpenApps = new ArraySet<>(mDisplayContent.mOpeningApps);
-            tmpCloseApps = new ArraySet<>(mDisplayContent.mClosingApps);
-        }
-
-        @TransitionOldType final int transit = getTransitCompatType(
-                mDisplayContent.mAppTransition, tmpOpenApps,
-                tmpCloseApps, mDisplayContent.mChangingContainers,
-                mWallpaperControllerLocked.getWallpaperTarget(), getOldWallpaper(),
-                mDisplayContent.mSkipAppTransitionAnimation);
-        mDisplayContent.mSkipAppTransitionAnimation = false;
-
-        ProtoLog.v(WM_DEBUG_APP_TRANSITIONS,
-                "handleAppTransitionReady: displayId=%d appTransition={%s}"
-                + " openingApps=[%s] closingApps=[%s] transit=%s",
-                mDisplayContent.mDisplayId, appTransition.toString(), tmpOpenApps,
-                tmpCloseApps, AppTransition.appTransitionOldToString(transit));
-
-        // Find the layout params of the top-most application window in the tokens, which is
-        // what will control the animation theme. If all closing windows are obscured, then there is
-        // no need to do an animation. This is the case, for example, when this transition is being
-        // done behind a dream window.
-        final ArraySet<Integer> activityTypes = collectActivityTypes(tmpOpenApps,
-                tmpCloseApps, mDisplayContent.mChangingContainers);
-        final ActivityRecord animLpActivity = findAnimLayoutParamsToken(transit, activityTypes,
-                tmpOpenApps, tmpCloseApps, mDisplayContent.mChangingContainers);
-        final ActivityRecord topOpeningApp =
-                getTopApp(tmpOpenApps, false /* ignoreHidden */);
-        final ActivityRecord topClosingApp =
-                getTopApp(tmpCloseApps, false /* ignoreHidden */);
-        final ActivityRecord topChangingApp =
-                getTopApp(mDisplayContent.mChangingContainers, false /* ignoreHidden */);
-        final WindowManager.LayoutParams animLp = getAnimLp(animLpActivity);
-
-        // Check if there is any override
-        if (!overrideWithTaskFragmentRemoteAnimation(transit, activityTypes)) {
-            // Unfreeze the windows that were previously frozen for TaskFragment animation.
-            overrideWithRemoteAnimationIfSet(animLpActivity, transit, activityTypes);
-        }
-
-        final boolean voiceInteraction = containsVoiceInteraction(mDisplayContent.mClosingApps)
-                || containsVoiceInteraction(mDisplayContent.mOpeningApps);
-
-        final int layoutRedo;
-        mService.mSurfaceAnimationRunner.deferStartingAnimations();
-        try {
-            applyAnimations(tmpOpenApps, tmpCloseApps, transit, animLp, voiceInteraction);
-            handleClosingApps();
-            handleOpeningApps();
-            handleChangingApps(transit);
-            handleClosingChangingContainers();
-
-            appTransition.setLastAppTransition(transit, topOpeningApp,
-                    topClosingApp, topChangingApp);
-
-            final int flags = appTransition.getTransitFlags();
-            layoutRedo = appTransition.goodToGo(transit, topOpeningApp);
-            appTransition.postAnimationCallback();
-        } finally {
-            appTransition.clear();
-            mService.mSurfaceAnimationRunner.continueStartingAnimations();
-        }
-
-        mService.mSnapshotController.onTransitionStarting(mDisplayContent);
-
-        mDisplayContent.mOpeningApps.clear();
-        mDisplayContent.mClosingApps.clear();
-        mDisplayContent.mChangingContainers.clear();
-        mDisplayContent.mUnknownAppVisibilityController.clear();
-        mDisplayContent.mClosingChangingContainers.clear();
-
-        // This has changed the visibility of windows, so perform
-        // a new layout to get them all up-to-date.
-        mDisplayContent.setLayoutNeeded();
-
-        mDisplayContent.computeImeTarget(true /* updateImeTarget */);
-
-        mService.mAtmService.mTaskSupervisor.getActivityMetricsLogger().notifyTransitionStarting(
-                mTempTransitionReasons);
-
-        Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
-
-        mDisplayContent.pendingLayoutChanges |=
-                layoutRedo | FINISH_LAYOUT_REDO_LAYOUT | FINISH_LAYOUT_REDO_CONFIG;
-    }
-
-    /**
-     * Get old transit type based on the current transit requests.
-     *
-     * @param appTransition {@link AppTransition} for managing app transition state.
-     * @param openingApps {@link ActivityRecord}s which are becoming visible.
-     * @param closingApps {@link ActivityRecord}s which are becoming invisible.
-     * @param changingContainers {@link WindowContainer}s which are changed in configuration.
-     * @param wallpaperTarget If non-null, this is the currently visible window that is associated
-     *                        with the wallpaper.
-     * @param oldWallpaper The currently visible window that is associated with the wallpaper in
-     *                     case we are transitioning from an activity with a wallpaper to one
-     *                     without. Otherwise null.
-     */
-    @TransitionOldType static int getTransitCompatType(AppTransition appTransition,
-            ArraySet<ActivityRecord> openingApps, ArraySet<ActivityRecord> closingApps,
-            ArraySet<WindowContainer> changingContainers, @Nullable WindowState wallpaperTarget,
-            @Nullable WindowState oldWallpaper, boolean skipAppTransitionAnimation) {
-
-        final ActivityRecord topOpeningApp = getTopApp(openingApps, false /* ignoreHidden */);
-        final ActivityRecord topClosingApp = getTopApp(closingApps, true /* ignoreHidden */);
-
-        // Determine if closing and opening app token sets are wallpaper targets, in which case
-        // special animations are needed.
-        final boolean openingAppHasWallpaper = canBeWallpaperTarget(openingApps)
-                && wallpaperTarget != null;
-        final boolean closingAppHasWallpaper = canBeWallpaperTarget(closingApps)
-                && wallpaperTarget != null;
-
-        // Keyguard transit has high priority.
-        switch (appTransition.getKeyguardTransition()) {
-            case TRANSIT_KEYGUARD_GOING_AWAY:
-                return openingAppHasWallpaper ? TRANSIT_OLD_KEYGUARD_GOING_AWAY_ON_WALLPAPER
-                        : TRANSIT_OLD_KEYGUARD_GOING_AWAY;
-            case TRANSIT_KEYGUARD_OCCLUDE:
-                // When there is a closing app, the keyguard has already been occluded by an
-                // activity, and another activity has started on top of that activity, so normal
-                // app transition animation should be used.
-                if (!closingApps.isEmpty()) {
-                    return TRANSIT_OLD_ACTIVITY_OPEN;
-                }
-                if (!openingApps.isEmpty() && openingApps.valueAt(0).getActivityType()
-                        == ACTIVITY_TYPE_DREAM) {
-                    return TRANSIT_OLD_KEYGUARD_OCCLUDE_BY_DREAM;
-                }
-                return TRANSIT_OLD_KEYGUARD_OCCLUDE;
-            case TRANSIT_KEYGUARD_UNOCCLUDE:
-                return TRANSIT_OLD_KEYGUARD_UNOCCLUDE;
-        }
-
-        // Determine whether the top opening and closing activity is a dream activity. If so, this
-        // has higher priority than others except keyguard transit.
-        if (topOpeningApp != null && topOpeningApp.getActivityType() == ACTIVITY_TYPE_DREAM) {
-            return TRANSIT_OLD_DREAM_ACTIVITY_OPEN;
-        } else if (topClosingApp != null
-                && topClosingApp.getActivityType() == ACTIVITY_TYPE_DREAM) {
-            return TRANSIT_OLD_DREAM_ACTIVITY_CLOSE;
-        }
-
-        // This is not keyguard transition and one of the app has request to skip app transition.
-        if (skipAppTransitionAnimation) {
-            return WindowManager.TRANSIT_OLD_UNSET;
-        }
-        @TransitionFlags final int flags = appTransition.getTransitFlags();
-        @TransitionType final int firstTransit = appTransition.getFirstAppTransition();
-
-        // Special transitions
-        // TODO(new-app-transitions): Revisit if those can be rewritten by using flags.
-        if (appTransition.containsTransitRequest(TRANSIT_CHANGE) && !changingContainers.isEmpty()) {
-            @TransitContainerType int changingType =
-                    getTransitContainerType(changingContainers.valueAt(0));
-            switch (changingType) {
-                case TYPE_TASK:
-                    return TRANSIT_OLD_TASK_CHANGE_WINDOWING_MODE;
-                case TYPE_TASK_FRAGMENT:
-                    return TRANSIT_OLD_TASK_FRAGMENT_CHANGE;
-                default:
-                    throw new IllegalStateException(
-                            "TRANSIT_CHANGE with unrecognized changing type=" + changingType);
-            }
-        }
-        if ((flags & TRANSIT_FLAG_APP_CRASHED) != 0) {
-            return TRANSIT_OLD_CRASHING_ACTIVITY_CLOSE;
-        }
-        if (firstTransit == TRANSIT_NONE) {
-            return TRANSIT_OLD_NONE;
-        }
-
-        /*
-         * There are cases where we open/close a new task/activity, but in reality only a
-         * translucent activity on top of existing activities is opening/closing. For that one, we
-         * have a different animation because non of the task/activity animations actually work well
-         * with translucent apps.
-         */
-        if (isNormalTransit(firstTransit)) {
-            boolean allOpeningVisible = true;
-            boolean allTranslucentOpeningApps = !openingApps.isEmpty();
-            for (int i = openingApps.size() - 1; i >= 0; i--) {
-                final ActivityRecord activity = openingApps.valueAt(i);
-                if (!activity.isVisible()) {
-                    allOpeningVisible = false;
-                    if (activity.fillsParent()) {
-                        allTranslucentOpeningApps = false;
-                    }
-                }
-            }
-            boolean allTranslucentClosingApps = !closingApps.isEmpty();
-            for (int i = closingApps.size() - 1; i >= 0; i--) {
-                if (closingApps.valueAt(i).fillsParent()) {
-                    allTranslucentClosingApps = false;
-                    break;
-                }
-            }
-
-            if (allTranslucentClosingApps && allOpeningVisible) {
-                return TRANSIT_OLD_TRANSLUCENT_ACTIVITY_CLOSE;
-            }
-            if (allTranslucentOpeningApps && closingApps.isEmpty()) {
-                return TRANSIT_OLD_TRANSLUCENT_ACTIVITY_OPEN;
-            }
-        }
-
-        if (closingAppHasWallpaper && openingAppHasWallpaper) {
-            ProtoLog.v(WM_DEBUG_APP_TRANSITIONS, "Wallpaper animation!");
-            switch (firstTransit) {
-                case TRANSIT_OPEN:
-                case TRANSIT_TO_FRONT:
-                    return TRANSIT_OLD_WALLPAPER_INTRA_OPEN;
-                case TRANSIT_CLOSE:
-                case TRANSIT_TO_BACK:
-                    return TRANSIT_OLD_WALLPAPER_INTRA_CLOSE;
-            }
-        } else if (oldWallpaper != null && !openingApps.isEmpty()
-                && !openingApps.contains(oldWallpaper.mActivityRecord)
-                && closingApps.contains(oldWallpaper.mActivityRecord)
-                && topClosingApp == oldWallpaper.mActivityRecord) {
-            // We are transitioning from an activity with a wallpaper to one without.
-            return TRANSIT_OLD_WALLPAPER_CLOSE;
-        } else if (wallpaperTarget != null && wallpaperTarget.isVisible()
-                && openingApps.contains(wallpaperTarget.mActivityRecord)
-                && topOpeningApp == wallpaperTarget.mActivityRecord
-                /* && transit != TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE */) {
-            // We are transitioning from an activity without
-            // a wallpaper to now showing the wallpaper
-            return TRANSIT_OLD_WALLPAPER_OPEN;
-        }
-
-        final ArraySet<WindowContainer> openingWcs = getAnimationTargets(
-                openingApps, closingApps, true /* visible */);
-        final ArraySet<WindowContainer> closingWcs = getAnimationTargets(
-                openingApps, closingApps, false /* visible */);
-        final WindowContainer<?> openingContainer = !openingWcs.isEmpty()
-                ? openingWcs.valueAt(0) : null;
-        final WindowContainer<?> closingContainer = !closingWcs.isEmpty()
-                ? closingWcs.valueAt(0) : null;
-        @TransitContainerType int openingType = getTransitContainerType(openingContainer);
-        @TransitContainerType int closingType = getTransitContainerType(closingContainer);
-        if (appTransition.containsTransitRequest(TRANSIT_TO_FRONT) && openingType == TYPE_TASK) {
-            if (topOpeningApp != null && topOpeningApp.isActivityTypeHome()) {
-                // If we are opening the home task, we want to play an animation as if
-                // the task on top is being brought to back.
-                return TRANSIT_OLD_TASK_TO_BACK;
-            }
-            return TRANSIT_OLD_TASK_TO_FRONT;
-        }
-        if (appTransition.containsTransitRequest(TRANSIT_TO_BACK) && closingType == TYPE_TASK) {
-            return TRANSIT_OLD_TASK_TO_BACK;
-        }
-        if (appTransition.containsTransitRequest(TRANSIT_OPEN)) {
-            if (openingType == TYPE_TASK) {
-                return (appTransition.getTransitFlags() & TRANSIT_FLAG_OPEN_BEHIND) != 0
-                        ? TRANSIT_OLD_TASK_OPEN_BEHIND : TRANSIT_OLD_TASK_OPEN;
-            }
-            if (openingType == TYPE_ACTIVITY) {
-                return TRANSIT_OLD_ACTIVITY_OPEN;
-            }
-            if (openingType == TYPE_TASK_FRAGMENT) {
-                return TRANSIT_OLD_TASK_FRAGMENT_OPEN;
-            }
-        }
-        if (appTransition.containsTransitRequest(TRANSIT_CLOSE)) {
-            if (closingType == TYPE_TASK) {
-                return TRANSIT_OLD_TASK_CLOSE;
-            }
-            if (closingType == TYPE_TASK_FRAGMENT) {
-                return TRANSIT_OLD_TASK_FRAGMENT_CLOSE;
-            }
-            if (closingType == TYPE_ACTIVITY) {
-                for (int i = closingApps.size() - 1; i >= 0; i--) {
-                    if (closingApps.valueAt(i).visibleIgnoringKeyguard) {
-                        return TRANSIT_OLD_ACTIVITY_CLOSE;
-                    }
-                }
-                // Skip close activity transition since no closing app can be visible
-                return WindowManager.TRANSIT_OLD_UNSET;
-            }
-        }
-        if (appTransition.containsTransitRequest(TRANSIT_RELAUNCH)
-                && !openingWcs.isEmpty() && !openingApps.isEmpty()) {
-            return TRANSIT_OLD_ACTIVITY_RELAUNCH;
-        }
-        return TRANSIT_OLD_NONE;
-    }
-
-    @TransitContainerType
-    private static int getTransitContainerType(@Nullable WindowContainer<?> container) {
-        if (container == null) {
-            return TYPE_NONE;
-        }
-        if (container.asTask() != null) {
-            return TYPE_TASK;
-        }
-        if (container.asTaskFragment() != null) {
-            return TYPE_TASK_FRAGMENT;
-        }
-        if (container.asActivityRecord() != null) {
-            return TYPE_ACTIVITY;
-        }
-        return TYPE_NONE;
-    }
-
-    @Nullable
-    private static WindowManager.LayoutParams getAnimLp(ActivityRecord activity) {
-        final WindowState mainWindow = activity != null ? activity.findMainWindow() : null;
-        return mainWindow != null ? mainWindow.mAttrs : null;
-    }
-
-    RemoteAnimationAdapter getRemoteAnimationOverride(@Nullable WindowContainer container,
-            @TransitionOldType int transit, ArraySet<Integer> activityTypes) {
-        if (container != null) {
-            final RemoteAnimationDefinition definition = container.getRemoteAnimationDefinition();
-            if (definition != null) {
-                final RemoteAnimationAdapter adapter = definition.getAdapter(transit,
-                        activityTypes);
-                if (adapter != null) {
-                    return adapter;
-                }
-            }
-        }
-        return mRemoteAnimationDefinition != null
-                ? mRemoteAnimationDefinition.getAdapter(transit, activityTypes)
-                : null;
-    }
-
-    private boolean transitionMayContainNonAppWindows(@TransitionOldType int transit) {
-        // We don't want to have the client to animate any non-app windows.
-        // Having {@code transit} of those types doesn't mean it will contain non-app windows, but
-        // non-app windows will only be included with those transition types. And we don't currently
-        // have any use case of those for TaskFragment transition.
-        return shouldStartNonAppWindowAnimationsForKeyguardExit(transit)
-                || shouldAttachNavBarToApp(mService, mDisplayContent, transit)
-                || shouldStartWallpaperAnimation(mDisplayContent);
-    }
-
-    /**
-     * Whether the transition contains any embedded {@link TaskFragment} that does not fill the
-     * parent {@link Task} before or after the transition.
-     */
-    private boolean transitionContainsTaskFragmentWithBoundsOverride() {
-        for (int i = mDisplayContent.mChangingContainers.size() - 1; i >= 0; i--) {
-            final WindowContainer wc = mDisplayContent.mChangingContainers.valueAt(i);
-            if (wc.isEmbedded()) {
-                // Contains embedded TaskFragment with bounds changed.
-                return true;
-            }
-        }
-        mTempTransitionWindows.clear();
-        mTempTransitionWindows.addAll(mDisplayContent.mClosingApps);
-        mTempTransitionWindows.addAll(mDisplayContent.mOpeningApps);
-        boolean containsTaskFragmentWithBoundsOverride = false;
-        for (int i = mTempTransitionWindows.size() - 1; i >= 0; i--) {
-            final ActivityRecord r = mTempTransitionWindows.get(i).asActivityRecord();
-            final TaskFragment tf = r.getTaskFragment();
-            if (tf != null && tf.isEmbeddedWithBoundsOverride()) {
-                containsTaskFragmentWithBoundsOverride = true;
-                break;
-            }
-        }
-        mTempTransitionWindows.clear();
-        return containsTaskFragmentWithBoundsOverride;
-    }
-
-    /**
-     * Finds the common parent {@link Task} that is parent of all embedded app windows in the
-     * current transition.
-     * @return {@code null} if app windows in the transition are not children of the same Task, or
-     *         if none of the app windows is embedded.
-     */
-    @Nullable
-    private Task findParentTaskForAllEmbeddedWindows() {
-        mTempTransitionWindows.clear();
-        mTempTransitionWindows.addAll(mDisplayContent.mClosingApps);
-        mTempTransitionWindows.addAll(mDisplayContent.mOpeningApps);
-        mTempTransitionWindows.addAll(mDisplayContent.mChangingContainers);
-
-        // It should only animated by the organizer if all windows are below the same leaf Task.
-        Task leafTask = null;
-        for (int i = mTempTransitionWindows.size() - 1; i >= 0; i--) {
-            final ActivityRecord r = getAppFromContainer(mTempTransitionWindows.get(i));
-            if (r == null) {
-                leafTask = null;
-                break;
-            }
-            // There are also cases where the Task contains non-embedded activity, such as launching
-            // split TaskFragments from a non-embedded activity.
-            // The hierarchy may looks like this:
-            // - Task
-            //    - Activity
-            //    - TaskFragment
-            //       - Activity
-            //    - TaskFragment
-            //       - Activity
-            // We also want to have the organizer handle the transition for such case.
-            final Task task = r.getTask();
-            // We don't support embedding in PiP, leave the animation to the PipTaskOrganizer.
-            if (task == null || task.inPinnedWindowingMode()) {
-                leafTask = null;
-                break;
-            }
-            // We don't want the organizer to handle transition of other non-embedded Task.
-            if (leafTask != null && leafTask != task) {
-                leafTask = null;
-                break;
-            }
-            final ActivityRecord rootActivity = task.getRootActivity();
-            // We don't want the organizer to handle transition when the whole app is closing.
-            if (rootActivity == null) {
-                leafTask = null;
-                break;
-            }
-            // We don't want the organizer to handle transition of non-embedded activity of other
-            // app.
-            if (r.getUid() != task.effectiveUid && !r.isEmbedded()) {
-                leafTask = null;
-                break;
-            }
-            leafTask = task;
-        }
-        mTempTransitionWindows.clear();
-        return leafTask;
-    }
-
-    /**
-     * Finds the common {@link android.window.TaskFragmentOrganizer} that organizes all embedded
-     * {@link TaskFragment} belong to the given {@link Task}.
-     * @return {@code null} if there is no such organizer, or if there are more than one.
-     */
-    @Nullable
-    private ITaskFragmentOrganizer findTaskFragmentOrganizer(@Nullable Task task) {
-        if (task == null) {
-            return null;
-        }
-        // We don't support remote animation for Task with multiple TaskFragmentOrganizers.
-        final ITaskFragmentOrganizer[] organizer = new ITaskFragmentOrganizer[1];
-        final boolean hasMultipleOrganizers = task.forAllLeafTaskFragments(taskFragment -> {
-            final ITaskFragmentOrganizer tfOrganizer = taskFragment.getTaskFragmentOrganizer();
-            if (tfOrganizer == null) {
-                return false;
-            }
-            if (organizer[0] != null && !organizer[0].asBinder().equals(tfOrganizer.asBinder())) {
-                return true;
-            }
-            organizer[0] = tfOrganizer;
-            return false;
-        });
-        if (hasMultipleOrganizers) {
-            ProtoLog.e(WM_DEBUG_APP_TRANSITIONS, "We don't support remote animation for"
-                    + " Task with multiple TaskFragmentOrganizers.");
-            return null;
-        }
-        return organizer[0];
-    }
-
-    /**
-     * Overrides the pending transition with the remote animation defined by the
-     * {@link ITaskFragmentOrganizer} if all windows in the transition are children of
-     * {@link TaskFragment} that are organized by the same organizer.
-     *
-     * @return {@code true} if the transition is overridden.
-     */
-    private boolean overrideWithTaskFragmentRemoteAnimation(@TransitionOldType int transit,
-            ArraySet<Integer> activityTypes) {
-        if (transitionMayContainNonAppWindows(transit)) {
-            return false;
-        }
-        if (!transitionContainsTaskFragmentWithBoundsOverride()) {
-            // No need to play TaskFragment remote animation if all embedded TaskFragment in the
-            // transition fill the Task.
-            return false;
-        }
-
-        final Task task = findParentTaskForAllEmbeddedWindows();
-        final ITaskFragmentOrganizer organizer = findTaskFragmentOrganizer(task);
-        final RemoteAnimationDefinition definition = organizer != null
-                ? mDisplayContent.mAtmService.mTaskFragmentOrganizerController
-                    .getRemoteAnimationDefinition(organizer)
-                : null;
-        final RemoteAnimationAdapter adapter = definition != null
-                ? definition.getAdapter(transit, activityTypes)
-                : null;
-        if (adapter == null) {
-            return false;
-        }
-        mDisplayContent.mAppTransition.overridePendingAppTransitionRemote(
-                adapter, false /* sync */, true /*isActivityEmbedding*/);
-        ProtoLog.v(WM_DEBUG_APP_TRANSITIONS,
-                "Override with TaskFragment remote animation for transit=%s",
-                AppTransition.appTransitionOldToString(transit));
-
-        final int organizerUid = mDisplayContent.mAtmService.mTaskFragmentOrganizerController
-                .getTaskFragmentOrganizerUid(organizer);
-        final boolean shouldDisableInputForRemoteAnimation = !task.isFullyTrustedEmbedding(
-                organizerUid);
-        final RemoteAnimationController remoteAnimationController =
-                mDisplayContent.mAppTransition.getRemoteAnimationController();
-        if (shouldDisableInputForRemoteAnimation && remoteAnimationController != null) {
-            // We are going to use client-driven animation, Disable all input on activity windows
-            // during the animation (unless it is fully trusted) to ensure it is safe to allow
-            // client to animate the surfaces.
-            // This is needed for all activity windows in the animation Task.
-            remoteAnimationController.setOnRemoteAnimationReady(() -> {
-                final Consumer<ActivityRecord> updateActivities =
-                        activity -> activity.setDropInputForAnimation(true);
-                task.forAllActivities(updateActivities);
-            });
-            ProtoLog.d(WM_DEBUG_APP_TRANSITIONS, "Task=%d contains embedded TaskFragment."
-                    + " Disabled all input during TaskFragment remote animation.", task.mTaskId);
-        }
-        return true;
-    }
-
-    /**
-     * Overrides the pending transition with the remote animation defined for the transition in the
-     * set of defined remote animations in the app window token.
-     */
-    private void overrideWithRemoteAnimationIfSet(@Nullable ActivityRecord animLpActivity,
-            @TransitionOldType int transit, ArraySet<Integer> activityTypes) {
-        RemoteAnimationAdapter adapter = null;
-        if (transit == TRANSIT_OLD_CRASHING_ACTIVITY_CLOSE) {
-            // The crash transition has higher priority than any involved remote animations.
-        } else if (AppTransition.isKeyguardGoingAwayTransitOld(transit)) {
-            adapter = mRemoteAnimationDefinition != null
-                    ? mRemoteAnimationDefinition.getAdapter(transit, activityTypes)
-                    : null;
-        } else if (mDisplayContent.mAppTransition.getRemoteAnimationController() == null) {
-            adapter = getRemoteAnimationOverride(animLpActivity, transit, activityTypes);
-        }
-        if (adapter != null) {
-            mDisplayContent.mAppTransition.overridePendingAppTransitionRemote(adapter);
-        }
-    }
-
-    @Nullable
-    static Task findRootTaskFromContainer(WindowContainer wc) {
-        return wc.asTaskFragment() != null ? wc.asTaskFragment().getRootTask()
-                : wc.asActivityRecord().getRootTask();
-    }
-
-    @Nullable
-    static ActivityRecord getAppFromContainer(WindowContainer wc) {
-        return wc.asTaskFragment() != null ? wc.asTaskFragment().getTopNonFinishingActivity()
-                : wc.asActivityRecord();
-    }
-
-    /**
-     * @return The window token that determines the animation theme.
-     */
-    @Nullable
-    private ActivityRecord findAnimLayoutParamsToken(@TransitionOldType int transit,
-            ArraySet<Integer> activityTypes, ArraySet<ActivityRecord> openingApps,
-            ArraySet<ActivityRecord> closingApps, ArraySet<WindowContainer> changingApps) {
-        ActivityRecord result;
-
-        // Remote animations always win, but fullscreen tokens override non-fullscreen tokens.
-        result = lookForHighestTokenWithFilter(closingApps, openingApps, changingApps,
-                w -> w.getRemoteAnimationDefinition() != null
-                        && w.getRemoteAnimationDefinition().hasTransition(transit, activityTypes));
-        if (result != null) {
-            return result;
-        }
-        result = lookForHighestTokenWithFilter(closingApps, openingApps, changingApps,
-                w -> w.fillsParent() && w.findMainWindow() != null);
-        if (result != null) {
-            return result;
-        }
-        return lookForHighestTokenWithFilter(closingApps, openingApps, changingApps,
-                w -> w.findMainWindow() != null);
-    }
-
-    /**
-     * @return The set of {@link android.app.WindowConfiguration.ActivityType}s contained in the set
-     *         of apps in {@code array1}, {@code array2}, and {@code array3}.
-     */
-    private static ArraySet<Integer> collectActivityTypes(ArraySet<ActivityRecord> array1,
-            ArraySet<ActivityRecord> array2, ArraySet<WindowContainer> array3) {
-        final ArraySet<Integer> result = new ArraySet<>();
-        for (int i = array1.size() - 1; i >= 0; i--) {
-            result.add(array1.valueAt(i).getActivityType());
-        }
-        for (int i = array2.size() - 1; i >= 0; i--) {
-            result.add(array2.valueAt(i).getActivityType());
-        }
-        for (int i = array3.size() - 1; i >= 0; i--) {
-            result.add(array3.valueAt(i).getActivityType());
-        }
-        return result;
-    }
-
-    private static ActivityRecord lookForHighestTokenWithFilter(ArraySet<ActivityRecord> array1,
-            ArraySet<ActivityRecord> array2, ArraySet<WindowContainer> array3,
-            Predicate<ActivityRecord> filter) {
-        final int array2base = array1.size();
-        final int array3base = array2.size() + array2base;
-        final int count = array3base + array3.size();
-        int bestPrefixOrderIndex = Integer.MIN_VALUE;
-        ActivityRecord bestToken = null;
-        for (int i = 0; i < count; i++) {
-            final WindowContainer wtoken = i < array2base
-                    ? array1.valueAt(i)
-                    : (i < array3base
-                            ? array2.valueAt(i - array2base)
-                            : array3.valueAt(i - array3base));
-            final int prefixOrderIndex = wtoken.getPrefixOrderIndex();
-            final ActivityRecord r = getAppFromContainer(wtoken);
-            if (r != null && filter.test(r) && prefixOrderIndex > bestPrefixOrderIndex) {
-                bestPrefixOrderIndex = prefixOrderIndex;
-                bestToken = r;
-            }
-        }
-        return bestToken;
-    }
-
-    private boolean containsVoiceInteraction(ArraySet<ActivityRecord> apps) {
-        for (int i = apps.size() - 1; i >= 0; i--) {
-            if (apps.valueAt(i).mVoiceInteraction) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Apply animation to the set of window containers.
-     *
-     * @param wcs The list of {@link WindowContainer}s to which an app transition animation applies.
-     * @param apps The list of {@link ActivityRecord}s being transitioning.
-     * @param transit The current transition type.
-     * @param visible {@code true} if the apps becomes visible, {@code false} if the apps becomes
-     *                invisible.
-     * @param animLp Layout parameters in which an app transition animation runs.
-     * @param voiceInteraction {@code true} if one of the apps in this transition belongs to a voice
-     *                         interaction session driving task.
-     */
-    private void applyAnimations(ArraySet<WindowContainer> wcs, ArraySet<ActivityRecord> apps,
-            @TransitionOldType int transit, boolean visible, LayoutParams animLp,
-            boolean voiceInteraction) {
-        final int wcsCount = wcs.size();
-        for (int i = 0; i < wcsCount; i++) {
-            final WindowContainer wc = wcs.valueAt(i);
-            // If app transition animation target is promoted to higher level, SurfaceAnimator
-            // triggers WC#onAnimationFinished only on the promoted target. So we need to take care
-            // of triggering AR#onAnimationFinished on each ActivityRecord which is a part of the
-            // app transition.
-            final ArrayList<ActivityRecord> transitioningDescendants = new ArrayList<>();
-            for (int j = 0; j < apps.size(); ++j) {
-                final ActivityRecord app = apps.valueAt(j);
-                if (app.isDescendantOf(wc)) {
-                    transitioningDescendants.add(app);
-                }
-            }
-            wc.applyAnimation(animLp, transit, visible, voiceInteraction, transitioningDescendants);
-        }
-    }
-
-    /**
-     * Returns {@code true} if a given {@link WindowContainer} is an embedded Task in
-     * {@link TaskView}.
-     *
-     * Note that this is a short term workaround to support Android Auto until it migrate to
-     * ShellTransition. This should only be used by {@link #getAnimationTargets}.
-     *
-     * TODO(b/213312721): Remove this predicate and its callers once ShellTransition is enabled.
-     */
-    static boolean isTaskViewTask(WindowContainer wc) {
-        // Use Task#mRemoveWithTaskOrganizer to identify an embedded Task, but this is a hack and
-        // it is not guaranteed to work this logic in the future version.
-        boolean isTaskViewTask =  wc instanceof Task && ((Task) wc).mRemoveWithTaskOrganizer;
-        if (isTaskViewTask) {
-            return true;
-        }
-
-        WindowContainer parent = wc.getParent();
-        boolean isParentATaskViewTask = parent != null
-                && parent instanceof Task
-                && ((Task) parent).mRemoveWithTaskOrganizer;
-        return isParentATaskViewTask;
-    }
-
-    /**
-     * Find WindowContainers to be animated from a set of opening and closing apps. We will promote
-     * animation targets to higher level in the window hierarchy if possible.
-     *
-     * @param visible {@code true} to get animation targets for opening apps, {@code false} to get
-     *                            animation targets for closing apps.
-     * @return {@link WindowContainer}s to be animated.
-     */
-    @VisibleForTesting
-    static ArraySet<WindowContainer> getAnimationTargets(
-            ArraySet<ActivityRecord> openingApps, ArraySet<ActivityRecord> closingApps,
-            boolean visible) {
-
-        // The candidates of animation targets, which might be able to promote to higher level.
-        final ArrayDeque<WindowContainer> candidates = new ArrayDeque<>();
-        final ArraySet<ActivityRecord> apps = visible ? openingApps : closingApps;
-        for (int i = 0; i < apps.size(); ++i) {
-            final ActivityRecord app = apps.valueAt(i);
-            if (app.shouldApplyAnimation(visible)) {
-                candidates.add(app);
-                ProtoLog.v(WM_DEBUG_APP_TRANSITIONS,
-                        "Changing app %s visible=%b performLayout=%b",
-                        app, app.isVisible(), false);
-            }
-        }
-
-        final ArraySet<ActivityRecord> otherApps = visible ? closingApps : openingApps;
-        // Ancestors of closing apps while finding animation targets for opening apps, or ancestors
-        // of opening apps while finding animation targets for closing apps.
-        final ArraySet<WindowContainer> otherAncestors = new ArraySet<>();
-        for (int i = 0; i < otherApps.size(); ++i) {
-            for (WindowContainer wc = otherApps.valueAt(i); wc != null; wc = wc.getParent()) {
-                otherAncestors.add(wc);
-            }
-        }
-
-        // The final animation targets which cannot promote to higher level anymore.
-        final ArraySet<WindowContainer> targets = new ArraySet<>();
-        final ArrayList<WindowContainer> siblings = new ArrayList<>();
-        while (!candidates.isEmpty()) {
-            final WindowContainer current = candidates.removeFirst();
-            final WindowContainer parent = current.getParent();
-            siblings.clear();
-            siblings.add(current);
-            boolean canPromote = true;
-
-            if (isTaskViewTask(current)) {
-                // Don't animate an embedded Task in app transition. This is a short term workaround
-                // to prevent conflict of surface hierarchy changes between legacy app transition
-                // and TaskView (b/205189147).
-                // TODO(b/213312721): Remove this once ShellTransition is enabled.
-                continue;
-            } else if (parent == null || !parent.canCreateRemoteAnimationTarget()
-                    // We cannot promote the animation on Task's parent when the task is in
-                    // clearing task in case the animating get stuck when performing the opening
-                    // task that behind it.
-                    || (current.asTask() != null && current.asTask().mInRemoveTask)
-                    // We cannot promote the animation to changing window. This may happen when an
-                    // activity is open in a TaskFragment that is resizing, while the existing
-                    // activity in the TaskFragment is reparented to another TaskFragment.
-                    || parent.isChangingAppTransition()) {
-                canPromote = false;
-            } else {
-                // In case a descendant of the parent belongs to the other group, we cannot promote
-                // the animation target from "current" to the parent.
-                //
-                // Example: Imagine we're checking if we can animate a Task instead of a set of
-                // ActivityRecords. In case an activity starts a new activity within a same Task,
-                // an ActivityRecord of an existing activity belongs to the opening apps, at the
-                // same time, the other ActivityRecord of a new activity belongs to the closing
-                // apps. In this case, we cannot promote the animation target to Task level, but
-                // need to animate each individual activity.
-                //
-                // [Task] +- [ActivityRecord1] (in opening apps)
-                //        +- [ActivityRecord2] (in closing apps)
-                if (otherAncestors.contains(parent)) {
-                    canPromote = false;
-                }
-
-                // If the current window container is a task with adjacent task set, the both
-                // adjacent tasks will be opened or closed together. To get their opening or
-                // closing animation target independently, skip promoting their animation targets.
-                if (current.asTask() != null && current.asTask().hasAdjacentTask()) {
-                    canPromote = false;
-                }
-
-                // Find all siblings of the current WindowContainer in "candidates", move them into
-                // a separate list "siblings", and checks if an animation target can be promoted
-                // to its parent.
-                //
-                // We can promote an animation target to its parent if and only if all visible
-                // siblings will be animating.
-                //
-                // Example: Imagine that a Task contains two visible activity record, but only one
-                // of them is included in the opening apps and the other belongs to neither opening
-                // or closing apps. This happens when an activity launches another translucent
-                // activity in the same Task. In this case, we cannot animate Task, but have to
-                // animate each activity, otherwise an activity behind the translucent activity also
-                // animates.
-                //
-                // [Task] +- [ActivityRecord1] (visible, in opening apps)
-                //        +- [ActivityRecord2] (visible, not in opening apps)
-                for (int j = 0; j < parent.getChildCount(); ++j) {
-                    final WindowContainer sibling = parent.getChildAt(j);
-                    if (candidates.remove(sibling)) {
-                        if (!isTaskViewTask(sibling)) {
-                            // Don't animate an embedded Task in app transition. This is a short
-                            // term workaround to prevent conflict of surface hierarchy changes
-                            // between legacy app transition and TaskView (b/205189147).
-                            // TODO(b/213312721): Remove this once ShellTransition is enabled.
-                            siblings.add(sibling);
-                        }
-                    } else if (sibling != current && sibling.isVisible()) {
-                        canPromote = false;
-                    }
-                }
-            }
-
-            if (canPromote) {
-                candidates.add(parent);
-            } else {
-                targets.addAll(siblings);
-            }
-        }
-        ProtoLog.v(WM_DEBUG_APP_TRANSITIONS_ANIM, "getAnimationTarget in=%s, out=%s",
-                apps, targets);
-        return targets;
-    }
-
-    /**
-     * Apply an app transition animation based on a set of {@link ActivityRecord}
-     *
-     * @param openingApps The list of opening apps to which an app transition animation applies.
-     * @param closingApps The list of closing apps to which an app transition animation applies.
-     * @param transit The current transition type.
-     * @param animLp Layout parameters in which an app transition animation runs.
-     * @param voiceInteraction {@code true} if one of the apps in this transition belongs to a voice
-     *                         interaction session driving task.
-     */
-    private void applyAnimations(ArraySet<ActivityRecord> openingApps,
-            ArraySet<ActivityRecord> closingApps, @TransitionOldType int transit,
-            LayoutParams animLp, boolean voiceInteraction) {
-        if (transit == WindowManager.TRANSIT_OLD_UNSET
-                || (openingApps.isEmpty() && closingApps.isEmpty())) {
-            return;
-        }
-
-        if (AppTransition.isActivityTransitOld(transit)) {
-            final ArrayList<Pair<ActivityRecord, Rect>> closingLetterboxes = new ArrayList();
-            for (int i = 0; i < closingApps.size(); ++i) {
-                ActivityRecord closingApp = closingApps.valueAt(i);
-                if (closingApp.areBoundsLetterboxed()) {
-                    final Rect insets = closingApp.getLetterboxInsets();
-                    closingLetterboxes.add(new Pair(closingApp, insets));
-                }
-            }
-
-            for (int i = 0; i < openingApps.size(); ++i) {
-                ActivityRecord openingApp = openingApps.valueAt(i);
-                if (openingApp.areBoundsLetterboxed()) {
-                    final Rect openingInsets = openingApp.getLetterboxInsets();
-                    for (Pair<ActivityRecord, Rect> closingLetterbox : closingLetterboxes) {
-                        final Rect closingInsets = closingLetterbox.second;
-                        if (openingInsets.equals(closingInsets)) {
-                            ActivityRecord closingApp = closingLetterbox.first;
-                            openingApp.setNeedsLetterboxedAnimation(true);
-                            closingApp.setNeedsLetterboxedAnimation(true);
-                        }
-                    }
-                }
-            }
-        }
-
-        final ArraySet<WindowContainer> openingWcs = getAnimationTargets(
-                openingApps, closingApps, true /* visible */);
-        final ArraySet<WindowContainer> closingWcs = getAnimationTargets(
-                openingApps, closingApps, false /* visible */);
-        applyAnimations(openingWcs, openingApps, transit, true /* visible */, animLp,
-                voiceInteraction);
-        applyAnimations(closingWcs, closingApps, transit, false /* visible */, animLp,
-                voiceInteraction);
-
-        for (int i = 0; i < openingApps.size(); ++i) {
-            openingApps.valueAtUnchecked(i).mOverrideTaskTransition = false;
-        }
-        for (int i = 0; i < closingApps.size(); ++i) {
-            closingApps.valueAtUnchecked(i).mOverrideTaskTransition = false;
-        }
-
-        final AccessibilityController accessibilityController =
-                mDisplayContent.mWmService.mAccessibilityController;
-        if (accessibilityController.hasCallbacks()) {
-            accessibilityController.onAppWindowTransition(mDisplayContent.getDisplayId(), transit);
-        }
-    }
-
-    private void handleOpeningApps() {
-        final ArraySet<ActivityRecord> openingApps = mDisplayContent.mOpeningApps;
-        final int appsCount = openingApps.size();
-
-        for (int i = 0; i < appsCount; i++) {
-            final ActivityRecord app = openingApps.valueAt(i);
-            ProtoLog.v(WM_DEBUG_APP_TRANSITIONS, "Now opening app %s", app);
-
-            app.commitVisibility(true /* visible */, false /* performLayout */);
-
-            // In case a trampoline activity is used, it can happen that a new ActivityRecord is
-            // added and a new app transition starts before the previous app transition animation
-            // ends. So we cannot simply use app.isAnimating(PARENTS) to determine if the app must
-            // to be added to the list of tokens to be notified of app transition complete.
-            final WindowContainer wc = app.getAnimatingContainer(PARENTS,
-                    ANIMATION_TYPE_APP_TRANSITION);
-            if (wc == null || !wc.getAnimationSources().contains(app)) {
-                // This token isn't going to be animating. Add it to the list of tokens to
-                // be notified of app transition complete since the notification will not be
-                // sent be the app window animator.
-                mDisplayContent.mNoAnimationNotifyOnTransitionFinished.add(app.token);
-            }
-            app.updateReportedVisibilityLocked();
-            app.showAllWindowsLocked();
-
-            if (mDisplayContent.mAppTransition.isNextAppTransitionThumbnailUp()) {
-                app.attachThumbnailAnimation();
-            } else if (mDisplayContent.mAppTransition.isNextAppTransitionOpenCrossProfileApps()) {
-                app.attachCrossProfileAppsThumbnailAnimation();
-            }
-        }
-    }
-
-    private void handleClosingApps() {
-        final ArraySet<ActivityRecord> closingApps = mDisplayContent.mClosingApps;
-        final int appsCount = closingApps.size();
-
-        for (int i = 0; i < appsCount; i++) {
-            final ActivityRecord app = closingApps.valueAt(i);
-            ProtoLog.v(WM_DEBUG_APP_TRANSITIONS, "Now closing app %s", app);
-
-            app.commitVisibility(false /* visible */, false /* performLayout */);
-            app.updateReportedVisibilityLocked();
-            // Force the allDrawn flag, because we want to start
-            // this guy's animations regardless of whether it's
-            // gotten drawn.
-            app.allDrawn = true;
-            // Ensure that apps that are mid-starting are also scheduled to have their
-            // starting windows removed after the animation is complete
-            if (app.mStartingWindow != null && !app.mStartingWindow.mAnimatingExit) {
-                app.removeStartingWindow();
-            }
-
-            if (mDisplayContent.mAppTransition.isNextAppTransitionThumbnailDown()) {
-                app.attachThumbnailAnimation();
-            }
-        }
-    }
-
-    private void handleClosingChangingContainers() {
-        final ArrayMap<WindowContainer, Rect> containers =
-                mDisplayContent.mClosingChangingContainers;
-        while (!containers.isEmpty()) {
-            final WindowContainer container = containers.keyAt(0);
-            containers.remove(container);
-
-            // For closing changing windows that are part of the transition, they should have been
-            // removed from mClosingChangingContainers in WindowContainer#getAnimationAdapter()
-            // If the closing changing TaskFragment is not part of the transition, update its
-            // surface after removing it from mClosingChangingContainers.
-            final TaskFragment taskFragment = container.asTaskFragment();
-            if (taskFragment != null) {
-                taskFragment.updateOrganizedTaskFragmentSurface();
-            }
-        }
-    }
-
-    private void handleChangingApps(@TransitionOldType int transit) {
-        final ArraySet<WindowContainer> apps = mDisplayContent.mChangingContainers;
-        final int appsCount = apps.size();
-        for (int i = 0; i < appsCount; i++) {
-            WindowContainer wc = apps.valueAt(i);
-            ProtoLog.v(WM_DEBUG_APP_TRANSITIONS, "Now changing app %s", wc);
-            wc.applyAnimation(null, transit, true, false, null /* sources */);
-        }
-    }
-
-    private boolean transitionGoodToGo(ArraySet<? extends WindowContainer> apps,
-            ArrayMap<WindowContainer, Integer> outReasons) {
-        ProtoLog.v(WM_DEBUG_APP_TRANSITIONS,
-                "Checking %d opening apps (timeout=%b)...", apps.size(),
-                mDisplayContent.mAppTransition.isTimeout());
-        if (mDisplayContent.mAppTransition.isTimeout()) {
-            return true;
-        }
-
-        for (int i = 0; i < apps.size(); i++) {
-            WindowContainer wc = apps.valueAt(i);
-            final ActivityRecord activity = getAppFromContainer(wc);
-            if (activity == null) {
-                continue;
-            }
-            ProtoLog.v(WM_DEBUG_APP_TRANSITIONS,
-                    "Check opening app=%s: allDrawn=%b startingDisplayed=%b "
-                            + "startingMoved=%b isRelaunching()=%b startingWindow=%s",
-                    activity, activity.allDrawn, activity.isStartingWindowDisplayed(),
-                    activity.startingMoved, activity.isRelaunching(),
-                    activity.mStartingWindow);
-            final boolean allDrawn = activity.allDrawn && !activity.isRelaunching();
-            if (!allDrawn && !activity.isStartingWindowDisplayed() && !activity.startingMoved) {
-                return false;
-            }
-            if (allDrawn) {
-                outReasons.put(activity, APP_TRANSITION_WINDOWS_DRAWN);
-            } else {
-                outReasons.put(activity,
-                        activity.mStartingData instanceof SplashScreenStartingData
-                                ? APP_TRANSITION_SPLASH_SCREEN
-                                : APP_TRANSITION_SNAPSHOT);
-            }
-        }
-
-        // We also need to wait for the specs to be fetched, if needed.
-        if (mDisplayContent.mAppTransition.isFetchingAppTransitionsSpecs()) {
-            ProtoLog.v(WM_DEBUG_APP_TRANSITIONS, "isFetchingAppTransitionSpecs=true");
-            return false;
-        }
-
-        if (!mDisplayContent.mUnknownAppVisibilityController.allResolved()) {
-            ProtoLog.v(WM_DEBUG_APP_TRANSITIONS, "unknownApps is not empty: %s",
-                    mDisplayContent.mUnknownAppVisibilityController.getDebugMessage());
-            return false;
-        }
-
-        // If the wallpaper is visible, we need to check it's ready too.
-        return !mWallpaperControllerLocked.isWallpaperVisible()
-                || mWallpaperControllerLocked.wallpaperTransitionReady();
-    }
-
-    private boolean transitionGoodToGoForTaskFragments() {
-        if (mDisplayContent.mAppTransition.isTimeout()) {
-            return true;
-        }
-
-        // Check all Tasks in this transition. This is needed because new TaskFragment created for
-        // launching activity may not be in the tracking lists, but we still want to wait for the
-        // activity launch to start the transition.
-        final ArraySet<Task> rootTasks = new ArraySet<>();
-        for (int i = mDisplayContent.mOpeningApps.size() - 1; i >= 0; i--) {
-            rootTasks.add(mDisplayContent.mOpeningApps.valueAt(i).getRootTask());
-        }
-        for (int i = mDisplayContent.mClosingApps.size() - 1; i >= 0; i--) {
-            rootTasks.add(mDisplayContent.mClosingApps.valueAt(i).getRootTask());
-        }
-        for (int i = mDisplayContent.mChangingContainers.size() - 1; i >= 0; i--) {
-            rootTasks.add(
-                    findRootTaskFromContainer(mDisplayContent.mChangingContainers.valueAt(i)));
-        }
-
-        // Organized TaskFragment can be empty for two situations:
-        // 1. New created and is waiting for Activity launch. In this case, we want to wait for
-        //    the Activity launch to trigger the transition.
-        // 2. Last Activity is just removed. In this case, we want to wait for organizer to
-        //    remove the TaskFragment because it may also want to change other TaskFragments in
-        //    the same transition.
-        for (int i = rootTasks.size() - 1; i >= 0; i--) {
-            final Task rootTask = rootTasks.valueAt(i);
-            if (rootTask == null) {
-                // It is possible that one activity may have been removed from the hierarchy. No
-                // need to check for this case.
-                continue;
-            }
-            final boolean notReady = rootTask.forAllLeafTaskFragments(taskFragment -> {
-                if (!taskFragment.isReadyToTransit()) {
-                    ProtoLog.v(WM_DEBUG_APP_TRANSITIONS, "Organized TaskFragment is not ready= %s",
-                            taskFragment);
-                    return true;
-                }
-                return false;
-            });
-            if (notReady) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * Identifies whether the current transition occurs within a single task or not. This is used
-     * to determine whether animations should be clipped to the task bounds instead of root task
-     * bounds.
-     */
-    @VisibleForTesting
-    boolean isTransitWithinTask(@TransitionOldType int transit, Task task) {
-        if (task == null
-                || !mDisplayContent.mChangingContainers.isEmpty()) {
-            // if there is no task, then we can't constrain to the task.
-            // if anything is changing, it can animate outside its task.
-            return false;
-        }
-        if (!(transit == TRANSIT_OLD_ACTIVITY_OPEN
-                || transit == TRANSIT_OLD_ACTIVITY_CLOSE
-                || transit == TRANSIT_OLD_ACTIVITY_RELAUNCH)) {
-            // only activity-level transitions will be within-task.
-            return false;
-        }
-        // check that all components are in the task.
-        for (ActivityRecord activity : mDisplayContent.mOpeningApps) {
-            Task activityTask = activity.getTask();
-            if (activityTask != task) {
-                return false;
-            }
-        }
-        for (ActivityRecord activity : mDisplayContent.mClosingApps) {
-            if (activity.getTask() != task) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    private static boolean canBeWallpaperTarget(ArraySet<ActivityRecord> apps) {
-        for (int i = apps.size() - 1; i >= 0; i--) {
-            if (apps.valueAt(i).windowsCanBeWallpaperTarget()) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Finds the top app in a list of apps, using its {@link ActivityRecord#getPrefixOrderIndex} to
-     * compare z-order.
-     *
-     * @param apps The list of apps to search.
-     * @param ignoreInvisible If set to true, ignores apps that are not
-     *                        {@link ActivityRecord#isVisible}.
-     * @return The top {@link ActivityRecord}.
-     */
-    private static ActivityRecord getTopApp(ArraySet<? extends WindowContainer> apps,
-            boolean ignoreInvisible) {
-        int topPrefixOrderIndex = Integer.MIN_VALUE;
-        ActivityRecord topApp = null;
-        for (int i = apps.size() - 1; i >= 0; i--) {
-            final ActivityRecord app = getAppFromContainer(apps.valueAt(i));
-            if (app == null || ignoreInvisible && !app.isVisible()) {
-                continue;
-            }
-            final int prefixOrderIndex = app.getPrefixOrderIndex();
-            if (prefixOrderIndex > topPrefixOrderIndex) {
-                topPrefixOrderIndex = prefixOrderIndex;
-                topApp = app;
-            }
-        }
-        return topApp;
-    }
-}
diff --git a/services/core/java/com/android/server/wm/BackNavigationController.java b/services/core/java/com/android/server/wm/BackNavigationController.java
index e76a834..094ad18 100644
--- a/services/core/java/com/android/server/wm/BackNavigationController.java
+++ b/services/core/java/com/android/server/wm/BackNavigationController.java
@@ -190,7 +190,9 @@
             currentActivity = window.mActivityRecord;
             currentTask = window.getTask();
             if ((currentTask != null && !currentTask.isVisibleRequested())
-                    || (currentActivity != null && !currentActivity.isVisibleRequested())) {
+                    || (currentActivity != null && !currentActivity.isVisibleRequested())
+                    || (currentActivity != null && currentTask != null
+                            && currentTask.getTopNonFinishingActivity() != currentActivity)) {
                 // Closing transition is happening on focus window and should be update soon,
                 // don't drive back navigation with it.
                 ProtoLog.d(WM_DEBUG_BACK_PREVIEW, "Focus window is closing.");
diff --git a/services/core/java/com/android/server/wm/DeferredDisplayUpdater.java b/services/core/java/com/android/server/wm/DeferredDisplayUpdater.java
index 4eaa11b..f473b7b 100644
--- a/services/core/java/com/android/server/wm/DeferredDisplayUpdater.java
+++ b/services/core/java/com/android/server/wm/DeferredDisplayUpdater.java
@@ -60,10 +60,11 @@
      */
     @VisibleForTesting
     static final DisplayInfoFieldsUpdater DEFERRABLE_FIELDS = (out, override) -> {
-        // Treat unique id and address change as WM-specific display change as we re-query display
-        // settings and parameters based on it which could cause window changes
+        // Treat unique id, address, and canHostTasks change as WM-specific display change as we
+        // re-query display settings and parameters based on it which could cause window changes.
         out.uniqueId = override.uniqueId;
         out.address = override.address;
+        out.canHostTasks = override.canHostTasks;
 
         // Also apply WM-override fields, since they might produce differences in window hierarchy
         WM_OVERRIDE_FIELDS.setFields(out, override);
@@ -433,7 +434,7 @@
                 second.thermalRefreshRateThrottling)
                 || !Objects.equals(first.thermalBrightnessThrottlingDataId,
                 second.thermalBrightnessThrottlingDataId)
-                || first.canHostTasks != second.canHostTasks) {
+        ) {
             diff |= DIFF_NOT_WM_DEFERRABLE;
         }
 
@@ -454,6 +455,7 @@
                 || !Objects.equals(first.displayShape, second.displayShape)
                 || !Objects.equals(first.uniqueId, second.uniqueId)
                 || !Objects.equals(first.address, second.address)
+                || first.canHostTasks != second.canHostTasks
         ) {
             diff |= DIFF_WM_DEFERRABLE;
         }
diff --git a/services/core/java/com/android/server/wm/DesktopModeHelper.java b/services/core/java/com/android/server/wm/DesktopModeHelper.java
index f359307..c2255d8 100644
--- a/services/core/java/com/android/server/wm/DesktopModeHelper.java
+++ b/services/core/java/com/android/server/wm/DesktopModeHelper.java
@@ -51,13 +51,8 @@
     }
 
     /**
-     * Return {@code true} if the current device can hosts desktop sessions on its internal display.
+     * Return {@code true} if the current device supports desktop mode.
      */
-    @VisibleForTesting
-    static boolean canInternalDisplayHostDesktops(@NonNull Context context) {
-        return context.getResources().getBoolean(R.bool.config_canInternalDisplayHostDesktops);
-    }
-
     // TODO(b/337819319): use a companion object instead.
     private static boolean isDesktopModeSupported(@NonNull Context context) {
         return context.getResources().getBoolean(R.bool.config_isDesktopModeSupported);
@@ -68,32 +63,45 @@
     }
 
     /**
+     * Return {@code true} if the current device can hosts desktop sessions on its internal display.
+     */
+    @VisibleForTesting
+    static boolean canInternalDisplayHostDesktops(@NonNull Context context) {
+        return context.getResources().getBoolean(R.bool.config_canInternalDisplayHostDesktops);
+    }
+
+    /**
      * Check if Desktop mode should be enabled because the dev option is shown and enabled.
      */
     private static boolean isDesktopModeEnabledByDevOption(@NonNull Context context) {
         return DesktopModeFlags.isDesktopModeForcedEnabled() && (isDesktopModeDevOptionsSupported(
-                context) || isInternalDisplayEligibleToHostDesktops(context));
+                context) || isDeviceEligibleForDesktopMode(context));
     }
 
     @VisibleForTesting
-    static boolean isInternalDisplayEligibleToHostDesktops(@NonNull Context context) {
-        return !shouldEnforceDeviceRestrictions() || canInternalDisplayHostDesktops(context) || (
-                Flags.enableDesktopModeThroughDevOption() && isDesktopModeDevOptionsSupported(
-                        context));
+    static boolean isDeviceEligibleForDesktopMode(@NonNull Context context) {
+        if (!shouldEnforceDeviceRestrictions()) {
+            return true;
+        }
+        final boolean desktopModeSupported = isDesktopModeSupported(context)
+                && canInternalDisplayHostDesktops(context);
+        final boolean desktopModeSupportedByDevOptions =
+                Flags.enableDesktopModeThroughDevOption()
+                        && isDesktopModeDevOptionsSupported(context);
+        return desktopModeSupported || desktopModeSupportedByDevOptions;
     }
 
     /**
      * Return {@code true} if desktop mode can be entered on the current device.
      */
     static boolean canEnterDesktopMode(@NonNull Context context) {
-        return (isInternalDisplayEligibleToHostDesktops(context)
-                && DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_MODE.isTrue()
-                && (isDesktopModeSupported(context) || !shouldEnforceDeviceRestrictions()))
+        return (isDeviceEligibleForDesktopMode(context)
+                && DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_MODE.isTrue())
                 || isDesktopModeEnabledByDevOption(context);
     }
 
     /** Returns {@code true} if desktop experience wallpaper is supported on this device. */
     public static boolean isDeviceEligibleForDesktopExperienceWallpaper(@NonNull Context context) {
-        return enableConnectedDisplaysWallpaper() && canEnterDesktopMode(context);
+        return enableConnectedDisplaysWallpaper() && isDeviceEligibleForDesktopMode(context);
     }
 }
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index c87087f..703ce7d 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -226,7 +226,6 @@
 import android.view.InsetsState;
 import android.view.MagnificationSpec;
 import android.view.PrivacyIndicatorBounds;
-import android.view.RemoteAnimationDefinition;
 import android.view.RoundedCorners;
 import android.view.Surface;
 import android.view.Surface.Rotation;
@@ -367,8 +366,6 @@
     private int mMaxUiWidth = 0;
 
     final AppTransition mAppTransition;
-    final AppTransitionController mAppTransitionController;
-    boolean mSkipAppTransitionAnimation = false;
 
     final ArraySet<ActivityRecord> mOpeningApps = new ArraySet<>();
     final ArraySet<ActivityRecord> mClosingApps = new ArraySet<>();
@@ -1161,7 +1158,6 @@
         mAppTransition = new AppTransition(mWmService.mContext, mWmService, this);
         mAppTransition.registerListenerLocked(mWmService.mActivityManagerAppTransitionNotifier);
         mAppTransition.registerListenerLocked(mFixedRotationTransitionListener);
-        mAppTransitionController = new AppTransitionController(mWmService, this);
         mTransitionController.registerLegacyListener(mFixedRotationTransitionListener);
         mUnknownAppVisibilityController = new UnknownAppVisibilityController(mWmService, this);
         mRemoteDisplayChangeController = new RemoteDisplayChangeController(this);
@@ -1553,10 +1549,6 @@
         return mInputMethodSurfaceParentWindow;
     }
 
-    void registerRemoteAnimations(RemoteAnimationDefinition definition) {
-        mAppTransitionController.registerRemoteAnimations(definition);
-    }
-
     void reconfigureDisplayLocked() {
         if (!isReady()) {
             return;
@@ -3247,25 +3239,43 @@
             Slog.e(TAG, "ShouldShowSystemDecors shouldn't be updated when the flag is off.");
         }
 
-        final boolean shouldShow;
-        if (isDefaultDisplay) {
-            shouldShow = true;
-        } else if (isPrivate()) {
-            shouldShow = false;
-        } else {
-            shouldShow = mDisplay.canHostTasks();
-        }
-
-        if (shouldShow == mWmService.mDisplayWindowSettings.shouldShowSystemDecorsLocked(this)) {
+        final boolean shouldShowContent;
+        if (!allowContentModeSwitch()) {
             return;
         }
-        mWmService.mDisplayWindowSettings.setShouldShowSystemDecorsLocked(this, shouldShow);
+        shouldShowContent = mDisplay.canHostTasks();
 
-        if (!shouldShow) {
+        if (shouldShowContent == mWmService.mDisplayWindowSettings
+                .shouldShowSystemDecorsLocked(this)) {
+            return;
+        }
+        mWmService.mDisplayWindowSettings.setShouldShowSystemDecorsLocked(this, shouldShowContent);
+
+        if (!shouldShowContent) {
             clearAllTasksOnDisplay(null /* clearTasksCallback */, false /* isRemovingDisplay */);
         }
     }
 
+    private boolean allowContentModeSwitch() {
+        // The default display should always show system decorations.
+        if (isDefaultDisplay) {
+            return false;
+        }
+
+        // Private display should never show system decorations.
+        if (isPrivate()) {
+            return false;
+        }
+
+        // TODO(b/391965805): Remove this after introducing FLAG_ALLOW_SYSTEM_DECORATIONS_CHANGE.
+        // Virtual displays cannot add or remove system decorations during their lifecycle.
+        if (mDisplay.getType() == Display.TYPE_VIRTUAL) {
+            return false;
+        }
+
+        return true;
+    }
+
     DisplayCutout loadDisplayCutout(int displayWidth, int displayHeight) {
         if (mDisplayPolicy == null || mInitialDisplayCutout == null) {
             return null;
@@ -5604,20 +5614,6 @@
     }
 
     /**
-     * Transfer app transition from other display to this display.
-     *
-     * @param from Display from where the app transition is transferred.
-     *
-     * TODO(new-app-transition): Remove this once the shell handles app transition.
-     */
-    void transferAppTransitionFrom(DisplayContent from) {
-        final boolean prepared = mAppTransition.transferFrom(from.mAppTransition);
-        if (prepared && okToAnimate()) {
-            mSkipAppTransitionAnimation = false;
-        }
-    }
-
-    /**
      * @deprecated new transition should use {@link #requestTransitionAndLegacyPrepare(int, int)}
      */
     @Deprecated
@@ -5631,10 +5627,7 @@
     @Deprecated
     void prepareAppTransition(@WindowManager.TransitionType int transit,
             @WindowManager.TransitionFlags int flags) {
-        final boolean prepared = mAppTransition.prepareAppTransition(transit, flags);
-        if (prepared && okToAnimate() && transit != TRANSIT_NONE) {
-            mSkipAppTransitionAnimation = false;
-        }
+        mAppTransition.prepareAppTransition(transit, flags);
     }
 
     /**
@@ -6603,22 +6596,6 @@
                 .getKeyguardController().isKeyguardLocked(mDisplayId);
     }
 
-    boolean isKeyguardLockedOrAodShowing() {
-        return isKeyguardLocked() || isAodShowing();
-    }
-
-    /**
-     * @return whether aod is showing for this display
-     */
-    boolean isAodShowing() {
-        final boolean isAodShowing = mRootWindowContainer.mTaskSupervisor
-                .getKeyguardController().isAodShowing(mDisplayId);
-        if (mDisplayId == DEFAULT_DISPLAY && isAodShowing) {
-            return !isKeyguardGoingAway();
-        }
-        return isAodShowing;
-    }
-
     /**
      * @return whether keyguard is going away on this display
      */
diff --git a/services/core/java/com/android/server/wm/DragState.java b/services/core/java/com/android/server/wm/DragState.java
index 69f32cb..84281b8 100644
--- a/services/core/java/com/android/server/wm/DragState.java
+++ b/services/core/java/com/android/server/wm/DragState.java
@@ -122,7 +122,7 @@
     float mThumbOffsetX, mThumbOffsetY;
     InputInterceptor mInputInterceptor;
     ArrayList<WindowState> mNotifiedWindows;
-    boolean mDragInProgress;
+    private boolean mDragInProgress;
     // Set to non -1 value if a valid app requests DRAG_FLAG_HIDE_CALLING_TASK_ON_DRAG_START
     int mCallingTaskIdToHide;
     /**
@@ -161,7 +161,7 @@
     private boolean mIsClosing;
 
     // Stores the last drop event which was reported to a valid drop target window, or null
-    // otherwise.  This drop event will contain private info and should only be consumed by the
+    // otherwise. This drop event will contain private info and should only be consumed by the
     // unhandled drag listener.
     DragEvent mUnhandledDropEvent;
 
@@ -243,7 +243,7 @@
             for (WindowState ws : mNotifiedWindows) {
                 float inWindowX = 0;
                 float inWindowY = 0;
-                SurfaceControl dragSurface = null;
+                boolean includeDragSurface = false;
                 if (!mDragResult && (ws.mSession.mPid == mPid)) {
                     // Report unconsumed drop location back to the app that started the drag.
                     inWindowX = ws.translateToWindowX(mCurrentDisplayX);
@@ -251,13 +251,10 @@
                     if (relinquishDragSurfaceToDragSource()) {
                         // If requested (and allowed), report the drag surface back to the app
                         // starting the drag to handle the return animation
-                        dragSurface = mSurfaceControl;
+                        includeDragSurface = true;
                     }
                 }
-                DragEvent event = DragEvent.obtain(DragEvent.ACTION_DRAG_ENDED, inWindowX,
-                        inWindowY, mThumbOffsetX, mThumbOffsetY,
-                        mCurrentDisplayContent.getDisplayId(), mFlags, null, null, null,
-                        dragSurface, null, mDragResult);
+                DragEvent event = obtainDragEndedEvent(inWindowX, inWindowY, includeDragSurface);
                 try {
                     if (DEBUG_DRAG) Slog.d(TAG_WM, "Sending DRAG_ENDED to " + ws);
                     ws.mClient.dispatchDragEvent(event);
@@ -310,10 +307,10 @@
 
     /**
      * Creates the drop event for dispatching to the unhandled drag.
-     * TODO(b/384841906): Update `inWindowX` and `inWindowY` to be display-coordinate.
      */
-    private DragEvent createUnhandledDropEvent(float inWindowX, float inWindowY) {
-        return obtainDragEvent(DragEvent.ACTION_DROP, inWindowX, inWindowY, mDataDescription, mData,
+    private DragEvent createUnhandledDropEvent(float inDisplayX, float inDisplayY) {
+        return obtainDragEvent(DragEvent.ACTION_DROP, inDisplayX, inDisplayY, mDataDescription,
+                mData,
                 /* includeDragSurface= */ true,
                 /* includeDragFlags= */ true, null /* dragAndDropPermissions */);
     }
@@ -370,11 +367,8 @@
         }
 
         final WindowState touchedWin = mService.mInputToWindowMap.get(token);
-        // TODO(b/384841906): The x, y here when sent to a window and unhandled, will still be
-        //  relative to the window it was originally sent to. Need to update this to actually be
-        //  display-coordinate.
-        final DragEvent unhandledDropEvent = createUnhandledDropEvent(inWindowX, inWindowY);
         if (!isWindowNotified(touchedWin)) {
+            final DragEvent unhandledDropEvent = createUnhandledDropEvent(inWindowX, inWindowY);
             // Delegate to the unhandled drag listener as a first pass
             if (mDragDropController.notifyUnhandledDrop(unhandledDropEvent, "unhandled-drop")) {
                 // The unhandled drag listener will call back to notify whether it has consumed
@@ -392,6 +386,8 @@
         }
 
         if (DEBUG_DRAG) Slog.d(TAG_WM, "Sending DROP to " + touchedWin);
+        final DragEvent unhandledDropEvent = createUnhandledDropEvent(
+                touchedWin.getBounds().left + inWindowX, touchedWin.getBounds().top + inWindowY);
 
         final IBinder clientToken = touchedWin.mClient.asBinder();
         final DragEvent event = createDropEvent(inWindowX, inWindowY, touchedWin);
@@ -776,28 +772,37 @@
                 displayId, (int) (displayX - mThumbOffsetX), (int) (displayY - mThumbOffsetY));
     }
 
-    /**
-     * Returns true if it has sent DRAG_STARTED broadcast out but has not been sent DRAG_END
-     * broadcast.
-     */
-    boolean isInProgress() {
-        return mDragInProgress;
+    private DragEvent obtainDragEndedEvent(float x, float y, boolean includeDragSurface) {
+        return obtainDragEvent(DragEvent.ACTION_DRAG_ENDED, x, y, /* description= */
+                null, /* data= */ null, includeDragSurface, /* includeDragFlags= */
+                true, /* dragAndDropPermissions= */ null, mDragResult);
+    }
+
+    private DragEvent obtainDragEvent(int action, float x, float y, ClipDescription description,
+            ClipData data, boolean includeDragSurface, boolean includeDragFlags,
+            IDragAndDropPermissions dragAndDropPermissions) {
+        return obtainDragEvent(action, x, y, description, data, includeDragSurface,
+                includeDragFlags, dragAndDropPermissions, /* dragResult= */ false);
     }
 
     /**
      * `x` and `y` here varies between local window coordinate, relative coordinate to another
      * window and local display coordinate, all depending on the `action`. Please take a look
      * at the callers to determine the type.
-     * TODO(b/384845022): Properly document the events sent based on the event type.
+     * - ACTION_DRAG_STARTED: (x, y) is relative coordinate to the target window's origin
+     *                          (possible to have negative values).
+     * - ACTION_DROP:
+     * --- UnhandledDropEvent: (x, y) is in display space coordinate.
+     * --- DropEvent: (x, y) is in local window coordinate where event is targeted to.
+     * - ACTION_DRAG_ENDED: (x, y) is in local window coordinate where event is targeted to.
      */
     private DragEvent obtainDragEvent(int action, float x, float y, ClipDescription description,
             ClipData data, boolean includeDragSurface, boolean includeDragFlags,
-            IDragAndDropPermissions dragAndDropPermissions) {
+            IDragAndDropPermissions dragAndDropPermissions, boolean dragResult) {
         return DragEvent.obtain(action, x, y, mThumbOffsetX, mThumbOffsetY,
                 mCurrentDisplayContent.getDisplayId(), includeDragFlags ? mFlags : 0,
                 null  /* localState */, description, data,
-                includeDragSurface ? mSurfaceControl : null, dragAndDropPermissions,
-                false /* result */);
+                includeDragSurface ? mSurfaceControl : null, dragAndDropPermissions, dragResult);
     }
 
     private ValueAnimator createReturnAnimationLocked() {
diff --git a/services/core/java/com/android/server/wm/KeyguardController.java b/services/core/java/com/android/server/wm/KeyguardController.java
index dd2f49e1..6091b83 100644
--- a/services/core/java/com/android/server/wm/KeyguardController.java
+++ b/services/core/java/com/android/server/wm/KeyguardController.java
@@ -18,7 +18,6 @@
 
 import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
 import static android.view.Display.DEFAULT_DISPLAY;
-import static android.view.WindowManager.TRANSIT_FLAG_AOD_APPEARING;
 import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_APPEARING;
 import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY;
 import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION;
@@ -217,9 +216,6 @@
                 } else if (keyguardShowing && !state.mKeyguardShowing) {
                     transition.addFlag(TRANSIT_FLAG_KEYGUARD_APPEARING);
                 }
-                if (mWindowManager.mFlags.mAodTransition && aodShowing && !state.mAodShowing) {
-                    transition.addFlag(TRANSIT_FLAG_AOD_APPEARING);
-                }
             }
         }
         // Update the task snapshot if the screen will not be turned off. To make sure that the
@@ -242,27 +238,19 @@
         state.mAodShowing = aodShowing;
         state.writeEventLog("setKeyguardShown");
 
-        if (keyguardChanged || aodChanged) {
-            if (keyguardChanged) {
-                // Irrelevant to AOD.
-                state.mKeyguardGoingAway = false;
-                if (keyguardShowing) {
-                    state.mDismissalRequested = false;
-                }
+        if (keyguardChanged) {
+            // Irrelevant to AOD.
+            state.mKeyguardGoingAway = false;
+            if (keyguardShowing) {
+                state.mDismissalRequested = false;
             }
             if (goingAwayRemoved
-                    || (keyguardShowing && !Display.isOffState(dc.getDisplayInfo().state))
-                    || (mWindowManager.mFlags.mAodTransition && aodShowing)) {
+                    || (keyguardShowing && !Display.isOffState(dc.getDisplayInfo().state))) {
                 // Keyguard decided to show or stopped going away. Send a transition to animate back
                 // to the locked state before holding the sleep token again
                 if (!ENABLE_NEW_KEYGUARD_SHELL_TRANSITIONS) {
                     dc.requestTransitionAndLegacyPrepare(
                             TRANSIT_TO_FRONT, TRANSIT_FLAG_KEYGUARD_APPEARING);
-                    if (mWindowManager.mFlags.mAodTransition && aodShowing
-                            && dc.mTransitionController.isCollecting()) {
-                        dc.mTransitionController.getCollectingTransition().addFlag(
-                                TRANSIT_FLAG_AOD_APPEARING);
-                    }
                 }
                 dc.mWallpaperController.adjustWallpaperWindows();
                 dc.executeAppTransition();
diff --git a/services/core/java/com/android/server/wm/NonAppWindowAnimationAdapter.java b/services/core/java/com/android/server/wm/NonAppWindowAnimationAdapter.java
deleted file mode 100644
index 91598c5..0000000
--- a/services/core/java/com/android/server/wm/NonAppWindowAnimationAdapter.java
+++ /dev/null
@@ -1,227 +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.wm;
-
-import static android.view.WindowManager.TRANSIT_OLD_KEYGUARD_GOING_AWAY;
-import static android.view.WindowManager.TRANSIT_OLD_KEYGUARD_GOING_AWAY_ON_WALLPAPER;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_OPEN;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_TO_FRONT;
-import static android.view.WindowManager.TRANSIT_OLD_WALLPAPER_CLOSE;
-
-import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_REMOTE_ANIMATIONS;
-import static com.android.server.wm.AnimationAdapterProto.REMOTE;
-import static com.android.server.wm.RemoteAnimationAdapterWrapperProto.TARGET;
-import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_WINDOW_ANIMATION;
-
-import android.annotation.NonNull;
-import android.graphics.Rect;
-import android.os.SystemClock;
-import android.util.proto.ProtoOutputStream;
-import android.view.RemoteAnimationTarget;
-import android.view.SurfaceControl;
-import android.view.WindowManager;
-
-import com.android.internal.protolog.ProtoLog;
-import com.android.server.policy.WindowManagerPolicy;
-
-import java.io.PrintWriter;
-import java.util.ArrayList;
-
-class NonAppWindowAnimationAdapter implements AnimationAdapter {
-
-    private final WindowContainer mWindowContainer;
-    private RemoteAnimationTarget mTarget;
-    private SurfaceControl mCapturedLeash;
-    private SurfaceAnimator.OnAnimationFinishedCallback mCapturedLeashFinishCallback;
-    private @SurfaceAnimator.AnimationType int mLastAnimationType;
-
-    private long mDurationHint;
-    private long mStatusBarTransitionDelay;
-
-    @Override
-    public boolean getShowWallpaper() {
-        return false;
-    }
-
-    NonAppWindowAnimationAdapter(WindowContainer w, long durationHint,
-            long statusBarTransitionDelay) {
-        mWindowContainer = w;
-        mDurationHint = durationHint;
-        mStatusBarTransitionDelay = statusBarTransitionDelay;
-    }
-
-    static RemoteAnimationTarget[] startNonAppWindowAnimations(WindowManagerService service,
-            DisplayContent displayContent, @WindowManager.TransitionOldType int transit,
-            long durationHint, long statusBarTransitionDelay,
-            ArrayList<NonAppWindowAnimationAdapter> adaptersOut) {
-        final ArrayList<RemoteAnimationTarget> targets = new ArrayList<>();
-        if (shouldStartNonAppWindowAnimationsForKeyguardExit(transit)) {
-            startNonAppWindowAnimationsForKeyguardExit(
-                    service, durationHint, statusBarTransitionDelay, targets, adaptersOut);
-        } else if (shouldAttachNavBarToApp(service, displayContent, transit)) {
-            startNavigationBarWindowAnimation(
-                    displayContent, durationHint, statusBarTransitionDelay, targets,
-                    adaptersOut);
-        }
-        return targets.toArray(new RemoteAnimationTarget[targets.size()]);
-    }
-
-    static boolean shouldStartNonAppWindowAnimationsForKeyguardExit(
-            @WindowManager.TransitionOldType int transit) {
-        return transit == TRANSIT_OLD_KEYGUARD_GOING_AWAY
-                || transit == TRANSIT_OLD_KEYGUARD_GOING_AWAY_ON_WALLPAPER;
-    }
-
-    static boolean shouldAttachNavBarToApp(WindowManagerService service,
-            DisplayContent displayContent, @WindowManager.TransitionOldType int transit) {
-        return (transit == TRANSIT_OLD_TASK_OPEN || transit == TRANSIT_OLD_TASK_TO_FRONT
-                || transit == TRANSIT_OLD_WALLPAPER_CLOSE)
-                && displayContent.getDisplayPolicy().shouldAttachNavBarToAppDuringTransition()
-                && displayContent.getAsyncRotationController() == null;
-    }
-
-    /**
-     * Creates and starts remote animations for all the visible non app windows.
-     *
-     * @return RemoteAnimationTarget[] targets for all the visible non app windows
-     */
-    private static void startNonAppWindowAnimationsForKeyguardExit(WindowManagerService service,
-            long durationHint, long statusBarTransitionDelay,
-            ArrayList<RemoteAnimationTarget> targets,
-            ArrayList<NonAppWindowAnimationAdapter> adaptersOut) {
-
-        final WindowManagerPolicy policy = service.mPolicy;
-        service.mRoot.forAllWindows(nonAppWindow -> {
-            // Animation on the IME window is controlled via Insets.
-            if (nonAppWindow.mActivityRecord == null && nonAppWindow.canBeHiddenByKeyguard()
-                    && nonAppWindow.wouldBeVisibleIfPolicyIgnored() && !nonAppWindow.isVisible()
-                    && nonAppWindow != service.mRoot.getCurrentInputMethodWindow()) {
-                final NonAppWindowAnimationAdapter nonAppAdapter = new NonAppWindowAnimationAdapter(
-                        nonAppWindow, durationHint, statusBarTransitionDelay);
-                adaptersOut.add(nonAppAdapter);
-                nonAppWindow.startAnimation(nonAppWindow.getPendingTransaction(),
-                        nonAppAdapter, false /* hidden */, ANIMATION_TYPE_WINDOW_ANIMATION);
-                targets.add(nonAppAdapter.createRemoteAnimationTarget());
-            }
-        }, true /* traverseTopToBottom */);
-    }
-
-    /**
-     * Creates and starts remote animation for the navigation bar windows.
-     *
-     * @return RemoteAnimationTarget[] targets for all the visible non app windows
-     */
-    private static void startNavigationBarWindowAnimation(DisplayContent displayContent,
-            long durationHint, long statusBarTransitionDelay,
-            ArrayList<RemoteAnimationTarget> targets,
-            ArrayList<NonAppWindowAnimationAdapter> adaptersOut) {
-        final WindowState navWindow = displayContent.getDisplayPolicy().getNavigationBar();
-        final NonAppWindowAnimationAdapter nonAppAdapter = new NonAppWindowAnimationAdapter(
-                navWindow.mToken, durationHint, statusBarTransitionDelay);
-        adaptersOut.add(nonAppAdapter);
-        navWindow.mToken.startAnimation(navWindow.mToken.getPendingTransaction(),
-                nonAppAdapter, false /* hidden */, ANIMATION_TYPE_WINDOW_ANIMATION);
-        targets.add(nonAppAdapter.createRemoteAnimationTarget());
-    }
-
-    /**
-     * Create a remote animation target for this animation adapter.
-     */
-    RemoteAnimationTarget createRemoteAnimationTarget() {
-        mTarget = new RemoteAnimationTarget(-1, -1, getLeash(), false,
-                new Rect(), null, mWindowContainer.getPrefixOrderIndex(),
-                mWindowContainer.getLastSurfacePosition(), mWindowContainer.getBounds(), null,
-                mWindowContainer.getWindowConfiguration(), true, null, null, null, false,
-                mWindowContainer.getWindowType());
-        return mTarget;
-    }
-
-    @Override
-    public void startAnimation(SurfaceControl animationLeash, SurfaceControl.Transaction t,
-            int type, @NonNull SurfaceAnimator.OnAnimationFinishedCallback finishCallback) {
-        ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "startAnimation");
-        mCapturedLeash = animationLeash;
-        mCapturedLeashFinishCallback = finishCallback;
-        mLastAnimationType = type;
-    }
-
-    /**
-     * @return the callback to call to clean up when the animation has finished.
-     */
-    SurfaceAnimator.OnAnimationFinishedCallback getLeashFinishedCallback() {
-        return mCapturedLeashFinishCallback;
-    }
-
-    /**
-     * @return the type of animation.
-     */
-    @SurfaceAnimator.AnimationType
-    int getLastAnimationType() {
-        return mLastAnimationType;
-    }
-
-    WindowContainer getWindowContainer() {
-        return mWindowContainer;
-    }
-
-    @Override
-    public long getDurationHint() {
-        return mDurationHint;
-    }
-
-    @Override
-    public long getStatusBarTransitionsStartTime() {
-        return SystemClock.uptimeMillis() + mStatusBarTransitionDelay;
-    }
-
-    /**
-     * @return the leash for this animation (only valid after the non app window surface animation
-     * has started).
-     */
-    SurfaceControl getLeash() {
-        return mCapturedLeash;
-    }
-
-    @Override
-    public void onAnimationCancelled(SurfaceControl animationLeash) {
-        ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "onAnimationCancelled");
-    }
-
-    @Override
-    public void dump(PrintWriter pw, String prefix) {
-        pw.print(prefix);
-        pw.print("windowContainer=");
-        pw.println(mWindowContainer);
-        if (mTarget != null) {
-            pw.print(prefix);
-            pw.println("Target:");
-            mTarget.dump(pw, prefix + "  ");
-        } else {
-            pw.print(prefix);
-            pw.println("Target: null");
-        }
-    }
-
-    @Override
-    public void dumpDebug(ProtoOutputStream proto) {
-        final long token = proto.start(REMOTE);
-        if (mTarget != null) {
-            mTarget.dumpDebug(proto, TARGET);
-        }
-        proto.end(token);
-    }
-}
diff --git a/services/core/java/com/android/server/wm/RemoteAnimationController.java b/services/core/java/com/android/server/wm/RemoteAnimationController.java
deleted file mode 100644
index b3b2c57..0000000
--- a/services/core/java/com/android/server/wm/RemoteAnimationController.java
+++ /dev/null
@@ -1,636 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.server.wm;
-
-import static android.view.WindowManager.TRANSIT_OLD_KEYGUARD_UNOCCLUDE;
-
-import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_REMOTE_ANIMATIONS;
-import static com.android.server.wm.AnimationAdapterProto.REMOTE;
-import static com.android.server.wm.RemoteAnimationAdapterWrapperProto.TARGET;
-import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
-import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
-
-import android.annotation.ColorInt;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.graphics.Point;
-import android.graphics.Rect;
-import android.os.Binder;
-import android.os.Handler;
-import android.os.IBinder.DeathRecipient;
-import android.os.RemoteException;
-import android.os.SystemClock;
-import android.util.Slog;
-import android.util.proto.ProtoOutputStream;
-import android.view.IRemoteAnimationFinishedCallback;
-import android.view.RemoteAnimationAdapter;
-import android.view.RemoteAnimationTarget;
-import android.view.SurfaceControl;
-import android.view.SurfaceControl.Transaction;
-import android.view.WindowManager;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.protolog.ProtoLog;
-import com.android.internal.protolog.common.LogLevel;
-import com.android.internal.util.FastPrintWriter;
-import com.android.server.wm.SurfaceAnimator.AnimationType;
-import com.android.server.wm.SurfaceAnimator.OnAnimationFinishedCallback;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.function.Consumer;
-
-/**
- * Helper class to run app animations in a remote process.
- */
-class RemoteAnimationController implements DeathRecipient {
-    private static final String TAG = TAG_WITH_CLASS_NAME
-            ? "RemoteAnimationController" : TAG_WM;
-    private static final long TIMEOUT_MS = 10000;
-
-    private final WindowManagerService mService;
-    private final DisplayContent mDisplayContent;
-    private final RemoteAnimationAdapter mRemoteAnimationAdapter;
-    private final ArrayList<RemoteAnimationRecord> mPendingAnimations = new ArrayList<>();
-    private final ArrayList<WallpaperAnimationAdapter> mPendingWallpaperAnimations =
-            new ArrayList<>();
-    @VisibleForTesting
-    final ArrayList<NonAppWindowAnimationAdapter> mPendingNonAppAnimations = new ArrayList<>();
-    private final Handler mHandler;
-    private final Runnable mTimeoutRunnable = () -> cancelAnimation("timeoutRunnable");
-    private boolean mIsFinishing;
-
-    private FinishedCallback mFinishedCallback;
-    private final boolean mIsActivityEmbedding;
-    private boolean mCanceled;
-    private boolean mLinkedToDeathOfRunner;
-    @Nullable
-    private Runnable mOnRemoteAnimationReady;
-
-    RemoteAnimationController(WindowManagerService service, DisplayContent displayContent,
-            RemoteAnimationAdapter remoteAnimationAdapter, Handler handler,
-            boolean isActivityEmbedding) {
-        mService = service;
-        mDisplayContent = displayContent;
-        mRemoteAnimationAdapter = remoteAnimationAdapter;
-        mHandler = handler;
-        mIsActivityEmbedding = isActivityEmbedding;
-    }
-
-    /**
-     * Creates an animation record for each individual {@link WindowContainer}.
-     *
-     * @param windowContainer The windows to animate.
-     * @param position        The position app bounds relative to its parent.
-     * @param localBounds     The bounds of the app relative to its parent.
-     * @param endBounds       The end bounds after the transition, in screen coordinates.
-     * @param startBounds     The start bounds before the transition, in screen coordinates.
-     * @param showBackdrop    To show background behind a window during animation.
-     * @return The record representing animation(s) to run on the app.
-     */
-    RemoteAnimationRecord createRemoteAnimationRecord(WindowContainer windowContainer,
-            Point position, Rect localBounds, Rect endBounds, Rect startBounds,
-            boolean showBackdrop) {
-        return createRemoteAnimationRecord(windowContainer, position, localBounds, endBounds,
-                startBounds, showBackdrop, startBounds != null /* shouldCreateSnapshot */);
-    }
-
-    /**
-     * Creates an animation record for each individual {@link WindowContainer}.
-     *
-     * @param windowContainer The windows to animate.
-     * @param position        The position app bounds relative to its parent.
-     * @param localBounds     The bounds of the app relative to its parent.
-     * @param endBounds       The end bounds after the transition, in screen coordinates.
-     * @param startBounds     The start bounds before the transition, in screen coordinates.
-     * @param showBackdrop    To show background behind a window during animation.
-     * @param shouldCreateSnapshot   Whether this target should create a snapshot animation.
-     * @return The record representing animation(s) to run on the app.
-     */
-    RemoteAnimationRecord createRemoteAnimationRecord(WindowContainer windowContainer,
-            Point position, Rect localBounds, Rect endBounds, Rect startBounds,
-            boolean showBackdrop, boolean shouldCreateSnapshot) {
-        ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "createAnimationAdapter(): container=%s",
-                windowContainer);
-        final RemoteAnimationRecord adapters = new RemoteAnimationRecord(windowContainer, position,
-                localBounds, endBounds, startBounds, showBackdrop, shouldCreateSnapshot);
-        mPendingAnimations.add(adapters);
-        return adapters;
-    }
-
-    /** Sets callback to run before starting remote animation. */
-    void setOnRemoteAnimationReady(@Nullable Runnable onRemoteAnimationReady) {
-        mOnRemoteAnimationReady = onRemoteAnimationReady;
-    }
-
-    /**
-     * We use isFromActivityEmbedding() in the server process to tell if we're running an
-     * Activity Embedding type remote animation, where animations are driven by the client.
-     * This is currently supporting features like showBackdrop where we need to load App XML.
-     */
-    public boolean isFromActivityEmbedding() {
-        return mIsActivityEmbedding;
-    }
-
-    /**
-     * Called when the transition is ready to be started, and all leashes have been set up.
-     */
-    void goodToGo(@WindowManager.TransitionOldType int transit) {
-        ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "goodToGo()");
-        if (mCanceled) {
-            ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS,
-                    "goodToGo(): Animation canceled already");
-            onAnimationFinished();
-            invokeAnimationCancelled("already_cancelled");
-            return;
-        }
-
-        // Scale the timeout with the animator scale the controlling app is using.
-        mHandler.postDelayed(mTimeoutRunnable,
-                (long) (TIMEOUT_MS * mService.getCurrentAnimatorScale()));
-        mFinishedCallback = new FinishedCallback(this);
-
-        // Create the app targets
-        final RemoteAnimationTarget[] appTargets = createAppAnimations();
-        if (appTargets.length == 0 && !AppTransition.isKeyguardOccludeTransitOld(transit)) {
-            // Keyguard occlude transition can be executed before the occluding activity becomes
-            // visible. Even in this case, KeyguardService expects to receive binder call, so we
-            // don't cancel remote animation.
-            ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS,
-                    "goodToGo(): No apps to animate, mPendingAnimations=%d",
-                    mPendingAnimations.size());
-            onAnimationFinished();
-            invokeAnimationCancelled("no_app_targets");
-            return;
-        }
-
-        if (mOnRemoteAnimationReady != null) {
-            mOnRemoteAnimationReady.run();
-            mOnRemoteAnimationReady = null;
-        }
-
-        // Create the remote wallpaper animation targets (if any)
-        final RemoteAnimationTarget[] wallpaperTargets = createWallpaperAnimations();
-
-        // Create the remote non app animation targets (if any)
-        final RemoteAnimationTarget[] nonAppTargets = createNonAppWindowAnimations(transit);
-
-        mService.mAnimator.addAfterPrepareSurfacesRunnable(() -> {
-            try {
-                linkToDeathOfRunner();
-                ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "goodToGo(): onAnimationStart,"
-                                + " transit=%s, apps=%d, wallpapers=%d, nonApps=%d",
-                        AppTransition.appTransitionOldToString(transit), appTargets.length,
-                        wallpaperTargets.length, nonAppTargets.length);
-                if (AppTransition.isKeyguardOccludeTransitOld(transit)) {
-                    EventLogTags.writeWmSetKeyguardOccluded(
-                            transit == TRANSIT_OLD_KEYGUARD_UNOCCLUDE ? 0 : 1,
-                            1 /* animate */,
-                            transit,
-                            "onAnimationStart");
-                }
-                mRemoteAnimationAdapter.getRunner().onAnimationStart(transit, appTargets,
-                        wallpaperTargets, nonAppTargets, mFinishedCallback);
-            } catch (RemoteException e) {
-                Slog.e(TAG, "Failed to start remote animation", e);
-                onAnimationFinished();
-            }
-            if (ProtoLog.isEnabled(WM_DEBUG_REMOTE_ANIMATIONS, LogLevel.DEBUG)) {
-                ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "startAnimation(): Notify animation start:");
-                writeStartDebugStatement();
-            }
-        });
-        setRunningRemoteAnimation(true);
-    }
-
-    void cancelAnimation(String reason) {
-        ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "cancelAnimation(): reason=%s", reason);
-        synchronized (mService.getWindowManagerLock()) {
-            if (mCanceled) {
-                return;
-            }
-            mCanceled = true;
-        }
-        onAnimationFinished();
-        invokeAnimationCancelled(reason);
-    }
-
-    private void writeStartDebugStatement() {
-        ProtoLog.i(WM_DEBUG_REMOTE_ANIMATIONS, "Starting remote animation");
-        final StringWriter sw = new StringWriter();
-        final FastPrintWriter pw = new FastPrintWriter(sw);
-        for (int i = mPendingAnimations.size() - 1; i >= 0; i--) {
-            mPendingAnimations.get(i).mAdapter.dump(pw, "");
-        }
-        pw.close();
-        ProtoLog.i(WM_DEBUG_REMOTE_ANIMATIONS, "%s", sw.toString());
-    }
-
-    private RemoteAnimationTarget[] createAppAnimations() {
-        ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "createAppAnimations()");
-        final ArrayList<RemoteAnimationTarget> targets = new ArrayList<>();
-        for (int i = mPendingAnimations.size() - 1; i >= 0; i--) {
-            final RemoteAnimationRecord wrappers = mPendingAnimations.get(i);
-            final RemoteAnimationTarget target = wrappers.createRemoteAnimationTarget();
-            if (target != null) {
-                ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "\tAdd container=%s",
-                        wrappers.mWindowContainer);
-                targets.add(target);
-            } else {
-                ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "\tRemove container=%s",
-                        wrappers.mWindowContainer);
-
-                // We can't really start an animation but we still need to make sure to finish the
-                // pending animation that was started by SurfaceAnimator
-                if (wrappers.mAdapter != null
-                        && wrappers.mAdapter.mCapturedFinishCallback != null) {
-                    wrappers.mAdapter.mCapturedFinishCallback
-                            .onAnimationFinished(wrappers.mAdapter.mAnimationType,
-                                    wrappers.mAdapter);
-                }
-                if (wrappers.mThumbnailAdapter != null
-                        && wrappers.mThumbnailAdapter.mCapturedFinishCallback != null) {
-                    wrappers.mThumbnailAdapter.mCapturedFinishCallback
-                            .onAnimationFinished(wrappers.mThumbnailAdapter.mAnimationType,
-                                    wrappers.mThumbnailAdapter);
-                }
-                mPendingAnimations.remove(i);
-            }
-        }
-        return targets.toArray(new RemoteAnimationTarget[targets.size()]);
-    }
-
-    private RemoteAnimationTarget[] createWallpaperAnimations() {
-        ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "createWallpaperAnimations()");
-        return WallpaperAnimationAdapter.startWallpaperAnimations(mDisplayContent,
-                mRemoteAnimationAdapter.getDuration(),
-                mRemoteAnimationAdapter.getStatusBarTransitionDelay(),
-                adapter -> {
-                    synchronized (mService.mGlobalLock) {
-                        // If the wallpaper animation is canceled, continue with the app animation
-                        mPendingWallpaperAnimations.remove(adapter);
-                    }
-                }, mPendingWallpaperAnimations);
-    }
-
-    private RemoteAnimationTarget[] createNonAppWindowAnimations(
-            @WindowManager.TransitionOldType int transit) {
-        ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "createNonAppWindowAnimations()");
-        return NonAppWindowAnimationAdapter.startNonAppWindowAnimations(mService,
-                mDisplayContent,
-                transit,
-                mRemoteAnimationAdapter.getDuration(),
-                mRemoteAnimationAdapter.getStatusBarTransitionDelay(),
-                mPendingNonAppAnimations);
-    }
-
-    private void onAnimationFinished() {
-        ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "onAnimationFinished(): mPendingAnimations=%d",
-                mPendingAnimations.size());
-        mHandler.removeCallbacks(mTimeoutRunnable);
-        synchronized (mService.mGlobalLock) {
-            mIsFinishing = true;
-            unlinkToDeathOfRunner();
-            releaseFinishedCallback();
-            try {
-                ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS,
-                        "onAnimationFinished(): Notify animation finished:");
-                for (int i = mPendingAnimations.size() - 1; i >= 0; i--) {
-                    final RemoteAnimationRecord adapters = mPendingAnimations.get(i);
-                    if (adapters.mAdapter != null) {
-                        adapters.mAdapter.mCapturedFinishCallback
-                                .onAnimationFinished(adapters.mAdapter.mAnimationType,
-                                        adapters.mAdapter);
-                    }
-                    if (adapters.mThumbnailAdapter != null) {
-                        adapters.mThumbnailAdapter.mCapturedFinishCallback
-                                .onAnimationFinished(adapters.mThumbnailAdapter.mAnimationType,
-                                        adapters.mThumbnailAdapter);
-                    }
-                    mPendingAnimations.remove(i);
-                    ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "\tcontainer=%s",
-                            adapters.mWindowContainer);
-                }
-
-                for (int i = mPendingWallpaperAnimations.size() - 1; i >= 0; i--) {
-                    final WallpaperAnimationAdapter adapter = mPendingWallpaperAnimations.get(i);
-                    adapter.getLeashFinishedCallback().onAnimationFinished(
-                            adapter.getLastAnimationType(), adapter);
-                    mPendingWallpaperAnimations.remove(i);
-                    ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "\twallpaper=%s", adapter.getToken());
-                }
-
-                for (int i = mPendingNonAppAnimations.size() - 1; i >= 0; i--) {
-                    final NonAppWindowAnimationAdapter adapter = mPendingNonAppAnimations.get(i);
-                    adapter.getLeashFinishedCallback().onAnimationFinished(
-                            adapter.getLastAnimationType(), adapter);
-                    mPendingNonAppAnimations.remove(i);
-                    ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "\tnonApp=%s",
-                            adapter.getWindowContainer());
-                }
-            } catch (Exception e) {
-                Slog.e(TAG, "Failed to finish remote animation", e);
-                throw e;
-            } finally {
-                mIsFinishing = false;
-            }
-            // Reset input for all activities when the remote animation is finished.
-            final Consumer<ActivityRecord> updateActivities =
-                    activity -> activity.setDropInputForAnimation(false);
-            mDisplayContent.forAllActivities(updateActivities);
-        }
-        setRunningRemoteAnimation(false);
-        ProtoLog.i(WM_DEBUG_REMOTE_ANIMATIONS, "Finishing remote animation");
-    }
-
-    private void invokeAnimationCancelled(String reason) {
-        ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "cancelAnimation(): reason=%s", reason);
-        try {
-            mRemoteAnimationAdapter.getRunner().onAnimationCancelled();
-        } catch (RemoteException e) {
-            Slog.e(TAG, "Failed to notify cancel", e);
-        }
-        mOnRemoteAnimationReady = null;
-    }
-
-    private void releaseFinishedCallback() {
-        if (mFinishedCallback != null) {
-            mFinishedCallback.release();
-            mFinishedCallback = null;
-        }
-    }
-
-    private void setRunningRemoteAnimation(boolean running) {
-        final int pid = mRemoteAnimationAdapter.getCallingPid();
-        final int uid = mRemoteAnimationAdapter.getCallingUid();
-
-        if (pid == 0) {
-            throw new RuntimeException("Calling pid of remote animation was null");
-        }
-        final WindowProcessController wpc = mService.mAtmService.getProcessController(pid, uid);
-        if (wpc == null) {
-            Slog.w(TAG, "Unable to find process with pid=" + pid + " uid=" + uid);
-            return;
-        }
-        wpc.setRunningRemoteAnimation(running);
-    }
-
-    private void linkToDeathOfRunner() throws RemoteException {
-        if (!mLinkedToDeathOfRunner) {
-            mRemoteAnimationAdapter.getRunner().asBinder().linkToDeath(this, 0);
-            mLinkedToDeathOfRunner = true;
-        }
-    }
-
-    private void unlinkToDeathOfRunner() {
-        if (mLinkedToDeathOfRunner) {
-            mRemoteAnimationAdapter.getRunner().asBinder().unlinkToDeath(this, 0);
-            mLinkedToDeathOfRunner = false;
-        }
-    }
-
-    @Override
-    public void binderDied() {
-        cancelAnimation("binderDied");
-    }
-
-    private static final class FinishedCallback extends IRemoteAnimationFinishedCallback.Stub {
-
-        RemoteAnimationController mOuter;
-
-        FinishedCallback(RemoteAnimationController outer) {
-            mOuter = outer;
-        }
-
-        @Override
-        public void onAnimationFinished() throws RemoteException {
-            ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "app-onAnimationFinished(): mOuter=%s", mOuter);
-            final long token = Binder.clearCallingIdentity();
-            try {
-                if (mOuter != null) {
-                    mOuter.onAnimationFinished();
-
-                    // In case the client holds on to the finish callback, make sure we don't leak
-                    // RemoteAnimationController which in turn would leak the runner on the client.
-                    mOuter = null;
-                }
-            } finally {
-                Binder.restoreCallingIdentity(token);
-            }
-        }
-
-        /**
-         * Marks this callback as not be used anymore by releasing the reference to the outer class
-         * to prevent memory leak.
-         */
-        void release() {
-            ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "app-release(): mOuter=%s", mOuter);
-            mOuter = null;
-        }
-    };
-
-    /**
-     * Contains information about a remote-animation for one WindowContainer. This keeps track of,
-     * potentially, multiple animating surfaces (AdapterWrappers) associated with one
-     * Window/Transition. For example, a change transition has an adapter controller for the
-     * main window and an adapter controlling the start-state snapshot.
-     * <p>
-     * This can be thought of as a bridge between the information that the remote animator sees (via
-     * {@link RemoteAnimationTarget}) and what the server sees (the
-     * {@link RemoteAnimationAdapterWrapper}(s) interfacing with the moving surfaces).
-     */
-    public class RemoteAnimationRecord {
-        RemoteAnimationAdapterWrapper mAdapter;
-        RemoteAnimationAdapterWrapper mThumbnailAdapter = null;
-        RemoteAnimationTarget mTarget;
-        final WindowContainer mWindowContainer;
-        final Rect mStartBounds;
-        final boolean mShowBackdrop;
-        @ColorInt int mBackdropColor = 0;
-        private @RemoteAnimationTarget.Mode int mMode = RemoteAnimationTarget.MODE_CHANGING;
-
-        RemoteAnimationRecord(WindowContainer windowContainer, Point endPos, Rect localBounds,
-                Rect endBounds, @Nullable Rect startBounds, boolean showBackdrop,
-                boolean shouldCreateSnapshot) {
-            mWindowContainer = windowContainer;
-            mShowBackdrop = showBackdrop;
-            if (startBounds != null) {
-                mStartBounds = new Rect(startBounds);
-                mAdapter = new RemoteAnimationAdapterWrapper(this, endPos, localBounds, endBounds,
-                        mStartBounds, mShowBackdrop);
-                if (shouldCreateSnapshot && mRemoteAnimationAdapter.getChangeNeedsSnapshot()) {
-                    final Rect thumbnailLocalBounds = new Rect(startBounds);
-                    thumbnailLocalBounds.offsetTo(0, 0);
-                    // Snapshot is located at (0,0) of the animation leash. It doesn't have size
-                    // change, so the startBounds is its end bounds, and no start bounds for it.
-                    mThumbnailAdapter = new RemoteAnimationAdapterWrapper(this, new Point(0, 0),
-                            thumbnailLocalBounds, startBounds, new Rect(), mShowBackdrop);
-                }
-            } else {
-                mAdapter = new RemoteAnimationAdapterWrapper(this, endPos, localBounds, endBounds,
-                        new Rect(), mShowBackdrop);
-                mStartBounds = null;
-            }
-        }
-
-        void setBackDropColor(@ColorInt int backdropColor) {
-            mBackdropColor = backdropColor;
-        }
-
-        RemoteAnimationTarget createRemoteAnimationTarget() {
-            if (mAdapter == null
-                    || mAdapter.mCapturedFinishCallback == null
-                    || mAdapter.mCapturedLeash == null) {
-                return null;
-            }
-            mTarget = mWindowContainer.createRemoteAnimationTarget(this);
-            return mTarget;
-        }
-
-        void setMode(@RemoteAnimationTarget.Mode int mode) {
-            mMode = mode;
-        }
-
-        int getMode() {
-            return mMode;
-        }
-
-        /** Whether its parent is also an animation target in the same transition. */
-        boolean hasAnimatingParent() {
-            // mOpeningApps and mClosingApps are only activities, so only need to check
-            // mChangingContainers.
-            for (int i = mDisplayContent.mChangingContainers.size() - 1; i >= 0; i--) {
-                if (mWindowContainer.isDescendantOf(
-                        mDisplayContent.mChangingContainers.valueAt(i))) {
-                    return true;
-                }
-            }
-            return false;
-        }
-    }
-
-    class RemoteAnimationAdapterWrapper implements AnimationAdapter {
-        private final RemoteAnimationRecord mRecord;
-        SurfaceControl mCapturedLeash;
-        private OnAnimationFinishedCallback mCapturedFinishCallback;
-        private @AnimationType int mAnimationType;
-        final Point mPosition = new Point();
-        final Rect mLocalBounds;
-        final Rect mEndBounds = new Rect();
-        final Rect mStartBounds = new Rect();
-        final boolean mShowBackdrop;
-
-        RemoteAnimationAdapterWrapper(RemoteAnimationRecord record, Point position,
-                Rect localBounds, Rect endBounds, Rect startBounds, boolean showBackdrop) {
-            mRecord = record;
-            mPosition.set(position.x, position.y);
-            mLocalBounds = localBounds;
-            mEndBounds.set(endBounds);
-            mStartBounds.set(startBounds);
-            mShowBackdrop = showBackdrop;
-        }
-
-        @Override
-        @ColorInt
-        public int getBackgroundColor() {
-            return mRecord.mBackdropColor;
-        }
-
-        @Override
-        public boolean getShowBackground() {
-            return mShowBackdrop;
-        }
-
-        @Override
-        public boolean getShowWallpaper() {
-            return false;
-        }
-
-        @Override
-        public void startAnimation(SurfaceControl animationLeash, Transaction t,
-                @AnimationType int type, @NonNull OnAnimationFinishedCallback finishCallback) {
-            ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "startAnimation");
-
-            if (mStartBounds.isEmpty()) {
-                // Restore position and stack crop until client has a chance to modify it.
-                t.setPosition(animationLeash, mPosition.x, mPosition.y);
-                t.setWindowCrop(animationLeash, mEndBounds.width(), mEndBounds.height());
-            } else {
-                // Offset the change animation leash to the relative start position in parent.
-                // (mPosition) is the relative end position in parent container.
-                // (mStartBounds - mEndBounds) is the position difference between start and end.
-                // (mPosition + mStartBounds - mEndBounds) will be the relative start position.
-                t.setPosition(animationLeash, mPosition.x + mStartBounds.left - mEndBounds.left,
-                        mPosition.y + mStartBounds.top - mEndBounds.top);
-                t.setWindowCrop(animationLeash, mStartBounds.width(), mStartBounds.height());
-            }
-            mCapturedLeash = animationLeash;
-            mCapturedFinishCallback = finishCallback;
-            mAnimationType = type;
-        }
-
-        @Override
-        public void onAnimationCancelled(SurfaceControl animationLeash) {
-            if (mIsFinishing) {
-                return;
-            }
-            if (mRecord.mAdapter == this) {
-                mRecord.mAdapter = null;
-            } else {
-                mRecord.mThumbnailAdapter = null;
-            }
-            if (mRecord.mAdapter == null && mRecord.mThumbnailAdapter == null) {
-                mPendingAnimations.remove(mRecord);
-            }
-            if (mPendingAnimations.isEmpty()) {
-                cancelAnimation("allAppAnimationsCanceled");
-            }
-        }
-
-        @Override
-        public long getDurationHint() {
-            return mRemoteAnimationAdapter.getDuration();
-        }
-
-        @Override
-        public long getStatusBarTransitionsStartTime() {
-            return SystemClock.uptimeMillis()
-                    + mRemoteAnimationAdapter.getStatusBarTransitionDelay();
-        }
-
-        @Override
-        public void dump(PrintWriter pw, String prefix) {
-            pw.print(prefix); pw.print("container="); pw.println(mRecord.mWindowContainer);
-            if (mRecord.mTarget != null) {
-                pw.print(prefix); pw.println("Target:");
-                mRecord.mTarget.dump(pw, prefix + "  ");
-            } else {
-                pw.print(prefix); pw.println("Target: null");
-            }
-        }
-
-        @Override
-        public void dumpDebug(ProtoOutputStream proto) {
-            final long token = proto.start(REMOTE);
-            if (mRecord.mTarget != null) {
-                mRecord.mTarget.dumpDebug(proto, TARGET);
-            }
-            proto.end(token);
-        }
-    }
-}
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index 95d9b3e..c93efd3 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -35,7 +35,6 @@
 import static android.view.WindowManager.TRANSIT_NONE;
 import static android.view.WindowManager.TRANSIT_PIP;
 import static android.view.WindowManager.TRANSIT_SLEEP;
-import static android.view.WindowManager.TRANSIT_TO_BACK;
 import static android.view.WindowManager.TRANSIT_WAKE;
 
 import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_FOCUS_LIGHT;
@@ -68,7 +67,6 @@
 import static com.android.server.wm.ActivityTaskSupervisor.ON_TOP;
 import static com.android.server.wm.ActivityTaskSupervisor.dumpHistoryList;
 import static com.android.server.wm.ActivityTaskSupervisor.printThisActivity;
-import static com.android.server.wm.KeyguardController.KEYGUARD_SLEEP_TOKEN_TAG;
 import static com.android.server.wm.RootWindowContainerProto.IS_HOME_RECENTS_COMPONENT;
 import static com.android.server.wm.RootWindowContainerProto.KEYGUARD_CONTROLLER;
 import static com.android.server.wm.RootWindowContainerProto.WINDOW_CONTAINER;
@@ -803,8 +801,6 @@
         mWmService.mAtmService.mTaskFragmentOrganizerController.dispatchPendingEvents();
         mWmService.mSyncEngine.onSurfacePlacement();
 
-        checkAppTransitionReady(surfacePlacer);
-
         mWmService.mAtmService.mBackNavigationController
                 .checkAnimationReady(defaultDisplay.mWallpaperController);
 
@@ -898,38 +894,6 @@
         if (DEBUG_WINDOW_TRACE) Slog.e(TAG, "performSurfacePlacementInner exit");
     }
 
-    private void checkAppTransitionReady(WindowSurfacePlacer surfacePlacer) {
-        // Trace all displays app transition by Z-order for pending layout change.
-        for (int i = mChildren.size() - 1; i >= 0; --i) {
-            final DisplayContent curDisplay = mChildren.get(i);
-
-            // If we are ready to perform an app transition, check through all of the app tokens
-            // to be shown and see if they are ready to go.
-            if (curDisplay.mAppTransition.isReady()) {
-                // handleAppTransitionReady may modify curDisplay.pendingLayoutChanges.
-                curDisplay.mAppTransitionController.handleAppTransitionReady();
-                if (DEBUG_LAYOUT_REPEATS) {
-                    surfacePlacer.debugLayoutRepeats("after handleAppTransitionReady",
-                            curDisplay.pendingLayoutChanges);
-                }
-            }
-
-            if (curDisplay.mAppTransition.isRunning() && !curDisplay.isAppTransitioning()) {
-                // We have finished the animation of an app transition. To do this, we have
-                // delayed a lot of operations like showing and hiding apps, moving apps in
-                // Z-order, etc.
-                // The app token list reflects the correct Z-order, but the window list may now
-                // be out of sync with it. So here we will just rebuild the entire app window
-                // list. Fun!
-                curDisplay.handleAnimatingStoppedAndTransition();
-                if (DEBUG_LAYOUT_REPEATS) {
-                    surfacePlacer.debugLayoutRepeats("after handleAnimStopAndXitionLock",
-                            curDisplay.pendingLayoutChanges);
-                }
-            }
-        }
-    }
-
     private void applySurfaceChangesTransaction() {
         // TODO(multi-display): Support these features on secondary screens.
         final DisplayContent defaultDc = mDefaultDisplay;
@@ -2266,20 +2230,6 @@
 
                 // Ensure the leash of new task is in sync with its current bounds after reparent.
                 rootTask.maybeApplyLastRecentsAnimationTransaction();
-
-                // In the case of this activity entering PIP due to it being moved to the back,
-                // the old activity would have a TRANSIT_TASK_TO_BACK transition that needs to be
-                // ran. But, since its visibility did not change (note how it was STOPPED/not
-                // visible, and with it now at the back stack, it remains not visible), the logic to
-                // add the transition is automatically skipped. We then add this activity manually
-                // to the list of apps being closed, and request its transition to be ran.
-                final ActivityRecord oldTopActivity = task.getTopMostActivity();
-                if (oldTopActivity != null && oldTopActivity.isState(STOPPED)
-                        && task.getDisplayContent().mAppTransition.containsTransitRequest(
-                        TRANSIT_TO_BACK)) {
-                    task.getDisplayContent().mClosingApps.add(oldTopActivity);
-                    oldTopActivity.mRequestForceTransition = true;
-                }
             }
 
             // TODO(remove-legacy-transit): Move this to the `singleActivity` case when removing
@@ -2958,20 +2908,6 @@
         display.mAllSleepTokens.remove(token);
         if (display.mAllSleepTokens.isEmpty()) {
             mService.updateSleepIfNeededLocked();
-            // Assuming no lock screen is set and a user launches an activity, turns off the screen
-            // and turn on the screen again, then the launched activity should be displayed on the
-            // screen without app transition animation. When the screen turns on, both keyguard
-            // sleep token and display off sleep token are removed, but the order is
-            // non-deterministic.
-            // Note: Display#mSkipAppTransitionAnimation will be ignored when keyguard related
-            // transition exists, so this affects only when no lock screen is set. Otherwise
-            // keyguard going away animation will be played.
-            // See also AppTransitionController#getTransitCompatType for more details.
-            if ((!mTaskSupervisor.getKeyguardController().isKeyguardOccluded(display.mDisplayId)
-                    && token.mTag.equals(KEYGUARD_SLEEP_TOKEN_TAG))
-                    || token.mTag.equals(DISPLAY_OFF_SLEEP_TOKEN_TAG)) {
-                display.mSkipAppTransitionAnimation = true;
-            }
         }
     }
 
diff --git a/services/core/java/com/android/server/wm/SnapshotController.java b/services/core/java/com/android/server/wm/SnapshotController.java
index dcdffa4..2664dcd 100644
--- a/services/core/java/com/android/server/wm/SnapshotController.java
+++ b/services/core/java/com/android/server/wm/SnapshotController.java
@@ -72,11 +72,6 @@
         mActivitySnapshotController.notifyAppVisibilityChanged(appWindowToken, visible);
     }
 
-    // For legacy transition, which won't support activity snapshot
-    void onTransitionStarting(DisplayContent displayContent) {
-        mTaskSnapshotController.handleClosingApps(displayContent.mClosingApps);
-    }
-
     // For shell transition, record snapshots before transaction start.
     void onTransactionReady(@WindowManager.TransitionType int type,
             ArrayList<Transition.ChangeInfo> changeInfos) {
diff --git a/services/core/java/com/android/server/wm/SurfaceAnimator.java b/services/core/java/com/android/server/wm/SurfaceAnimator.java
index 3dfff39..c5425fe 100644
--- a/services/core/java/com/android/server/wm/SurfaceAnimator.java
+++ b/services/core/java/com/android/server/wm/SurfaceAnimator.java
@@ -132,10 +132,7 @@
                         animationFinishCallback.onAnimationFinished(type, anim);
                     }
                 };
-                // If both the Animatable and AnimationAdapter requests to be deferred, only the
-                // first one will be called.
-                if (!(mAnimatable.shouldDeferAnimationFinish(resetAndInvokeFinish)
-                        || anim.shouldDeferAnimationFinish(resetAndInvokeFinish))) {
+                if (!anim.shouldDeferAnimationFinish(resetAndInvokeFinish)) {
                     resetAndInvokeFinish.run();
                 }
                 mAnimationFinished = true;
@@ -639,23 +636,5 @@
          * @return The height of the surface to be animated.
          */
         int getSurfaceHeight();
-
-        /**
-         * Gets called when the animation is about to finish and gives the client the opportunity to
-         * defer finishing the animation, i.e. it keeps the leash around until the client calls
-         * {@link #cancelAnimation}.
-         * <p>
-         * {@link AnimationAdapter} has a similar method which is called only if this method returns
-         * false. This mean that if both this {@link Animatable} and the {@link AnimationAdapter}
-         * request to be deferred, this method is the sole responsible to call
-         * endDeferFinishCallback. On the other hand, the animation finish might still be deferred
-         * if this method return false and the one from the {@link AnimationAdapter} returns true.
-         *
-         * @param endDeferFinishCallback The callback to call when defer finishing should be ended.
-         * @return Whether the client would like to defer the animation finish.
-         */
-        default boolean shouldDeferAnimationFinish(Runnable endDeferFinishCallback) {
-            return false;
-        }
     }
 }
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index f75e717..3abab8b 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -508,9 +508,6 @@
      */
     boolean mAllowForceResizeOverride = true;
 
-    private final AnimatingActivityRegistry mAnimatingActivityRegistry =
-            new AnimatingActivityRegistry();
-
     private static final int TRANSLUCENT_TIMEOUT_MSG = FIRST_ACTIVITY_TASK_MSG + 1;
 
     private final Handler mHandler;
@@ -1122,17 +1119,6 @@
         // already ran fully within super.onParentChanged
         updateTaskOrganizerState();
 
-        // TODO(b/168037178): The check for null display content and setting it to null doesn't
-        //                    really make sense here...
-
-        // TODO(b/168037178): This is mostly taking care of the case where the stask is removing
-        //                    from the display, so we should probably consolidate it there instead.
-
-        if (getParent() == null && mDisplayContent != null) {
-            mDisplayContent = null;
-            mWmService.mWindowPlacerLocked.requestTraversal();
-        }
-
         if (oldParent != null) {
             final Task oldParentTask = oldParent.asTask();
             if (oldParentTask != null) {
@@ -1185,9 +1171,6 @@
         }
 
         mRootWindowContainer.updateUIDsPresentOnDisplay();
-
-        // Ensure all animations are finished at same time in split-screen mode.
-        forAllActivities(ActivityRecord::updateAnimatingActivityRegistry);
     }
 
     @Override
@@ -2770,6 +2753,7 @@
         }
 
         super.removeImmediately();
+        mDisplayContent = null;
         mRemoving = false;
     }
 
@@ -3345,13 +3329,6 @@
         mLastSurfaceShowing = show;
     }
 
-    @Override
-    void dump(PrintWriter pw, String prefix, boolean dumpAll) {
-        super.dump(pw, prefix, dumpAll);
-        mAnimatingActivityRegistry.dump(pw, "AnimatingApps:", prefix);
-    }
-
-
     /**
      * Fills in a {@link TaskInfo} with information from this task. Note that the base intent in the
      * task info will not include any extras or clip data.
@@ -6313,10 +6290,6 @@
         return mDisplayContent.getDisplayInfo();
     }
 
-    AnimatingActivityRegistry getAnimatingActivityRegistry() {
-        return mAnimatingActivityRegistry;
-    }
-
     private Rect getRawBounds() {
         return super.getBounds();
     }
diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java
index ae3a015..1966ecf 100644
--- a/services/core/java/com/android/server/wm/TaskDisplayArea.java
+++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java
@@ -50,7 +50,6 @@
 import android.os.UserHandle;
 import android.util.IntArray;
 import android.util.Slog;
-import android.view.RemoteAnimationTarget;
 import android.view.SurfaceControl;
 import android.view.WindowManager;
 
@@ -776,13 +775,6 @@
         return needsZBoost[0];
     }
 
-    @Override
-    RemoteAnimationTarget createRemoteAnimationTarget(
-            RemoteAnimationController.RemoteAnimationRecord record) {
-        final ActivityRecord activity = getTopMostActivity();
-        return activity != null ? activity.createRemoteAnimationTarget(record) : null;
-    }
-
     void setBackgroundColor(@ColorInt int colorInt) {
         setBackgroundColor(colorInt, false /* restore */);
     }
diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java
index 324852d..74059c1 100644
--- a/services/core/java/com/android/server/wm/TaskFragment.java
+++ b/services/core/java/com/android/server/wm/TaskFragment.java
@@ -99,7 +99,6 @@
 import android.util.Slog;
 import android.util.proto.ProtoOutputStream;
 import android.view.DisplayInfo;
-import android.view.RemoteAnimationTarget;
 import android.view.SurfaceControl;
 import android.window.ITaskFragmentOrganizer;
 import android.window.TaskFragmentAnimationParams;
@@ -394,6 +393,12 @@
      */
     private boolean mAllowTransitionWhenEmpty;
 
+    /**
+     * Specifies which configuration changes should trigger TaskFragment info changed callbacks.
+     * Only system TaskFragment organizers are allowed to set this value.
+     */
+    private @ActivityInfo.Config int mConfigurationChangeMaskForOrganizer;
+
     /** When set, will force the task to report as invisible. */
     static final int FLAG_FORCE_HIDDEN_FOR_PINNED_TASK = 1;
     static final int FLAG_FORCE_HIDDEN_FOR_TASK_ORG = 1 << 1;
@@ -656,6 +661,17 @@
         mAllowTransitionWhenEmpty = allowTransitionWhenEmpty;
     }
 
+    void setConfigurationChangeMaskForOrganizer(@ActivityInfo.Config int mask) {
+        // Only system organizers are allowed to set configuration change mask.
+        if (mTaskFragmentOrganizerController.isSystemOrganizer(mTaskFragmentOrganizer.asBinder())) {
+            mConfigurationChangeMaskForOrganizer = mask;
+        }
+    }
+
+    @ActivityInfo.Config int getConfigurationChangeMaskForOrganizer() {
+        return mConfigurationChangeMaskForOrganizer;
+    }
+
     /** @see #mIsolatedNav */
     boolean isIsolatedNav() {
         return isEmbedded() && mIsolatedNav;
@@ -2289,18 +2305,6 @@
     }
 
     @Override
-    RemoteAnimationTarget createRemoteAnimationTarget(
-            RemoteAnimationController.RemoteAnimationRecord record) {
-        final ActivityRecord activity = record.getMode() == RemoteAnimationTarget.MODE_OPENING
-                // There may be a launching (e.g. trampoline or embedded) activity without a window
-                // on top of the existing task which is moving to front. Exclude finishing activity
-                // so the window of next activity can be chosen to create the animation target.
-                ? getActivity(r -> !r.finishing && r.hasChild())
-                : getTopMostActivity();
-        return activity != null ? activity.createRemoteAnimationTarget(record) : null;
-    }
-
-    @Override
     boolean canCreateRemoteAnimationTarget() {
         return true;
     }
diff --git a/services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java b/services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java
index e63107c..ae329d7 100644
--- a/services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java
+++ b/services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java
@@ -349,8 +349,10 @@
             // Check if the info is different from the last reported info.
             final TaskFragmentInfo info = tf.getTaskFragmentInfo();
             final TaskFragmentInfo lastInfo = mLastSentTaskFragmentInfos.get(tf);
-            if (info.equalsForTaskFragmentOrganizer(lastInfo) && configurationsAreEqualForOrganizer(
-                    info.getConfiguration(), lastInfo.getConfiguration())) {
+            final int configurationChangeMask = tf.getConfigurationChangeMaskForOrganizer();
+            if (info.equalsForTaskFragmentOrganizer(lastInfo)
+                    && configurationsAreEqualForOrganizer(info.getConfiguration(),
+                            lastInfo.getConfiguration(), configurationChangeMask)) {
                 return null;
             }
 
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotController.java b/services/core/java/com/android/server/wm/TaskSnapshotController.java
index 432ed1d..8a93772 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotController.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotController.java
@@ -113,27 +113,6 @@
                 enableLowResSnapshots, lowResScaleFactor, use16BitFormat);
     }
 
-    // Still needed for legacy transition.(AppTransitionControllerTest)
-    void handleClosingApps(ArraySet<ActivityRecord> closingApps) {
-        if (shouldDisableSnapshots()) {
-            return;
-        }
-        // We need to take a snapshot of the task if and only if all activities of the task are
-        // either closing or hidden.
-        mTmpTasks.clear();
-        for (int i = closingApps.size() - 1; i >= 0; i--) {
-            final ActivityRecord activity = closingApps.valueAt(i);
-            if (activity.isActivityTypeHome()) continue;
-            final Task task = activity.getTask();
-            if (task == null) continue;
-
-            getClosingTasksInner(task, mTmpTasks);
-        }
-        snapshotTasks(mTmpTasks);
-        mTmpTasks.clear();
-        mSkipClosingAppSnapshotTasks.clear();
-    }
-
     /**
      * Adds the given {@param tasks} to the list of tasks which should not have their snapshots
      * taken upon the next processing of the set of closing apps. The caller is responsible for
diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java
index fe653e4..5217a75 100644
--- a/services/core/java/com/android/server/wm/Transition.java
+++ b/services/core/java/com/android/server/wm/Transition.java
@@ -36,7 +36,6 @@
 import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
 import static android.view.WindowManager.TRANSIT_CHANGE;
 import static android.view.WindowManager.TRANSIT_CLOSE;
-import static android.view.WindowManager.TRANSIT_FLAG_AOD_APPEARING;
 import static android.view.WindowManager.TRANSIT_FLAG_IS_RECENTS;
 import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_LOCKED;
 import static android.view.WindowManager.TRANSIT_OPEN;
@@ -974,10 +973,6 @@
         return false;
     }
 
-    boolean isInAodAppearTransition() {
-        return (mFlags & TRANSIT_FLAG_AOD_APPEARING) != 0;
-    }
-
     /**
      * Specifies configuration change explicitly for the window container, so it can be chosen as
      * transition target. This is usually used with transition mode
diff --git a/services/core/java/com/android/server/wm/TransitionController.java b/services/core/java/com/android/server/wm/TransitionController.java
index 25b513d..ba7f364 100644
--- a/services/core/java/com/android/server/wm/TransitionController.java
+++ b/services/core/java/com/android/server/wm/TransitionController.java
@@ -525,19 +525,6 @@
         return false;
     }
 
-    boolean isInAodAppearTransition() {
-        if (mCollectingTransition != null && mCollectingTransition.isInAodAppearTransition()) {
-            return true;
-        }
-        for (int i = mWaitingTransitions.size() - 1; i >= 0; --i) {
-            if (mWaitingTransitions.get(i).isInAodAppearTransition()) return true;
-        }
-        for (int i = mPlayingTransitions.size() - 1; i >= 0; --i) {
-            if (mPlayingTransitions.get(i).isInAodAppearTransition()) return true;
-        }
-        return false;
-    }
-
     /**
      * @return A pair of the transition and restore-behind target for the given {@param container}.
      * @param container An ancestor of a transient-launch activity
diff --git a/services/core/java/com/android/server/wm/WallpaperAnimationAdapter.java b/services/core/java/com/android/server/wm/WallpaperAnimationAdapter.java
deleted file mode 100644
index c3e85b1..0000000
--- a/services/core/java/com/android/server/wm/WallpaperAnimationAdapter.java
+++ /dev/null
@@ -1,191 +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.
- */
-package com.android.server.wm;
-
-import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_REMOTE_ANIMATIONS;
-import static com.android.server.wm.AnimationAdapterProto.REMOTE;
-import static com.android.server.wm.RemoteAnimationAdapterWrapperProto.TARGET;
-import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_WINDOW_ANIMATION;
-
-import android.annotation.NonNull;
-import android.graphics.Point;
-import android.os.SystemClock;
-import android.util.proto.ProtoOutputStream;
-import android.view.RemoteAnimationTarget;
-import android.view.SurfaceControl;
-
-import com.android.internal.protolog.ProtoLog;
-import com.android.server.wm.SurfaceAnimator.AnimationType;
-
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.function.Consumer;
-
-/**
- * An animation adapter for wallpaper windows.
- */
-class WallpaperAnimationAdapter implements AnimationAdapter {
-    private static final String TAG = "WallpaperAnimationAdapter";
-
-    private final WallpaperWindowToken mWallpaperToken;
-    private SurfaceControl mCapturedLeash;
-    private SurfaceAnimator.OnAnimationFinishedCallback mCapturedLeashFinishCallback;
-    private @AnimationType int mLastAnimationType;
-
-    private long mDurationHint;
-    private long mStatusBarTransitionDelay;
-
-    private Consumer<WallpaperAnimationAdapter> mAnimationCanceledRunnable;
-    private RemoteAnimationTarget mTarget;
-
-    WallpaperAnimationAdapter(WallpaperWindowToken wallpaperToken,
-            long durationHint, long statusBarTransitionDelay,
-            Consumer<WallpaperAnimationAdapter> animationCanceledRunnable) {
-        mWallpaperToken = wallpaperToken;
-        mDurationHint = durationHint;
-        mStatusBarTransitionDelay = statusBarTransitionDelay;
-        mAnimationCanceledRunnable = animationCanceledRunnable;
-    }
-
-    /**
-     * Creates and starts remote animations for all the visible wallpaper windows.
-     *
-     * @return RemoteAnimationTarget[] targets for all the visible wallpaper windows
-     */
-    public static RemoteAnimationTarget[] startWallpaperAnimations(DisplayContent displayContent,
-            long durationHint, long statusBarTransitionDelay,
-            Consumer<WallpaperAnimationAdapter> animationCanceledRunnable,
-            ArrayList<WallpaperAnimationAdapter> adaptersOut) {
-        if (!shouldStartWallpaperAnimation(displayContent)) {
-            ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS,
-                    "\tWallpaper of display=%s is not visible", displayContent);
-            return new RemoteAnimationTarget[0];
-        }
-        final ArrayList<RemoteAnimationTarget> targets = new ArrayList<>();
-        displayContent.forAllWallpaperWindows(wallpaperWindow -> {
-            final WallpaperAnimationAdapter wallpaperAdapter = new WallpaperAnimationAdapter(
-                    wallpaperWindow, durationHint, statusBarTransitionDelay,
-                    animationCanceledRunnable);
-            wallpaperWindow.startAnimation(wallpaperWindow.getPendingTransaction(),
-                    wallpaperAdapter, false /* hidden */, ANIMATION_TYPE_WINDOW_ANIMATION);
-            targets.add(wallpaperAdapter.createRemoteAnimationTarget());
-            adaptersOut.add(wallpaperAdapter);
-        });
-        return targets.toArray(new RemoteAnimationTarget[targets.size()]);
-    }
-
-    static boolean shouldStartWallpaperAnimation(DisplayContent displayContent) {
-        return displayContent.mWallpaperController.isWallpaperVisible();
-    }
-
-    /**
-     * Create a remote animation target for this animation adapter.
-     */
-    RemoteAnimationTarget createRemoteAnimationTarget() {
-        mTarget = new RemoteAnimationTarget(-1, -1, getLeash(), false, null, null,
-                mWallpaperToken.getPrefixOrderIndex(), new Point(), null, null,
-                mWallpaperToken.getWindowConfiguration(), true, null, null, null, false);
-        return mTarget;
-    }
-
-    /**
-     * @return the leash for this animation (only valid after the wallpaper window surface animation
-     * has started).
-     */
-    SurfaceControl getLeash() {
-        return mCapturedLeash;
-    }
-
-    /**
-     * @return the callback to call to clean up when the animation has finished.
-     */
-    SurfaceAnimator.OnAnimationFinishedCallback getLeashFinishedCallback() {
-        return mCapturedLeashFinishCallback;
-    }
-
-    /**
-     * @return the type of animation.
-     */
-    @AnimationType int getLastAnimationType() {
-        return mLastAnimationType;
-    }
-
-    /**
-     * @return the wallpaper window
-     */
-    WallpaperWindowToken getToken() {
-        return mWallpaperToken;
-    }
-
-    @Override
-    public boolean getShowWallpaper() {
-        // Not used
-        return false;
-    }
-
-    @Override
-    public void startAnimation(SurfaceControl animationLeash, SurfaceControl.Transaction t,
-            @AnimationType int type,
-            @NonNull SurfaceAnimator.OnAnimationFinishedCallback finishCallback) {
-        ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "startAnimation");
-
-        // Restore z-layering until client has a chance to modify it.
-        t.setLayer(animationLeash, mWallpaperToken.getPrefixOrderIndex());
-        mCapturedLeash = animationLeash;
-        mCapturedLeashFinishCallback = finishCallback;
-        mLastAnimationType = type;
-    }
-
-    @Override
-    public void onAnimationCancelled(SurfaceControl animationLeash) {
-        ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "onAnimationCancelled");
-        mAnimationCanceledRunnable.accept(this);
-    }
-
-    @Override
-    public long getDurationHint() {
-        return mDurationHint;
-    }
-
-    @Override
-    public long getStatusBarTransitionsStartTime() {
-        return SystemClock.uptimeMillis() + mStatusBarTransitionDelay;
-    }
-
-    @Override
-    public void dump(PrintWriter pw, String prefix) {
-        pw.print(prefix);
-        pw.print("token=");
-        pw.println(mWallpaperToken);
-        if (mTarget != null) {
-            pw.print(prefix);
-            pw.println("Target:");
-            mTarget.dump(pw, prefix + "  ");
-        } else {
-            pw.print(prefix);
-            pw.println("Target: null");
-        }
-    }
-
-    @Override
-    public void dumpDebug(ProtoOutputStream proto) {
-        final long token = proto.start(REMOTE);
-        if (mTarget != null) {
-            mTarget.dumpDebug(proto, TARGET);
-        }
-        proto.end(token);
-    }
-}
diff --git a/services/core/java/com/android/server/wm/WallpaperController.java b/services/core/java/com/android/server/wm/WallpaperController.java
index 70948e1..c1ef208 100644
--- a/services/core/java/com/android/server/wm/WallpaperController.java
+++ b/services/core/java/com/android/server/wm/WallpaperController.java
@@ -166,14 +166,6 @@
                 mFindResults.setWallpaperTarget(w);
                 return false;
             }
-        } else if (mService.mFlags.mAodTransition
-                && mDisplayContent.isKeyguardLockedOrAodShowing()) {
-            if (mService.mPolicy.isKeyguardHostWindow(w.mAttrs)
-                    && w.mTransitionController.isInAodAppearTransition()) {
-                if (DEBUG_WALLPAPER) Slog.v(TAG, "Found aod transition wallpaper target: " + w);
-                mFindResults.setWallpaperTarget(w);
-                return true;
-            }
         }
 
         final boolean animationWallpaper = animatingContainer != null
@@ -692,8 +684,7 @@
     private WallpaperWindowToken getTokenForTarget(WindowState target) {
         if (target == null) return null;
         WindowState window = mFindResults.getTopWallpaper(
-                (target.canShowWhenLocked() && mService.isKeyguardLocked())
-                        || (mService.mFlags.mAodTransition && mDisplayContent.isAodShowing()));
+                target.canShowWhenLocked() && mService.isKeyguardLocked());
         return window == null ? null : window.mToken.asWallpaperToken();
     }
 
@@ -736,9 +727,7 @@
 
         if (mFindResults.wallpaperTarget == null && mFindResults.useTopWallpaperAsTarget) {
             mFindResults.setWallpaperTarget(
-                    mFindResults.getTopWallpaper(mService.mFlags.mAodTransition
-                            ? mDisplayContent.isKeyguardLockedOrAodShowing()
-                            : mDisplayContent.isKeyguardLocked()));
+                    mFindResults.getTopWallpaper(mDisplayContent.isKeyguardLocked()));
         }
     }
 
@@ -910,17 +899,11 @@
         if (mDisplayContent.mWmService.mFlags.mEnsureWallpaperInTransitions) {
             visibleRequested = mWallpaperTarget != null && mWallpaperTarget.isVisibleRequested();
         }
-        updateWallpaperTokens(visibleRequested,
-                mService.mFlags.mAodTransition
-                        ? mDisplayContent.isKeyguardLockedOrAodShowing()
-                        : mDisplayContent.isKeyguardLocked());
+        updateWallpaperTokens(visibleRequested, mDisplayContent.isKeyguardLocked());
 
         ProtoLog.v(WM_DEBUG_WALLPAPER,
                 "Wallpaper at display %d - visibility: %b, keyguardLocked: %b",
-                mDisplayContent.getDisplayId(), visible,
-                mService.mFlags.mAodTransition
-                        ? mDisplayContent.isKeyguardLockedOrAodShowing()
-                        : mDisplayContent.isKeyguardLocked());
+                mDisplayContent.getDisplayId(), visible, mDisplayContent.isKeyguardLocked());
 
         if (visible && mLastFrozen != mFindResults.isWallpaperTargetForLetterbox) {
             mLastFrozen = mFindResults.isWallpaperTargetForLetterbox;
diff --git a/services/core/java/com/android/server/wm/WallpaperWindowToken.java b/services/core/java/com/android/server/wm/WallpaperWindowToken.java
index 3b79c54..7c88abc 100644
--- a/services/core/java/com/android/server/wm/WallpaperWindowToken.java
+++ b/services/core/java/com/android/server/wm/WallpaperWindowToken.java
@@ -34,7 +34,6 @@
 import com.android.internal.protolog.ProtoLog;
 
 import java.io.PrintWriter;
-import java.util.function.Consumer;
 
 /**
  * A token that represents a set of wallpaper windows.
@@ -250,11 +249,6 @@
     }
 
     @Override
-    void forAllWallpaperWindows(Consumer<WallpaperWindowToken> callback) {
-        callback.accept(this);
-    }
-
-    @Override
     boolean fillsParent() {
         return true;
     }
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java
index 55c2668..95cdf46 100644
--- a/services/core/java/com/android/server/wm/WindowContainer.java
+++ b/services/core/java/com/android/server/wm/WindowContainer.java
@@ -97,7 +97,6 @@
 import android.view.InsetsState;
 import android.view.MagnificationSpec;
 import android.view.RemoteAnimationDefinition;
-import android.view.RemoteAnimationTarget;
 import android.view.Surface;
 import android.view.SurfaceControl;
 import android.view.SurfaceControl.Builder;
@@ -303,7 +302,6 @@
      * This gets used during some open/close transitions as well as during a change transition
      * where it represents the starting-state snapshot.
      */
-    WindowContainerThumbnail mThumbnail;
     final Point mTmpPoint = new Point();
     protected final Rect mTmpRect = new Rect();
     final Rect mTmpPrevBounds = new Rect();
@@ -2097,12 +2095,6 @@
         return getActivity((r) -> !r.finishing && !r.isTaskOverlay());
     }
 
-    void forAllWallpaperWindows(Consumer<WallpaperWindowToken> callback) {
-        for (int i = mChildren.size() - 1; i >= 0; --i) {
-            mChildren.get(i).forAllWallpaperWindows(callback);
-        }
-    }
-
     /**
      * Calls the given {@param callback} for all tasks in depth-first top-down z-order at or below
      * this container.
@@ -3174,61 +3166,10 @@
         getAnimationPosition(mTmpPoint);
         mTmpRect.offsetTo(0, 0);
 
-        final AppTransition appTransition = getDisplayContent().mAppTransition;
-        final RemoteAnimationController controller = appTransition.getRemoteAnimationController();
         final boolean isChanging = AppTransition.isChangeTransitOld(transit) && enter
                 && isChangingAppTransition();
 
-        if (controller != null) {
-            // Here we load App XML in order to read com.android.R.styleable#Animation_showBackdrop.
-            boolean showBackdrop = false;
-            // Optionally set backdrop color if App explicitly provides it through
-            // {@link Activity#overridePendingTransition(int, int, int)}.
-            @ColorInt int backdropColor = 0;
-            if (controller.isFromActivityEmbedding()) {
-                if (isChanging) {
-                    // When there are more than one changing containers, it may leave part of the
-                    // screen empty. Show background color to cover that.
-                    showBackdrop = getDisplayContent().mChangingContainers.size() > 1;
-                    backdropColor = appTransition.getNextAppTransitionBackgroundColor();
-                } else {
-                    // Check whether the app has requested to show backdrop for open/close
-                    // transition.
-                    final Animation a = appTransition.getNextAppRequestedAnimation(enter);
-                    if (a != null) {
-                        showBackdrop = a.getShowBackdrop();
-                        backdropColor = a.getBackdropColor();
-                    }
-                }
-            }
-            final Rect localBounds = new Rect(mTmpRect);
-            localBounds.offsetTo(mTmpPoint.x, mTmpPoint.y);
-            final RemoteAnimationController.RemoteAnimationRecord adapters;
-            if (!isChanging && !enter && isClosingWhenResizing()) {
-                // Container that is closing while resizing. Pass in the closing start bounds, so
-                // the animation can start with the correct bounds, there won't be a snapshot.
-                // Cleanup the mClosingChangingContainers so that when the animation is finished, it
-                // will reset the surface.
-                final Rect closingStartBounds = getDisplayContent().mClosingChangingContainers
-                        .remove(this);
-                adapters = controller.createRemoteAnimationRecord(
-                        this, mTmpPoint, localBounds, screenBounds, closingStartBounds,
-                        showBackdrop, false /* shouldCreateSnapshot */);
-            } else {
-                final Rect startBounds = null;
-                adapters = controller.createRemoteAnimationRecord(
-                        this, mTmpPoint, localBounds, screenBounds, startBounds, showBackdrop);
-            }
-            if (backdropColor != 0) {
-                adapters.setBackDropColor(backdropColor);
-            }
-            if (!isChanging) {
-                adapters.setMode(enter
-                        ? RemoteAnimationTarget.MODE_OPENING
-                        : RemoteAnimationTarget.MODE_CLOSING);
-            }
-            resultAdapters = new Pair<>(adapters.mAdapter, adapters.mThumbnailAdapter);
-        } else if (isChanging) {
+        if (isChanging) {
             final float durationScale = mWmService.getTransitionAnimationScaleLocked();
             final DisplayInfo displayInfo = getDisplayContent().getDisplayInfo();
             mTmpRect.offsetTo(mTmpPoint.x, mTmpPoint.y);
@@ -3359,7 +3300,7 @@
 
     private Animation loadAnimation(WindowManager.LayoutParams lp, int transit, boolean enter,
                                     boolean isVoiceInteraction) {
-        if (AppTransitionController.isTaskViewTask(this) || (isOrganized()
+        if ((isOrganized()
                 // TODO(b/161711458): Clean-up when moved to shell.
                 && getWindowingMode() != WINDOWING_MODE_FULLSCREEN
                 && getWindowingMode() != WINDOWING_MODE_FREEFORM
@@ -3417,11 +3358,6 @@
         return a;
     }
 
-    RemoteAnimationTarget createRemoteAnimationTarget(
-            RemoteAnimationController.RemoteAnimationRecord record) {
-        return null;
-    }
-
     boolean canCreateRemoteAnimationTarget() {
         return false;
     }
diff --git a/services/core/java/com/android/server/wm/WindowContainerThumbnail.java b/services/core/java/com/android/server/wm/WindowContainerThumbnail.java
deleted file mode 100644
index ae477e1..0000000
--- a/services/core/java/com/android/server/wm/WindowContainerThumbnail.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.wm;
-
-import static android.view.SurfaceControl.METADATA_OWNER_UID;
-import static android.view.SurfaceControl.METADATA_WINDOW_TYPE;
-
-import static com.android.internal.protolog.WmProtoLogGroups.WM_SHOW_TRANSACTIONS;
-import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_APP_TRANSITION;
-import static com.android.server.wm.WindowContainerThumbnailProto.HEIGHT;
-import static com.android.server.wm.WindowContainerThumbnailProto.SURFACE_ANIMATOR;
-import static com.android.server.wm.WindowContainerThumbnailProto.WIDTH;
-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.WindowManagerService.MAX_ANIMATION_DURATION;
-
-import android.graphics.ColorSpace;
-import android.graphics.GraphicBuffer;
-import android.graphics.PixelFormat;
-import android.graphics.Point;
-import android.hardware.HardwareBuffer;
-import android.util.proto.ProtoOutputStream;
-import android.view.SurfaceControl;
-import android.view.SurfaceControl.Builder;
-import android.view.SurfaceControl.Transaction;
-import android.view.animation.Animation;
-
-import com.android.internal.protolog.ProtoLog;
-import com.android.server.wm.SurfaceAnimator.Animatable;
-import com.android.server.wm.SurfaceAnimator.AnimationType;
-
-/**
- * Represents a surface that is displayed over a subclass of {@link WindowContainer}
- */
-class WindowContainerThumbnail implements Animatable {
-
-    private static final String TAG = TAG_WITH_CLASS_NAME ? "WindowContainerThumbnail" : TAG_WM;
-
-    private final WindowContainer mWindowContainer;
-    private SurfaceControl mSurfaceControl;
-    private final SurfaceAnimator mSurfaceAnimator;
-    private final int mWidth;
-    private final int mHeight;
-
-    /**
-     * @param t Transaction to create the thumbnail in.
-     * @param container The sub-class of {@link WindowContainer} to associate this thumbnail with.
-     * @param thumbnailHeader A thumbnail or placeholder for thumbnail to initialize with.
-     */
-    WindowContainerThumbnail(Transaction t, WindowContainer container,
-            HardwareBuffer thumbnailHeader) {
-        this(t, container, thumbnailHeader, null /* animator */);
-    }
-
-    WindowContainerThumbnail(Transaction t, WindowContainer container,
-            HardwareBuffer thumbnailHeader, SurfaceAnimator animator) {
-        mWindowContainer = container;
-        if (animator != null) {
-            mSurfaceAnimator = animator;
-        } else {
-            // We can't use a delegating constructor since we need to
-            // reference this::onAnimationFinished
-            mSurfaceAnimator =
-                new SurfaceAnimator(this, this::onAnimationFinished /* animationFinishedCallback */,
-                        container.mWmService);
-        }
-        mWidth = thumbnailHeader.getWidth();
-        mHeight = thumbnailHeader.getHeight();
-
-        // Create a new surface for the thumbnail
-        // TODO: This should be attached as a child to the app token, once the thumbnail animations
-        // use relative coordinates. Once we start animating task we can also consider attaching
-        // this to the task.
-        mSurfaceControl = mWindowContainer.makeChildSurface(mWindowContainer.getTopChild())
-                .setName("thumbnail anim: " + mWindowContainer.toString())
-                .setBLASTLayer()
-                .setFormat(PixelFormat.TRANSLUCENT)
-                .setMetadata(METADATA_WINDOW_TYPE, mWindowContainer.getWindowingMode())
-                .setMetadata(METADATA_OWNER_UID, WindowManagerService.MY_UID)
-                .setCallsite("WindowContainerThumbnail")
-                .build();
-
-        ProtoLog.i(WM_SHOW_TRANSACTIONS, "  THUMBNAIL %s: CREATE", mSurfaceControl);
-
-        GraphicBuffer graphicBuffer = GraphicBuffer.createFromHardwareBuffer(thumbnailHeader);
-        t.setBuffer(mSurfaceControl, graphicBuffer);
-        t.setColorSpace(mSurfaceControl, ColorSpace.get(ColorSpace.Named.SRGB));
-        t.show(mSurfaceControl);
-
-        // We parent the thumbnail to the container, and just place it on top of anything else in
-        // the container.
-        t.setLayer(mSurfaceControl, Integer.MAX_VALUE);
-    }
-
-    void startAnimation(Transaction t, Animation anim) {
-        startAnimation(t, anim, null /* position */);
-    }
-
-    void startAnimation(Transaction t, Animation anim, Point position) {
-        anim.restrictDuration(MAX_ANIMATION_DURATION);
-        anim.scaleCurrentDuration(mWindowContainer.mWmService.getTransitionAnimationScaleLocked());
-        mSurfaceAnimator.startAnimation(t, new LocalAnimationAdapter(
-                new WindowAnimationSpec(anim, position,
-                        mWindowContainer.getDisplayContent().mAppTransition.canSkipFirstFrame(),
-                        mWindowContainer.getDisplayContent().getWindowCornerRadius()),
-                mWindowContainer.mWmService.mSurfaceAnimationRunner), false /* hidden */,
-                ANIMATION_TYPE_APP_TRANSITION);
-    }
-
-    private void onAnimationFinished(@AnimationType int type, AnimationAdapter anim) {
-    }
-
-    void setShowing(Transaction pendingTransaction, boolean show) {
-        // TODO: Not needed anymore once thumbnail is attached to the app.
-        if (show) {
-            pendingTransaction.show(mSurfaceControl);
-        } else {
-            pendingTransaction.hide(mSurfaceControl);
-        }
-    }
-
-    void destroy() {
-        mSurfaceAnimator.cancelAnimation();
-        getPendingTransaction().remove(mSurfaceControl);
-        mSurfaceControl = null;
-    }
-
-    /**
-     * Write to a protocol buffer output stream. Protocol buffer message definition is at {@link
-     * com.android.server.wm.WindowContainerThumbnailProto}.
-     *
-     * @param proto Stream to write the WindowContainerThumbnailProto object to.
-     * @param fieldId Field Id of the WindowContainerThumbnailProto as defined in the parent
-     *                message.
-     * @hide
-     */
-    void dumpDebug(ProtoOutputStream proto, long fieldId) {
-        final long token = proto.start(fieldId);
-        proto.write(WIDTH, mWidth);
-        proto.write(HEIGHT, mHeight);
-        if (mSurfaceAnimator.isAnimating()) {
-            mSurfaceAnimator.dumpDebug(proto, SURFACE_ANIMATOR);
-        }
-        proto.end(token);
-    }
-
-    @Override
-    public Transaction getSyncTransaction() {
-        return mWindowContainer.getSyncTransaction();
-    }
-
-    @Override
-    public Transaction getPendingTransaction() {
-        return mWindowContainer.getPendingTransaction();
-    }
-
-    @Override
-    public void commitPendingTransaction() {
-        mWindowContainer.commitPendingTransaction();
-    }
-
-    @Override
-    public void onAnimationLeashCreated(Transaction t, SurfaceControl leash) {
-        t.setLayer(leash, Integer.MAX_VALUE);
-    }
-
-    @Override
-    public void onAnimationLeashLost(Transaction t) {
-
-        // TODO: Once attached to app token, we don't need to hide it immediately if thumbnail
-        // became visible.
-        t.hide(mSurfaceControl);
-    }
-
-    @Override
-    public Builder makeAnimationLeash() {
-        return mWindowContainer.makeChildSurface(mWindowContainer.getTopChild());
-    }
-
-    @Override
-    public SurfaceControl getSurfaceControl() {
-        return mSurfaceControl;
-    }
-
-    @Override
-    public SurfaceControl getAnimationLeashParent() {
-        return mWindowContainer.getAnimationLeashParent();
-    }
-
-    @Override
-    public SurfaceControl getParentSurfaceControl() {
-        return mWindowContainer.getParentSurfaceControl();
-    }
-
-    @Override
-    public int getSurfaceWidth() {
-        return mWidth;
-    }
-
-    @Override
-    public int getSurfaceHeight() {
-        return mHeight;
-    }
-}
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index bb66991..d699a68 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -347,7 +347,6 @@
 import com.android.server.DisplayThread;
 import com.android.server.FgThread;
 import com.android.server.LocalServices;
-import com.android.server.SystemConfig;
 import com.android.server.UiThread;
 import com.android.server.Watchdog;
 import com.android.server.input.InputManagerService;
@@ -449,11 +448,6 @@
     /**
      * Use WMShell for app transition.
      */
-    private static final String ENABLE_SHELL_TRANSITIONS = "persist.wm.debug.shell_transit";
-
-    /**
-     * @see #ENABLE_SHELL_TRANSITIONS
-     */
     public static final boolean sEnableShellTransitions = getShellTransitEnabled();
 
     /**
@@ -10311,11 +10305,6 @@
     }
 
     private static boolean getShellTransitEnabled() {
-        android.content.pm.FeatureInfo autoFeature = SystemConfig.getInstance()
-                .getAvailableFeatures().get(PackageManager.FEATURE_AUTOMOTIVE);
-        if (autoFeature != null && autoFeature.version >= 0) {
-            return SystemProperties.getBoolean(ENABLE_SHELL_TRANSITIONS, true);
-        }
         return true;
     }
 
diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java
index 924b9de..4c53ba5 100644
--- a/services/core/java/com/android/server/wm/WindowOrganizerController.java
+++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java
@@ -30,24 +30,25 @@
 import static android.window.TaskFragmentOperation.OP_TYPE_CREATE_OR_MOVE_TASK_FRAGMENT_DECOR_SURFACE;
 import static android.window.TaskFragmentOperation.OP_TYPE_CREATE_TASK_FRAGMENT;
 import static android.window.TaskFragmentOperation.OP_TYPE_DELETE_TASK_FRAGMENT;
+import static android.window.TaskFragmentOperation.OP_TYPE_PRIVILEGED_REORDER_TO_BOTTOM_OF_TASK;
+import static android.window.TaskFragmentOperation.OP_TYPE_PRIVILEGED_REORDER_TO_TOP_OF_TASK;
+import static android.window.TaskFragmentOperation.OP_TYPE_PRIVILEGED_SET_CAN_AFFECT_SYSTEM_UI_FLAGS;
+import static android.window.TaskFragmentOperation.OP_TYPE_PRIVILEGED_SET_MOVE_TO_BOTTOM_IF_CLEAR_WHEN_LAUNCH;
 import static android.window.TaskFragmentOperation.OP_TYPE_REMOVE_TASK_FRAGMENT_DECOR_SURFACE;
-import static android.window.TaskFragmentOperation.OP_TYPE_REORDER_TO_BOTTOM_OF_TASK;
 import static android.window.TaskFragmentOperation.OP_TYPE_REORDER_TO_FRONT;
-import static android.window.TaskFragmentOperation.OP_TYPE_REORDER_TO_TOP_OF_TASK;
 import static android.window.TaskFragmentOperation.OP_TYPE_REPARENT_ACTIVITY_TO_TASK_FRAGMENT;
 import static android.window.TaskFragmentOperation.OP_TYPE_REQUEST_FOCUS_ON_TASK_FRAGMENT;
 import static android.window.TaskFragmentOperation.OP_TYPE_SET_ADJACENT_TASK_FRAGMENTS;
 import static android.window.TaskFragmentOperation.OP_TYPE_SET_ANIMATION_PARAMS;
-import static android.window.TaskFragmentOperation.OP_TYPE_SET_CAN_AFFECT_SYSTEM_UI_FLAGS;
 import static android.window.TaskFragmentOperation.OP_TYPE_SET_COMPANION_TASK_FRAGMENT;
 import static android.window.TaskFragmentOperation.OP_TYPE_SET_DECOR_SURFACE_BOOSTED;
 import static android.window.TaskFragmentOperation.OP_TYPE_SET_DIM_ON_TASK;
 import static android.window.TaskFragmentOperation.OP_TYPE_SET_ISOLATED_NAVIGATION;
-import static android.window.TaskFragmentOperation.OP_TYPE_SET_MOVE_TO_BOTTOM_IF_CLEAR_WHEN_LAUNCH;
 import static android.window.TaskFragmentOperation.OP_TYPE_SET_PINNED;
 import static android.window.TaskFragmentOperation.OP_TYPE_SET_RELATIVE_BOUNDS;
 import static android.window.TaskFragmentOperation.OP_TYPE_START_ACTIVITY_IN_TASK_FRAGMENT;
 import static android.window.TaskFragmentOperation.OP_TYPE_UNKNOWN;
+import static android.window.TaskFragmentOperation.PRIVILEGED_OP_START;
 import static android.window.WindowContainerTransaction.Change.CHANGE_FOCUSABLE;
 import static android.window.WindowContainerTransaction.Change.CHANGE_FORCE_TRANSLUCENT;
 import static android.window.WindowContainerTransaction.Change.CHANGE_HIDDEN;
@@ -1786,7 +1787,7 @@
                 taskFragment.setIsolatedNav(isolatedNav);
                 break;
             }
-            case OP_TYPE_REORDER_TO_BOTTOM_OF_TASK: {
+            case OP_TYPE_PRIVILEGED_REORDER_TO_BOTTOM_OF_TASK: {
                 final Task task = taskFragment.getTask();
                 if (task != null) {
                     if (task.getBottomChild() != taskFragment) {
@@ -1802,7 +1803,7 @@
                 }
                 break;
             }
-            case OP_TYPE_REORDER_TO_TOP_OF_TASK: {
+            case OP_TYPE_PRIVILEGED_REORDER_TO_TOP_OF_TASK: {
                 final Task task = taskFragment.getTask();
                 if (task != null) {
                     if (task.getTopChild() != taskFragment) {
@@ -1852,7 +1853,7 @@
                         : EMBEDDED_DIM_AREA_TASK_FRAGMENT);
                 break;
             }
-            case OP_TYPE_SET_MOVE_TO_BOTTOM_IF_CLEAR_WHEN_LAUNCH: {
+            case OP_TYPE_PRIVILEGED_SET_MOVE_TO_BOTTOM_IF_CLEAR_WHEN_LAUNCH: {
                 taskFragment.setMoveToBottomIfClearWhenLaunch(operation.getBooleanValue());
                 break;
             }
@@ -1888,7 +1889,7 @@
                 taskFragment.setPinned(pinned);
                 break;
             }
-            case OP_TYPE_SET_CAN_AFFECT_SYSTEM_UI_FLAGS: {
+            case OP_TYPE_PRIVILEGED_SET_CAN_AFFECT_SYSTEM_UI_FLAGS: {
                 taskFragment.setCanAffectSystemUiFlags(operation.getBooleanValue());
 
                 // Request to apply the flags.
@@ -1938,6 +1939,17 @@
             return false;
         }
         final int opType = operation.getOpType();
+
+        if (opType >= PRIVILEGED_OP_START
+                && !mTaskFragmentOrganizerController.isSystemOrganizer(organizer.asBinder())) {
+            final Throwable exception = new SecurityException(
+                    "Only a system organizer can perform privileged operations. opType=" + opType
+            );
+            sendTaskFragmentOperationFailure(organizer, errorCallbackToken, taskFragment,
+                    opType, exception);
+            return false;
+        }
+
         if (opType == OP_TYPE_CREATE_TASK_FRAGMENT) {
             // No need to check TaskFragment.
             return true;
@@ -1947,39 +1959,6 @@
             return false;
         }
 
-        if ((opType == OP_TYPE_REORDER_TO_BOTTOM_OF_TASK
-                || opType == OP_TYPE_REORDER_TO_TOP_OF_TASK)
-                && !mTaskFragmentOrganizerController.isSystemOrganizer(organizer.asBinder())) {
-            final Throwable exception = new SecurityException(
-                    "Only a system organizer can perform OP_TYPE_REORDER_TO_BOTTOM_OF_TASK or "
-                            + "OP_TYPE_REORDER_TO_TOP_OF_TASK."
-            );
-            sendTaskFragmentOperationFailure(organizer, errorCallbackToken, taskFragment,
-                    opType, exception);
-            return false;
-        }
-
-        if ((opType == OP_TYPE_SET_MOVE_TO_BOTTOM_IF_CLEAR_WHEN_LAUNCH)
-                && !mTaskFragmentOrganizerController.isSystemOrganizer(organizer.asBinder())) {
-            final Throwable exception = new SecurityException(
-                    "Only a system organizer can perform "
-                            + "OP_TYPE_SET_MOVE_TO_BOTTOM_IF_CLEAR_WHEN_LAUNCH."
-            );
-            sendTaskFragmentOperationFailure(organizer, errorCallbackToken, taskFragment,
-                    opType, exception);
-            return false;
-        }
-
-        if ((opType == OP_TYPE_SET_CAN_AFFECT_SYSTEM_UI_FLAGS)
-                && !mTaskFragmentOrganizerController.isSystemOrganizer(organizer.asBinder())) {
-            final Throwable exception = new SecurityException(
-                    "Only a system organizer can perform OP_TYPE_SET_CAN_AFFECT_SYSTEM_UI_FLAGS."
-            );
-            sendTaskFragmentOperationFailure(organizer, errorCallbackToken, taskFragment,
-                    opType, exception);
-            return false;
-        }
-
         final IBinder secondaryFragmentToken = operation.getSecondaryFragmentToken();
         return secondaryFragmentToken == null
                 || validateTaskFragment(mLaunchTaskFragments.get(secondaryFragmentToken), opType,
@@ -2455,10 +2434,28 @@
     /** Whether the configuration changes are important to report back to an organizer. */
     static boolean configurationsAreEqualForOrganizer(
             Configuration newConfig, @Nullable Configuration oldConfig) {
+        return configurationsAreEqualForOrganizer(newConfig, oldConfig, 0 /* additionalMask */);
+    }
+
+    /**
+     * Whether the configuration changes are important to report back to an organizer.
+     *
+     * @param newConfig the new configuration
+     * @param oldConfig the old configuration
+     * @param additionalMask specifies additional configuration changes that the organizer is
+     *                       interested in. If the configuration change matches any bit in the mask,
+     *                       {@code false} is returned.
+     */
+    static boolean configurationsAreEqualForOrganizer(
+            Configuration newConfig, @Nullable Configuration oldConfig,
+            @ActivityInfo.Config int additionalMask) {
         if (oldConfig == null) {
             return false;
         }
         int cfgChanges = newConfig.diff(oldConfig);
+        if ((cfgChanges & additionalMask) != 0) {
+            return false;
+        }
         final int winCfgChanges = (cfgChanges & ActivityInfo.CONFIG_WINDOW_CONFIGURATION) != 0
                 ? (int) newConfig.windowConfiguration.diff(oldConfig.windowConfiguration,
                 true /* compareUndefined */) : 0;
@@ -2665,6 +2662,8 @@
                 ownerActivity.getUid(), ownerActivity.info.processName);
         if (mTaskFragmentOrganizerController.isSystemOrganizer(organizerToken.asBinder())) {
             taskFragment.setOverrideOrientation(creationParams.getOverrideOrientation());
+            taskFragment.setConfigurationChangeMaskForOrganizer(
+                    creationParams.getConfigurationChangeMask());
         }
         final int position;
         if (creationParams.getPairedPrimaryFragmentToken() != null) {
diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp
index 883cab0..f07e672 100644
--- a/services/core/jni/com_android_server_input_InputManagerService.cpp
+++ b/services/core/jni/com_android_server_input_InputManagerService.cpp
@@ -668,8 +668,10 @@
     }
 
     // TODO(b/383092013): Add topology validation
-    mInputManager->getChoreographer().setDisplayTopology(
-            android_hardware_display_DisplayTopologyGraph_toNative(env, topologyGraph));
+    const DisplayTopologyGraph displayTopology =
+            android_hardware_display_DisplayTopologyGraph_toNative(env, topologyGraph);
+    mInputManager->getDispatcher().setDisplayTopology(displayTopology);
+    mInputManager->getChoreographer().setDisplayTopology(displayTopology);
 }
 
 base::Result<std::unique_ptr<InputChannel>> NativeInputManager::createInputChannel(
diff --git a/services/credentials/java/com/android/server/credentials/RequestSession.java b/services/credentials/java/com/android/server/credentials/RequestSession.java
index 2aa0c6b..440eae5 100644
--- a/services/credentials/java/com/android/server/credentials/RequestSession.java
+++ b/services/credentials/java/com/android/server/credentials/RequestSession.java
@@ -446,7 +446,7 @@
         @Override
         public void binderDied() {
             Slog.d(TAG, "Client binder died - clearing session");
-            finishSession(isUiWaitingForData(), ApiStatus.CLIENT_CANCELED.getMetricCode());
+            finishSession(isUiWaitingForData(), ApiStatus.BINDER_DIED.getMetricCode());
         }
     }
 
diff --git a/services/credentials/java/com/android/server/credentials/metrics/ApiStatus.java b/services/credentials/java/com/android/server/credentials/metrics/ApiStatus.java
index ece729f..c21e645 100644
--- a/services/credentials/java/com/android/server/credentials/metrics/ApiStatus.java
+++ b/services/credentials/java/com/android/server/credentials/metrics/ApiStatus.java
@@ -16,6 +16,7 @@
 
 package com.android.server.credentials.metrics;
 
+import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__API_STATUS__API_STATUS_BINDER_DIED;
 import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__API_STATUS__API_STATUS_CLIENT_CANCELED;
 import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__API_STATUS__API_STATUS_FAILURE;
 import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__API_STATUS__API_STATUS_SUCCESS;
@@ -27,7 +28,9 @@
     CLIENT_CANCELED(
             CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__API_STATUS__API_STATUS_CLIENT_CANCELED),
     USER_CANCELED(
-            CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__API_STATUS__API_STATUS_USER_CANCELED);
+            CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__API_STATUS__API_STATUS_USER_CANCELED),
+    BINDER_DIED(
+            CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__API_STATUS__API_STATUS_BINDER_DIED);
 
     private final int mInnerMetricCode;
 
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index e11c31c..191c21e 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -8288,8 +8288,11 @@
         Preconditions.checkCallAuthorization(isSystemUid(caller));
         // Managed Profile password can only be changed when it has a separate challenge.
         if (!isSeparateProfileChallengeEnabled(userId)) {
-            Preconditions.checkCallAuthorization(!isManagedProfile(userId), "You can "
-                    + "not set the active password for a managed profile, userId = %d", userId);
+            if (isManagedProfile(userId)) {
+                Slogf.i(LOG_TAG, "You can not set the active password for a managed profile,"
+                        + " userId = %d", userId);
+                return;
+            }
         }
 
         DevicePolicyData policy = getUserData(userId);
@@ -15993,8 +15996,6 @@
         @Override
         public void notifyUnsafeOperationStateChanged(DevicePolicySafetyChecker checker, int reason,
                 boolean isSafe) {
-            // TODO(b/178494483): use EventLog instead
-            // TODO(b/178494483): log metrics?
             if (VERBOSE_LOG) {
                 Slogf.v(LOG_TAG, "notifyUnsafeOperationStateChanged(): %s=%b",
                         DevicePolicyManager.operationSafetyReasonToString(reason), isSafe);
@@ -16006,16 +16007,20 @@
             extras.putInt(DeviceAdminReceiver.EXTRA_OPERATION_SAFETY_REASON, reason);
             extras.putBoolean(DeviceAdminReceiver.EXTRA_OPERATION_SAFETY_STATE, isSafe);
 
-            if (mOwners.hasDeviceOwner()) {
-                if (VERBOSE_LOG) Slogf.v(LOG_TAG, "Notifying DO");
-                sendDeviceOwnerCommand(DeviceAdminReceiver.ACTION_OPERATION_SAFETY_STATE_CHANGED,
-                        extras);
-            }
-            for (int profileOwnerId : mOwners.getProfileOwnerKeys()) {
-                if (VERBOSE_LOG) Slogf.v(LOG_TAG, "Notifying PO for user " + profileOwnerId);
-                sendProfileOwnerCommand(DeviceAdminReceiver.ACTION_OPERATION_SAFETY_STATE_CHANGED,
-                        extras, profileOwnerId);
-            }
+            mInjector.binderWithCleanCallingIdentity(() -> {
+                if (mOwners.hasDeviceOwner()) {
+                    if (VERBOSE_LOG) Slogf.v(LOG_TAG, "Notifying DO");
+                    sendDeviceOwnerCommand(
+                            DeviceAdminReceiver.ACTION_OPERATION_SAFETY_STATE_CHANGED,
+                            extras);
+                }
+                for (int profileOwnerId : mOwners.getProfileOwnerKeys()) {
+                    if (VERBOSE_LOG) Slogf.v(LOG_TAG, "Notifying PO for user " + profileOwnerId);
+                    sendProfileOwnerCommand(
+                            DeviceAdminReceiver.ACTION_OPERATION_SAFETY_STATE_CHANGED,
+                            extras, profileOwnerId);
+                }
+            });
         }
 
         private @Mode int findInteractAcrossProfilesResetMode(String packageName) {
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/EnterpriseSpecificIdCalculator.java b/services/devicepolicy/java/com/android/server/devicepolicy/EnterpriseSpecificIdCalculator.java
index 6e038f9..ba02122 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/EnterpriseSpecificIdCalculator.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/EnterpriseSpecificIdCalculator.java
@@ -54,17 +54,7 @@
         TelephonyManager telephonyService = context.getSystemService(TelephonyManager.class);
         Preconditions.checkState(telephonyService != null, "Unable to access telephony service");
 
-        String imei;
-        try {
-            imei = telephonyService.getImei(0);
-        } catch (UnsupportedOperationException doesNotSupportGms) {
-            // Instead of catching the exception, we could check for FEATURE_TELEPHONY_GSM.
-            // However that runs the risk of changing a device's existing ESID if on these devices
-            // telephonyService.getImei() actually returns non-null even when the device does not
-            // declare FEATURE_TELEPHONY_GSM.
-            imei = null;
-        }
-        mImei = imei;
+        mImei = telephonyService.getImei(0);
         String meid;
         try {
             meid = telephonyService.getMeid(0);
diff --git a/services/incremental/IncrementalService.cpp b/services/incremental/IncrementalService.cpp
index dae481a..36947a2 100644
--- a/services/incremental/IncrementalService.cpp
+++ b/services/incremental/IncrementalService.cpp
@@ -3198,8 +3198,10 @@
     dprintf(fd, "    }\n");
 }
 
-void IncrementalService::AppOpsListener::opChanged(int32_t, const String16&) {
+binder::Status IncrementalService::AppOpsListener::opChanged(int32_t, int32_t,
+                                                             const String16&, const String16&) {
     incrementalService.onAppOpChanged(packageName);
+    return binder::Status::ok();
 }
 
 binder::Status IncrementalService::IncrementalServiceConnector::setStorageParams(
diff --git a/services/incremental/IncrementalService.h b/services/incremental/IncrementalService.h
index b81e1b1..4ee1a70 100644
--- a/services/incremental/IncrementalService.h
+++ b/services/incremental/IncrementalService.h
@@ -26,7 +26,7 @@
 #include <android/os/incremental/BnStorageLoadingProgressListener.h>
 #include <android/os/incremental/PerUidReadTimeouts.h>
 #include <android/os/incremental/StorageHealthCheckParams.h>
-#include <binder/IAppOpsCallback.h>
+#include <binder/AppOpsManager.h>
 #include <binder/PersistableBundle.h>
 #include <utils/String16.h>
 #include <utils/StrongPointer.h>
@@ -200,11 +200,12 @@
 
     void getMetrics(int32_t storageId, android::os::PersistableBundle* _aidl_return);
 
-    class AppOpsListener : public android::BnAppOpsCallback {
+    class AppOpsListener : public com::android::internal::app::BnAppOpsCallback {
     public:
         AppOpsListener(IncrementalService& incrementalService, std::string packageName)
               : incrementalService(incrementalService), packageName(std::move(packageName)) {}
-        void opChanged(int32_t op, const String16& packageName) final;
+        binder::Status opChanged(int32_t op, int32_t uid, const String16& packageName,
+                                 const String16& persistentDeviceId) final;
 
     private:
         IncrementalService& incrementalService;
diff --git a/services/incremental/ServiceWrappers.h b/services/incremental/ServiceWrappers.h
index 39e2ee3..36a5b7f 100644
--- a/services/incremental/ServiceWrappers.h
+++ b/services/incremental/ServiceWrappers.h
@@ -23,7 +23,7 @@
 #include <android/content/pm/IDataLoader.h>
 #include <android/content/pm/IDataLoaderStatusListener.h>
 #include <android/os/incremental/PerUidReadTimeouts.h>
-#include <binder/IAppOpsCallback.h>
+#include <binder/AppOpsManager.h>
 #include <binder/IServiceManager.h>
 #include <binder/Status.h>
 #include <incfs.h>
@@ -133,6 +133,7 @@
 
 class AppOpsManagerWrapper {
 public:
+    using IAppOpsCallback = ::com::android::internal::app::IAppOpsCallback;
     virtual ~AppOpsManagerWrapper() = default;
     virtual binder::Status checkPermission(const char* permission, const char* operation,
                                            const char* package) const = 0;
diff --git a/services/incremental/test/IncrementalServiceTest.cpp b/services/incremental/test/IncrementalServiceTest.cpp
index d9d3d62..73849a3 100644
--- a/services/incremental/test/IncrementalServiceTest.cpp
+++ b/services/incremental/test/IncrementalServiceTest.cpp
@@ -1678,7 +1678,7 @@
                                                   {}, {}));
     ASSERT_GE(mDataLoader->setStorageParams(true), 0);
     ASSERT_NE(nullptr, mAppOpsManager->mStoredCallback.get());
-    mAppOpsManager->mStoredCallback->opChanged(0, {});
+    mAppOpsManager->mStoredCallback->opChanged(0, 0, {}, {});
 }
 
 TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsCheckPermissionFails) {
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index c974d9e..2bbd69c 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -894,6 +894,17 @@
 
             SystemServiceRegistry.sEnableServiceNotFoundWtf = true;
 
+            // Prepare the thread pool for init tasks that can be parallelized
+            SystemServerInitThreadPool tp = SystemServerInitThreadPool.start();
+            mDumper.addDumpable(tp);
+
+            if (android.server.Flags.earlySystemConfigInit()) {
+                // SystemConfig init is expensive, so enqueue the work as early as possible to allow
+                // concurrent execution before it's needed (typically by ActivityManagerService).
+                // As native library loading is also expensive, this is a good place to start.
+                startSystemConfigInit(t);
+            }
+
             // Initialize native services.
             System.loadLibrary("android_servers");
 
@@ -926,9 +937,6 @@
             mDumper.addDumpable(mSystemServiceManager);
 
             LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
-            // Prepare the thread pool for init tasks that can be parallelized
-            SystemServerInitThreadPool tp = SystemServerInitThreadPool.start();
-            mDumper.addDumpable(tp);
 
             // Lazily load the pre-installed system font map in SystemServer only if we're not doing
             // the optimized font loading in the FontManagerService.
@@ -1093,6 +1101,14 @@
         }
     }
 
+    private void startSystemConfigInit(TimingsTraceAndSlog t) {
+        Slog.i(TAG, "Reading configuration...");
+        final String tagSystemConfig = "ReadingSystemConfig";
+        t.traceBegin(tagSystemConfig);
+        SystemServerInitThreadPool.submit(SystemConfig::getInstance, tagSystemConfig);
+        t.traceEnd();
+    }
+
     private void createSystemContext() {
         ActivityThread activityThread = ActivityThread.systemMain();
         mSystemContext = activityThread.getSystemContext();
@@ -1131,11 +1147,11 @@
         mDumper.addDumpable(watchdog);
         t.traceEnd();
 
-        Slog.i(TAG, "Reading configuration...");
-        final String TAG_SYSTEM_CONFIG = "ReadingSystemConfig";
-        t.traceBegin(TAG_SYSTEM_CONFIG);
-        SystemServerInitThreadPool.submit(SystemConfig::getInstance, TAG_SYSTEM_CONFIG);
-        t.traceEnd();
+        // Legacy entry point for starting SystemConfig init, only needed if the early init flag is
+        // disabled and we haven't already triggered init before bootstrap services.
+        if (!android.server.Flags.earlySystemConfigInit()) {
+            startSystemConfigInit(t);
+        }
 
         // Orchestrates some ProtoLogging functionality.
         if (android.tracing.Flags.clientSideProtoLogging()) {
diff --git a/services/java/com/android/server/flags.aconfig b/services/java/com/android/server/flags.aconfig
index 4d021ec..86ccd87 100644
--- a/services/java/com/android/server/flags.aconfig
+++ b/services/java/com/android/server/flags.aconfig
@@ -10,6 +10,13 @@
 }
 
 flag {
+     namespace: "system_performance"
+     name: "early_system_config_init"
+     description: "Perform earlier initialization of SystemConfig in system server startup."
+     bug: "383869534"
+}
+
+flag {
      name: "remove_text_service"
      namespace: "wear_frameworks"
      description: "Remove TextServiceManagerService on Wear"
diff --git a/services/people/java/com/android/server/people/PeopleService.java b/services/people/java/com/android/server/people/PeopleService.java
index b9f00d7..44a8354 100644
--- a/services/people/java/com/android/server/people/PeopleService.java
+++ b/services/people/java/com/android/server/people/PeopleService.java
@@ -16,6 +16,8 @@
 
 package com.android.server.people;
 
+import static com.android.server.flags.Flags.earlyDataManagerInit;
+
 import android.Manifest;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
@@ -117,6 +119,18 @@
     }
 
     @Override
+    public void onBootPhase(int phase) {
+        if (phase == PHASE_BOOT_COMPLETED) {
+            if (earlyDataManagerInit()) {
+                // Force initialization of DataManager before onUserUnlocked
+                // to avoid blocking the ActivityManagerService on
+                // shortcutHandleUnlockUser.
+                getDataManager();
+            }
+        }
+    }
+
+    @Override
     public void onUserUnlocked(@NonNull TargetUser user) {
         getDataManager().onUserUnlocked(user.getUserIdentifier());
     }
diff --git a/services/proguard.flags b/services/proguard.flags
index 0e1f68e..8d8b418 100644
--- a/services/proguard.flags
+++ b/services/proguard.flags
@@ -15,7 +15,10 @@
 
 # APIs referenced by dependent JAR files and modules
 # TODO(b/300514883): Pull @SystemApi keep rules from system-api.pro.
--keep interface android.annotation.SystemApi
+# TODO(b/373579455): Evaluate if <init> needs to be kept.
+-keep interface android.annotation.SystemApi {
+  void <init>();
+}
 -keep @android.annotation.SystemApi class * {
   public protected *;
 }
diff --git a/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/AndroidManifest.xml b/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/AndroidManifest.xml
index b7de749..4552326 100644
--- a/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/AndroidManifest.xml
+++ b/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/AndroidManifest.xml
@@ -32,8 +32,8 @@
         <uses-library android:name="android.test.runner" />
     </application>
 
-    <!-- The "targetPackage" reference the instruments APK package, which is the FakeImeApk, while
-    the test package is "com.android.inputmethod.imetests" (FrameworksImeTests.apk).-->
+    <!-- The "targetPackage" reference the instruments APK package, which is the SimpleTestIme.apk,
+    while the test package is "com.android.inputmethod.imetests" (FrameworksImeTests.apk).-->
     <instrumentation
         android:name="androidx.test.runner.AndroidJUnitRunner"
         android:targetPackage="com.android.apps.inputmethod.simpleime"
diff --git a/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/InputMethodServiceTest.java b/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/InputMethodServiceTest.java
index a103b05..5d64cb6 100644
--- a/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/InputMethodServiceTest.java
+++ b/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/InputMethodServiceTest.java
@@ -18,6 +18,10 @@
 
 import static android.view.WindowInsets.Type.captionBar;
 
+import static com.android.apps.inputmethod.simpleime.ims.InputMethodServiceWrapper.EVENT_CONFIG;
+import static com.android.apps.inputmethod.simpleime.ims.InputMethodServiceWrapper.EVENT_HIDE;
+import static com.android.apps.inputmethod.simpleime.ims.InputMethodServiceWrapper.EVENT_SHOW;
+import static com.android.apps.inputmethod.simpleime.ims.InputMethodServiceWrapper.eventToString;
 import static com.android.compatibility.common.util.SystemUtil.eventually;
 import static com.android.cts.input.injectinputinprocess.InjectInputInProcessKt.clickOnViewCenter;
 import static com.android.internal.inputmethod.InputMethodNavButtonFlags.IME_DRAWS_IME_NAV_BAR;
@@ -31,7 +35,6 @@
 import static org.junit.Assume.assumeTrue;
 
 import android.app.Instrumentation;
-import android.content.Context;
 import android.content.res.Configuration;
 import android.graphics.Insets;
 import android.os.RemoteException;
@@ -42,7 +45,6 @@
 import android.server.wm.WindowManagerStateHelper;
 import android.util.Log;
 import android.view.WindowManagerGlobal;
-import android.view.WindowManagerPolicyConstants;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.Flags;
 import android.view.inputmethod.InputMethodManager;
@@ -58,7 +60,9 @@
 import androidx.test.uiautomator.Until;
 
 import com.android.apps.inputmethod.simpleime.ims.InputMethodServiceWrapper;
+import com.android.apps.inputmethod.simpleime.ims.InputMethodServiceWrapper.Event;
 import com.android.apps.inputmethod.simpleime.testing.TestActivity;
+import com.android.compatibility.common.util.GestureNavSwitchHelper;
 import com.android.compatibility.common.util.SystemUtil;
 
 import org.junit.After;
@@ -88,8 +92,13 @@
     private static final String DISABLE_SHOW_IME_WITH_HARD_KEYBOARD_CMD =
             "settings put secure " + Settings.Secure.SHOW_IME_WITH_HARD_KEYBOARD + " 0";
 
+    /** The ids of the subtypes of SimpleIme. */
+    private static final int[] SUBTYPE_IDS = new int[]{1, 2};
+
     private final WindowManagerStateHelper mWmState =  new WindowManagerStateHelper();
 
+    private final GestureNavSwitchHelper mGestureNavSwitchHelper = new GestureNavSwitchHelper();
+
     private final DeviceFlagsValueProvider mFlagsValueProvider = new DeviceFlagsValueProvider();
 
     @Rule
@@ -100,7 +109,6 @@
 
     private Instrumentation mInstrumentation;
     private UiDevice mUiDevice;
-    private Context mContext;
     private InputMethodManager mImm;
     private String mTargetPackageName;
     private String mInputMethodId;
@@ -112,8 +120,7 @@
     public void setUp() throws Exception {
         mInstrumentation = InstrumentationRegistry.getInstrumentation();
         mUiDevice = UiDevice.getInstance(mInstrumentation);
-        mContext = mInstrumentation.getContext();
-        mImm = mContext.getSystemService(InputMethodManager.class);
+        mImm = mInstrumentation.getContext().getSystemService(InputMethodManager.class);
         mTargetPackageName = mInstrumentation.getTargetContext().getPackageName();
         mInputMethodId = getInputMethodId();
         prepareIme();
@@ -169,14 +176,14 @@
         Log.i(TAG, "Click on EditText");
         verifyInputViewStatus(
                 () -> clickOnViewCenter(mActivity.getEditText()),
-                true /* expected */,
-                true /* inputViewStarted */);
-        assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
+                EVENT_SHOW, true /* eventExpected */, true /* shown */, "IME is shown");
 
         // Press home key to hide IME.
         Log.i(TAG, "Press home");
         if (mFlagsValueProvider.getBoolean(Flags.FLAG_REFACTOR_INSETS_CONTROLLER)) {
             assertWithMessage("Home key press was handled").that(mUiDevice.pressHome()).isTrue();
+            // This doesn't call verifyInputViewStatus, as the refactor delays the events such that
+            // getCurrentInputStarted() would be false, as we would already be in launcher.
             // The IME visibility is only sent at the end of the animation. Therefore, we have to
             // wait until the visibility was sent to the server and the IME window hidden.
             eventually(() -> assertWithMessage("IME is not shown")
@@ -185,10 +192,7 @@
             verifyInputViewStatus(
                     () -> assertWithMessage("Home key press was handled")
                             .that(mUiDevice.pressHome()).isTrue(),
-                    true /* expected */,
-                    false /* inputViewStarted */);
-            assertWithMessage("IME is not shown")
-                    .that(mInputMethodService.isInputViewShown()).isFalse();
+                    EVENT_HIDE, true /* eventExpected */, false /* shown */, "IME is not shown");
         }
     }
 
@@ -202,24 +206,12 @@
         // Triggers to show IME via public API.
         verifyInputViewStatusOnMainSync(
                 () -> assertThat(mActivity.showImeWithInputMethodManager(0 /* flags */)).isTrue(),
-                true /* expected */,
-                true /* inputViewStarted */);
-        assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
+                EVENT_SHOW, true /* eventExpected */, true /* shown */, "IME is shown");
 
         // Triggers to hide IME via public API.
         verifyInputViewStatusOnMainSync(
                 () -> assertThat(mActivity.hideImeWithInputMethodManager(0 /* flags */)).isTrue(),
-                true /* expected */,
-                false /* inputViewStarted */);
-        if (mFlagsValueProvider.getBoolean(Flags.FLAG_REFACTOR_INSETS_CONTROLLER)) {
-            // The IME visibility is only sent at the end of the animation. Therefore, we have to
-            // wait until the visibility was sent to the server and the IME window hidden.
-            eventually(() -> assertWithMessage("IME is not shown")
-                    .that(mInputMethodService.isInputViewShown()).isFalse());
-        } else {
-            assertWithMessage("IME is not shown")
-                    .that(mInputMethodService.isInputViewShown()).isFalse();
-        }
+                EVENT_HIDE, true /* eventExpected */, false /* shown */, "IME is not shown");
     }
 
     /**
@@ -232,24 +224,12 @@
         // Triggers to show IME via public API.
         verifyInputViewStatusOnMainSync(
                 () -> mActivity.showImeWithWindowInsetsController(),
-                true /* expected */,
-                true /* inputViewStarted */);
-        assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
+                EVENT_SHOW, true /* eventExpected */, true /* shown */, "IME is shown");
 
         // Triggers to hide IME via public API.
         verifyInputViewStatusOnMainSync(
                 () -> mActivity.hideImeWithWindowInsetsController(),
-                true /* expected */,
-                false /* inputViewStarted */);
-        if (mFlagsValueProvider.getBoolean(Flags.FLAG_REFACTOR_INSETS_CONTROLLER)) {
-            // The IME visibility is only sent at the end of the animation. Therefore, we have to
-            // wait until the visibility was sent to the server and the IME window hidden.
-            eventually(() -> assertWithMessage("IME is not shown")
-                    .that(mInputMethodService.isInputViewShown()).isFalse());
-        } else {
-            assertWithMessage("IME is not shown")
-                    .that(mInputMethodService.isInputViewShown()).isFalse();
-        }
+                EVENT_HIDE, true /* eventExpected */, false /* shown */, "IME is not shown");
     }
 
     /**
@@ -267,9 +247,7 @@
         Log.i(TAG, "Call IMS#requestShowSelf(0)");
         verifyInputViewStatusOnMainSync(
                 () -> mInputMethodService.requestShowSelf(0 /* flags */),
-                true /* expected */,
-                true /* inputViewStarted */);
-        assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
+                EVENT_SHOW, true /* eventExpected */, true /* shown */, "IME is shown");
 
         if (!mFlagsValueProvider.getBoolean(Flags.FLAG_REFACTOR_INSETS_CONTROLLER)) {
             // IME request to hide itself with flag HIDE_IMPLICIT_ONLY, expect not hide (shown).
@@ -277,47 +255,31 @@
             verifyInputViewStatusOnMainSync(
                     () -> mInputMethodService.requestHideSelf(
                             InputMethodManager.HIDE_IMPLICIT_ONLY),
-                    false /* expected */,
-                    true /* inputViewStarted */);
-            assertWithMessage("IME is still shown after HIDE_IMPLICIT_ONLY")
-                    .that(mInputMethodService.isInputViewShown()).isTrue();
+                    EVENT_HIDE, false /* eventExpected */, true /* shown */,
+                    "IME is still shown after HIDE_IMPLICIT_ONLY");
         }
 
         // IME request to hide itself without any flags, expect hidden.
         Log.i(TAG, "Call IMS#requestHideSelf(0)");
         verifyInputViewStatusOnMainSync(
                 () -> mInputMethodService.requestHideSelf(0 /* flags */),
-                true /* expected */,
-                false /* inputViewStarted */);
-        if (mFlagsValueProvider.getBoolean(Flags.FLAG_REFACTOR_INSETS_CONTROLLER)) {
-            // The IME visibility is only sent at the end of the animation. Therefore, we have to
-            // wait until the visibility was sent to the server and the IME window hidden.
-            eventually(() -> assertWithMessage("IME is not shown")
-                    .that(mInputMethodService.isInputViewShown()).isFalse());
-        } else {
-            assertWithMessage("IME is not shown")
-                    .that(mInputMethodService.isInputViewShown()).isFalse();
-        }
+                EVENT_HIDE, true /* eventExpected */, false /* shown */, "IME is not shown");
 
         if (!mFlagsValueProvider.getBoolean(Flags.FLAG_REFACTOR_INSETS_CONTROLLER)) {
             // IME request to show itself with flag SHOW_IMPLICIT, expect shown.
             Log.i(TAG, "Call IMS#requestShowSelf(InputMethodManager.SHOW_IMPLICIT)");
             verifyInputViewStatusOnMainSync(
                     () -> mInputMethodService.requestShowSelf(InputMethodManager.SHOW_IMPLICIT),
-                    true /* expected */,
-                    true /* inputViewStarted */);
-            assertWithMessage("IME is shown with SHOW_IMPLICIT")
-                    .that(mInputMethodService.isInputViewShown()).isTrue();
+                    EVENT_SHOW, true /* eventExpected */, true /* shown */,
+                    "IME is shown with SHOW_IMPLICIT");
 
             // IME request to hide itself with flag HIDE_IMPLICIT_ONLY, expect hidden.
             Log.i(TAG, "Call IMS#requestHideSelf(InputMethodManager.HIDE_IMPLICIT_ONLY)");
             verifyInputViewStatusOnMainSync(
                     () -> mInputMethodService.requestHideSelf(
                             InputMethodManager.HIDE_IMPLICIT_ONLY),
-                    true /* expected */,
-                    false /* inputViewStarted */);
-            assertWithMessage("IME is not shown after HIDE_IMPLICIT_ONLY")
-                    .that(mInputMethodService.isInputViewShown()).isFalse();
+                    EVENT_HIDE, true /* eventExpected */, false /* shown */,
+                    "IME is not shown after HIDE_IMPLICIT_ONLY");
         }
     }
 
@@ -409,18 +371,14 @@
             verifyInputViewStatusOnMainSync(() -> assertThat(
                             mActivity.showImeWithInputMethodManager(
                                     InputMethodManager.SHOW_IMPLICIT)).isTrue(),
-                    false /* expected */,
-                    false /* inputViewStarted */);
-            assertWithMessage("IME is not shown after SHOW_IMPLICIT")
-                    .that(mInputMethodService.isInputViewShown()).isFalse();
+                    EVENT_SHOW, false /* eventExpected */, false /* shown */,
+                    "IME is not shown after SHOW_IMPLICIT");
 
             verifyInputViewStatusOnMainSync(
                     () -> assertThat(mActivity.showImeWithInputMethodManager(0 /* flags */))
                             .isTrue(),
-                    false /* expected */,
-                    false /* inputViewStarted */);
-            assertWithMessage("IME is not shown after SHOW_EXPLICIT")
-                    .that(mInputMethodService.isInputViewShown()).isFalse();
+                    EVENT_SHOW, false /* eventExpected */, false /* shown */,
+                    "IME is not shown after SHOW_EXPLICIT");
         } finally {
             mInputMethodService.getResources()
                     .updateConfiguration(initialConfig, null /* metrics */, null /* compat */);
@@ -438,9 +396,7 @@
         // IME should be shown.
         verifyInputViewStatusOnMainSync(
                 () -> assertThat(mActivity.showImeWithInputMethodManager(0 /* flags */)).isTrue(),
-                true /* expected */,
-                true /* inputViewStarted */);
-        assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
+                EVENT_SHOW, true /* eventExpected */, true /* shown */, "IME is shown");
     }
 
     /**
@@ -454,9 +410,7 @@
         // the IME should be shown.
         verifyInputViewStatusOnMainSync(() -> assertThat(
                 mActivity.showImeWithInputMethodManager(InputMethodManager.SHOW_IMPLICIT)).isTrue(),
-                true /* expected */,
-                true /* inputViewStarted */);
-        assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
+                EVENT_SHOW, true /* eventExpected */, true /* shown */, "IME is shown");
     }
 
     /**
@@ -473,9 +427,9 @@
                 .that(mUiDevice.isNaturalOrientation()).isFalse());
         // Wait for the TestActivity to be recreated.
         eventually(() -> assertWithMessage("Activity was re-created after rotation")
-                .that(TestActivity.getLastCreatedInstance()).isNotEqualTo(mActivity));
+                .that(TestActivity.getInstance()).isNotEqualTo(mActivity));
         // Get the new TestActivity.
-        mActivity = TestActivity.getLastCreatedInstance();
+        mActivity = TestActivity.getInstance();
         assertWithMessage("Re-created activity is not null").that(mActivity).isNotNull();
         // Wait for the new EditText to be served by InputMethodManager.
         eventually(() -> assertWithMessage("Has an input connection to the re-created Activity")
@@ -483,9 +437,7 @@
 
         verifyInputViewStatusOnMainSync(() -> assertThat(
                         mActivity.showImeWithInputMethodManager(0 /* flags */)).isTrue(),
-                true /* expected */,
-                true /* inputViewStarted */);
-        assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
+                EVENT_SHOW, true /* eventExpected */, true /* shown */, "IME is shown");
     }
 
     /**
@@ -507,9 +459,9 @@
                 .that(mUiDevice.isNaturalOrientation()).isFalse());
         // Wait for the TestActivity to be recreated.
         eventually(() -> assertWithMessage("Activity was re-created after rotation")
-                .that(TestActivity.getLastCreatedInstance()).isNotEqualTo(mActivity));
+                .that(TestActivity.getInstance()).isNotEqualTo(mActivity));
         // Get the new TestActivity.
-        mActivity = TestActivity.getLastCreatedInstance();
+        mActivity = TestActivity.getInstance();
         assertWithMessage("Re-created activity is not null").that(mActivity).isNotNull();
         // Wait for the new EditText to be served by InputMethodManager.
         eventually(() -> assertWithMessage("Has an input connection to the re-created Activity")
@@ -517,10 +469,7 @@
 
         verifyInputViewStatusOnMainSync(() -> assertThat(
                 mActivity.showImeWithInputMethodManager(InputMethodManager.SHOW_IMPLICIT)).isTrue(),
-                false /* expected */,
-                false /* inputViewStarted */);
-        assertWithMessage("IME is not shown")
-                .that(mInputMethodService.isInputViewShown()).isFalse();
+                EVENT_SHOW, false /* eventExpected */, false /* shown */, "IME is not shown");
     }
 
     /**
@@ -540,9 +489,7 @@
 
             verifyInputViewStatusOnMainSync(() -> assertThat(
                             mActivity.showImeWithInputMethodManager(0 /* flags */)).isTrue(),
-                    true /* expected */,
-                    true /* inputViewStarted */);
-            assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
+                    EVENT_SHOW, true /* eventExpected */, true /* shown */, "IME is shown");
         } finally {
             mInputMethodService.getResources()
                     .updateConfiguration(initialConfig, null /* metrics */, null /* compat */);
@@ -572,10 +519,7 @@
             verifyInputViewStatusOnMainSync(() ->assertThat(
                     mActivity.showImeWithInputMethodManager(InputMethodManager.SHOW_IMPLICIT))
                             .isTrue(),
-                    false /* expected */,
-                    false /* inputViewStarted */);
-            assertWithMessage("IME is not shown")
-                    .that(mInputMethodService.isInputViewShown()).isFalse();
+                    EVENT_SHOW, false /* eventExpected */, false /* shown */, "IME is not shown");
         } finally {
             mInputMethodService.getResources()
                     .updateConfiguration(initialConfig, null /* metrics */, null /* compat */);
@@ -600,9 +544,7 @@
             verifyInputViewStatusOnMainSync(
                     () -> assertThat(mActivity.showImeWithInputMethodManager(0 /* flags */))
                             .isTrue(),
-                    true /* expected */,
-                    true /* inputViewStarted */);
-            assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
+                    EVENT_SHOW, true /* eventExpected */, true /* shown */, "IME is shown");
 
             // Simulate connecting a hardware keyboard.
             config.keyboard = Configuration.KEYBOARD_QWERTY;
@@ -613,10 +555,8 @@
 
             verifyInputViewStatusOnMainSync(
                     () -> mInputMethodService.onConfigurationChanged(config),
-                    true /* expected */,
-                    true /* inputViewStarted */);
-            assertWithMessage("IME is still shown after a configuration change")
-                    .that(mInputMethodService.isInputViewShown()).isTrue();
+                    EVENT_CONFIG, true /* eventExpected */, true /* shown */,
+                    "IME is still shown after a configuration change");
         } finally {
             mInputMethodService.getResources()
                     .updateConfiguration(initialConfig, null /* metrics */, null /* compat */);
@@ -647,9 +587,7 @@
             verifyInputViewStatusOnMainSync(() -> assertThat(
                             mActivity.showImeWithInputMethodManager(
                                     InputMethodManager.SHOW_IMPLICIT)).isTrue(),
-                    true /* expected */,
-                    true /* inputViewStarted */);
-            assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
+                    EVENT_SHOW, true /* eventExpected */, true /* shown */, "IME is shown");
 
             // Simulate connecting a hardware keyboard.
             config.keyboard = Configuration.KEYBOARD_QWERTY;
@@ -666,10 +604,8 @@
             // still alive.
             verifyInputViewStatusOnMainSync(
                     () -> mInputMethodService.onConfigurationChanged(config),
-                    true /* expected */,
-                    true /* inputViewStarted */);
-            assertWithMessage("IME is not shown after a configuration change")
-                    .that(mInputMethodService.isInputViewShown()).isFalse();
+                    EVENT_CONFIG, true /* eventExpected */, true /* inputViewStarted */,
+                    false /* shown */, "IME is not shown after a configuration change");
         } finally {
             mInputMethodService.getResources()
                     .updateConfiguration(initialConfig, null /* metrics */, null /* compat */);
@@ -695,28 +631,21 @@
             // Explicit show request.
             verifyInputViewStatusOnMainSync(() -> assertThat(
                             mActivity.showImeWithInputMethodManager(0 /* flags */)).isTrue(),
-                    true /* expected */,
-                    true /* inputViewStarted */);
-            assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
+                    EVENT_SHOW, true /* eventExpected */, true /* shown */, "IME is shown");
 
             // Implicit show request.
             verifyInputViewStatusOnMainSync(() -> assertThat(
                             mActivity.showImeWithInputMethodManager(
                                     InputMethodManager.SHOW_IMPLICIT)).isTrue(),
-                    false /* expected */,
-                    true /* inputViewStarted */);
-            assertWithMessage("IME is still shown")
-                    .that(mInputMethodService.isInputViewShown()).isTrue();
+                    EVENT_SHOW, false /* eventExpected */, true /* shown */, "IME is still shown");
 
             // Simulate a fake configuration change to avoid the recreation of TestActivity.
             // This should now consider the implicit show request, but keep the state from the
             // explicit show request, and thus not hide the IME.
             verifyInputViewStatusOnMainSync(
                     () -> mInputMethodService.onConfigurationChanged(config),
-                    true /* expected */,
-                    true /* inputViewStarted */);
-            assertWithMessage("IME is still shown after a configuration change")
-                    .that(mInputMethodService.isInputViewShown()).isTrue();
+                    EVENT_CONFIG, true /* eventExpected */, true /* shown */,
+                    "IME is still shown after a configuration change");
         } finally {
             mInputMethodService.getResources()
                     .updateConfiguration(initialConfig, null /* metrics */, null /* compat */);
@@ -739,24 +668,17 @@
 
         verifyInputViewStatusOnMainSync(() -> assertThat(
                 mActivity.showImeWithInputMethodManager(InputMethodManager.SHOW_FORCED)).isTrue(),
-                true /* expected */,
-                true /* inputViewStarted */);
-        assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
+                EVENT_SHOW, true /* eventExpected */, true /* shown */, "IME is shown");
 
         verifyInputViewStatusOnMainSync(() -> assertThat(
                         mActivity.showImeWithInputMethodManager(0 /* flags */)).isTrue(),
-                false /* expected */,
-                true /* inputViewStarted */);
-        assertWithMessage("IME is still shown")
-                .that(mInputMethodService.isInputViewShown()).isTrue();
+                EVENT_SHOW, false /* eventExpected */, true /* shown */, "IME is still shown");
 
         verifyInputViewStatusOnMainSync(() -> assertThat(
                         mActivity.hideImeWithInputMethodManager(InputMethodManager.HIDE_NOT_ALWAYS))
                         .isTrue(),
-                false /* expected */,
-                true /* inputViewStarted */);
-        assertWithMessage("IME is still shown after HIDE_NOT_ALWAYS")
-                .that(mInputMethodService.isInputViewShown()).isTrue();
+                EVENT_HIDE, false /* eventExpected */, true /* shown */,
+                "IME is still shown after HIDE_NOT_ALWAYS");
     }
 
     /**
@@ -767,18 +689,15 @@
         setShowImeWithHardKeyboard(true /* enabled */);
 
         Log.i(TAG, "Set orientation natural");
-        verifyFullscreenMode(() -> setOrientation(0),
-                false /* expected */,
+        verifyFullscreenMode(() -> setOrientation(0), false /* eventExpected */,
                 true /* orientationPortrait */);
 
         Log.i(TAG, "Set orientation left");
-        verifyFullscreenMode(() -> setOrientation(1),
-                true /* expected */,
+        verifyFullscreenMode(() -> setOrientation(1), true /* eventExpected */,
                 false /* orientationPortrait */);
 
         Log.i(TAG, "Set orientation right");
-        verifyFullscreenMode(() -> setOrientation(2),
-                false /* expected */,
+        verifyFullscreenMode(() -> setOrientation(2), false /* eventExpected */,
                 false /* orientationPortrait */);
     }
 
@@ -812,9 +731,7 @@
                     setDrawsImeNavBarAndSwitcherButton(true /* enabled */);
                     mActivity.showImeWithWindowInsetsController();
                 },
-                true /* expected */,
-                true /* inputViewStarted */);
-        assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
+                EVENT_SHOW, true /* eventExpected */, true /* shown */, "IME is shown");
         assertWithMessage("IME navigation bar is initially shown")
                 .that(mInputMethodService.isImeNavigationBarShownForTesting()).isTrue();
 
@@ -849,9 +766,7 @@
                     setDrawsImeNavBarAndSwitcherButton(false /* enabled */);
                     mActivity.showImeWithWindowInsetsController();
                 },
-                true /* expected */,
-                true /* inputViewStarted */);
-        assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
+                EVENT_SHOW, true /* eventExpected */, true /* shown */, "IME is shown");
         assertWithMessage("IME navigation bar is initially not shown")
                 .that(mInputMethodService.isImeNavigationBarShownForTesting()).isFalse();
 
@@ -872,35 +787,25 @@
      * Verifies that clicking on the IME navigation bar back button hides the IME.
      */
     @Test
-    public void testBackButtonClick() {
+    public void testBackButtonClick() throws Exception {
         assumeTrue("Must have a navigation bar", hasNavigationBar());
-        assumeTrue("Must be in gesture navigation mode", isGestureNavEnabled());
 
         waitUntilActivityReadyForInputInjection(mActivity);
 
         setShowImeWithHardKeyboard(true /* enabled */);
 
-        verifyInputViewStatusOnMainSync(
-                () -> {
-                    setDrawsImeNavBarAndSwitcherButton(true /* enabled */);
-                    mActivity.showImeWithWindowInsetsController();
-                },
-                true /* expected */,
-                true /* inputViewStarted */);
-        assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
+        try (var ignored = mGestureNavSwitchHelper.withGestureNavigationMode()) {
+            verifyInputViewStatusOnMainSync(
+                    () -> mActivity.showImeWithWindowInsetsController(),
+                    EVENT_SHOW, true /* eventExpected */, true /* shown */, "IME is shown");
 
-        final var backButtonUiObject = getUiObject(By.res(INPUT_METHOD_NAV_BACK_ID));
-        backButtonUiObject.click();
-        mInstrumentation.waitForIdleSync();
-
-        if (mFlagsValueProvider.getBoolean(Flags.FLAG_REFACTOR_INSETS_CONTROLLER)) {
-            // The IME visibility is only sent at the end of the animation. Therefore, we have to
-            // wait until the visibility was sent to the server and the IME window hidden.
-            eventually(() -> assertWithMessage("IME is not shown")
-                    .that(mInputMethodService.isInputViewShown()).isFalse());
-        } else {
-            assertWithMessage("IME is not shown")
-                    .that(mInputMethodService.isInputViewShown()).isFalse();
+            final var backButton = getUiObject(By.res(INPUT_METHOD_NAV_BACK_ID));
+            verifyInputViewStatus(
+                    () -> {
+                        backButton.click();
+                        mInstrumentation.waitForIdleSync();
+                    },
+                    EVENT_HIDE, true /* eventExpected */, false /* shown */, "IME is not shown");
         }
     }
 
@@ -908,166 +813,177 @@
      * Verifies that long clicking on the IME navigation bar back button hides the IME.
      */
     @Test
-    public void testBackButtonLongClick() {
+    public void testBackButtonLongClick() throws Exception {
         assumeTrue("Must have a navigation bar", hasNavigationBar());
-        assumeTrue("Must be in gesture navigation mode", isGestureNavEnabled());
 
         waitUntilActivityReadyForInputInjection(mActivity);
 
         setShowImeWithHardKeyboard(true /* enabled */);
 
-        verifyInputViewStatusOnMainSync(
-                () -> {
-                    setDrawsImeNavBarAndSwitcherButton(true /* enabled */);
-                    mActivity.showImeWithWindowInsetsController();
-                },
-                true /* expected */,
-                true /* inputViewStarted */);
-        assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
+        try (var ignored = mGestureNavSwitchHelper.withGestureNavigationMode()) {
+            verifyInputViewStatusOnMainSync(
+                    () -> mActivity.showImeWithWindowInsetsController(),
+                    EVENT_SHOW, true /* eventExpected */, true /* shown */, "IME is shown");
 
-        final var backButtonUiObject = getUiObject(By.res(INPUT_METHOD_NAV_BACK_ID));
-        backButtonUiObject.longClick();
-        mInstrumentation.waitForIdleSync();
-
-        if (mFlagsValueProvider.getBoolean(Flags.FLAG_REFACTOR_INSETS_CONTROLLER)) {
-            // The IME visibility is only sent at the end of the animation. Therefore, we have to
-            // wait until the visibility was sent to the server and the IME window hidden.
-            eventually(() -> assertWithMessage("IME is not shown")
-                    .that(mInputMethodService.isInputViewShown()).isFalse());
-        } else {
-            assertWithMessage("IME is not shown")
-                    .that(mInputMethodService.isInputViewShown()).isFalse();
+            final var backButton = getUiObject(By.res(INPUT_METHOD_NAV_BACK_ID));
+            verifyInputViewStatus(
+                    () -> {
+                        backButton.longClick();
+                        mInstrumentation.waitForIdleSync();
+                    },
+                    EVENT_HIDE, true /* eventExpected */, false /* shown */, "IME is not shown");
         }
     }
 
     /**
-     * Verifies that clicking on the IME switch button either shows the Input Method Switcher Menu,
-     * or switches the input method.
+     * Verifies that clicking on the IME switch button switches the input method subtype.
      */
     @Test
-    public void testImeSwitchButtonClick() {
+    public void testImeSwitchButtonClick() throws Exception {
         assumeTrue("Must have a navigation bar", hasNavigationBar());
-        assumeTrue("Must be in gesture navigation mode", isGestureNavEnabled());
 
         waitUntilActivityReadyForInputInjection(mActivity);
 
         setShowImeWithHardKeyboard(true /* enabled */);
 
-        verifyInputViewStatusOnMainSync(
-                () -> {
-                    setDrawsImeNavBarAndSwitcherButton(true /* enabled */);
-                    mActivity.showImeWithWindowInsetsController();
-                },
-                true /* expected */,
-                true /* inputViewStarted */);
-        assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
+        final var info = mImm.getCurrentInputMethodInfo();
+        assertWithMessage("InputMethodInfo is not null").that(info).isNotNull();
+        mImm.setExplicitlyEnabledInputMethodSubtypes(info.getId(), SUBTYPE_IDS);
 
-        final var initialInfo = mImm.getCurrentInputMethodInfo();
+        final var initialSubtype = mImm.getCurrentInputMethodSubtype();
 
-        final var imeSwitchButtonUiObject = getUiObject(By.res(INPUT_METHOD_NAV_IME_SWITCHER_ID));
-        imeSwitchButtonUiObject.click();
-        mInstrumentation.waitForIdleSync();
+        try (var ignored = mGestureNavSwitchHelper.withGestureNavigationMode()) {
+            verifyInputViewStatusOnMainSync(
+                    () -> {
+                        setDrawsImeNavBarAndSwitcherButton(true /* enabled */);
+                        mActivity.showImeWithWindowInsetsController();
+                    },
+                    EVENT_SHOW, true /* eventExpected */, true /* shown */, "IME is shown");
 
-        final var newInfo = mImm.getCurrentInputMethodInfo();
+            final var imeSwitcherButton = getUiObject(By.res(INPUT_METHOD_NAV_IME_SWITCHER_ID));
+            imeSwitcherButton.click();
+            mInstrumentation.waitForIdleSync();
 
-        assertWithMessage("Input Method Switcher Menu is shown or input method was switched")
-                .that(isInputMethodPickerShown(mImm) || !Objects.equals(initialInfo, newInfo))
-                .isTrue();
+            final var newSubtype = mImm.getCurrentInputMethodSubtype();
 
-        assertWithMessage("IME is still shown after IME Switcher button was clicked")
-                .that(mInputMethodService.isInputViewShown()).isTrue();
+            assertWithMessage("Input method subtype was switched")
+                    .that(!Objects.equals(initialSubtype, newSubtype))
+                    .isTrue();
 
-        // Hide the IME Switcher Menu before finishing.
-        mUiDevice.pressBack();
+            assertWithMessage("IME is still shown after IME Switcher button was clicked")
+                    .that(mInputMethodService.isInputViewShown()).isTrue();
+        }
     }
 
     /**
      * Verifies that long clicking on the IME switch button shows the Input Method Switcher Menu.
      */
     @Test
-    public void testImeSwitchButtonLongClick() {
+    public void testImeSwitchButtonLongClick() throws Exception {
         assumeTrue("Must have a navigation bar", hasNavigationBar());
-        assumeTrue("Must be in gesture navigation mode", isGestureNavEnabled());
 
         waitUntilActivityReadyForInputInjection(mActivity);
 
         setShowImeWithHardKeyboard(true /* enabled */);
 
-        verifyInputViewStatusOnMainSync(
-                () -> {
-                    setDrawsImeNavBarAndSwitcherButton(true /* enabled */);
-                    mActivity.showImeWithWindowInsetsController();
-                },
-                true /* expected */,
-                true /* inputViewStarted */);
-        assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
+        final var info = mImm.getCurrentInputMethodInfo();
+        assertWithMessage("InputMethodInfo is not null").that(info).isNotNull();
+        mImm.setExplicitlyEnabledInputMethodSubtypes(info.getId(), SUBTYPE_IDS);
 
-        final var imeSwitchButtonUiObject = getUiObject(By.res(INPUT_METHOD_NAV_IME_SWITCHER_ID));
-        imeSwitchButtonUiObject.longClick();
-        mInstrumentation.waitForIdleSync();
+        try (var ignored = mGestureNavSwitchHelper.withGestureNavigationMode()) {
+            verifyInputViewStatusOnMainSync(
+                    () -> {
+                        setDrawsImeNavBarAndSwitcherButton(true /* enabled */);
+                        mActivity.showImeWithWindowInsetsController();
+                    },
+                    EVENT_SHOW, true /* eventExpected */, true /* shown */, "IME is shown");
 
-        assertWithMessage("Input Method Switcher Menu is shown")
-                .that(isInputMethodPickerShown(mImm)).isTrue();
-        assertWithMessage("IME is still shown after IME Switcher button was long clicked")
-                .that(mInputMethodService.isInputViewShown()).isTrue();
+            final var imeSwitcherButton = getUiObject(By.res(INPUT_METHOD_NAV_IME_SWITCHER_ID));
+            imeSwitcherButton.longClick();
+            mInstrumentation.waitForIdleSync();
 
-        // Hide the IME Switcher Menu before finishing.
-        mUiDevice.pressBack();
+            assertWithMessage("Input Method Switcher Menu is shown")
+                    .that(isInputMethodPickerShown(mImm)).isTrue();
+            assertWithMessage("IME is still shown after IME Switcher button was long clicked")
+                    .that(mInputMethodService.isInputViewShown()).isTrue();
+
+            // Hide the IME Switcher Menu before finishing.
+            mUiDevice.pressBack();
+        }
     }
 
-    private void verifyInputViewStatus(@NonNull Runnable runnable, boolean expected,
-            boolean inputViewStarted) {
-        verifyInputViewStatusInternal(runnable, expected, inputViewStarted,
-                false /* runOnMainSync */);
+    private void verifyInputViewStatus(@NonNull Runnable runnable, @Event int eventType,
+            boolean eventExpected, boolean shown, @NonNull String message) {
+        verifyInputViewStatusInternal(runnable, eventType, eventExpected,
+                shown /* inputViewStarted */, shown, message, false /* runOnMainSync */);
     }
 
-    private void verifyInputViewStatusOnMainSync(@NonNull Runnable runnable, boolean expected,
-            boolean inputViewStarted) {
-        verifyInputViewStatusInternal(runnable, expected, inputViewStarted,
-                true /* runOnMainSync */);
+    private void verifyInputViewStatusOnMainSync(@NonNull Runnable runnable, @Event int eventType,
+            boolean eventExpected, boolean shown, @NonNull String message) {
+        verifyInputViewStatusInternal(runnable, eventType, eventExpected,
+                shown /* inputViewStarted */, shown, message, true /* runOnMainSync */);
+    }
+
+    private void verifyInputViewStatusOnMainSync(@NonNull Runnable runnable, @Event int eventType,
+            boolean eventExpected, boolean inputViewStarted, boolean shown,
+            @NonNull String message) {
+        verifyInputViewStatusInternal(runnable, eventType, eventExpected, inputViewStarted, shown,
+                message, true /* runOnMainSync */);
     }
 
     /**
-     * Verifies the status of the Input View after executing the given runnable.
+     * Verifies the status of the Input View after executing the given runnable, and waiting that
+     * the event was either called or not.
      *
-     * @param runnable         the runnable to execute for showing or hiding the IME.
-     * @param expected         whether the runnable is expected to trigger the signal.
-     * @param inputViewStarted the expected state of the Input View after executing the runnable.
+     * @param runnable         the runnable to call the event.
+     * @param eventType        the event type to wait for.
+     * @param eventExpected    whether the event is expected to be called.
+     * @param inputViewStarted whether the input view is expected to be started.
+     * @param shown            whether the input view is expected to be shown.
+     * @param message          the message for the input view shown assertion.
      * @param runOnMainSync    whether to execute the runnable on the main thread.
      */
-    private void verifyInputViewStatusInternal(@NonNull Runnable runnable, boolean expected,
-            boolean inputViewStarted, boolean runOnMainSync) {
-        final boolean completed;
+    private void verifyInputViewStatusInternal(@NonNull Runnable runnable, @Event int eventType,
+            boolean eventExpected, boolean inputViewStarted, boolean shown, @NonNull String message,
+            boolean runOnMainSync) {
+        final boolean eventCalled;
         try {
             final var latch = new CountDownLatch(1);
-            mInputMethodService.setCountDownLatchForTesting(latch);
-            // Trigger onStartInputView() / onFinishInputView() / onConfigurationChanged()
+            mInputMethodService.setCountDownLatchForTesting(latch, eventType);
             if (runOnMainSync) {
                 mInstrumentation.runOnMainSync(runnable);
             } else {
                 runnable.run();
             }
             mInstrumentation.waitForIdleSync();
-            completed = latch.await(TIMEOUT_IN_SECONDS, TimeUnit.SECONDS);
+            eventCalled = latch.await(TIMEOUT_IN_SECONDS, TimeUnit.SECONDS);
         } catch (InterruptedException e) {
             fail("Interrupted while waiting for latch: " + e.getMessage());
             return;
         } finally {
-            mInputMethodService.setCountDownLatchForTesting(null);
+            mInputMethodService.setCountDownLatchForTesting(null /* latch */, eventType);
         }
 
-        if (expected && !completed) {
-            fail("Timed out waiting for"
-                    + " onStartInputView() / onFinishInputView() / onConfigurationChanged()");
-        } else if (!expected && completed) {
-            fail("Unexpected call"
-                    + " onStartInputView() / onFinishInputView() / onConfigurationChanged()");
+        if (eventExpected && !eventCalled) {
+            fail("Timed out waiting for " + eventToString(eventType));
+        } else if (!eventExpected && eventCalled) {
+            fail("Unexpected call " + eventToString(eventType));
         }
-        // Input is not finished.
+        // Input connection is not finished.
         assertWithMessage("Input connection is still started")
                 .that(mInputMethodService.getCurrentInputStarted()).isTrue();
-        assertWithMessage("IME visibility matches expected")
+        assertWithMessage("Input view started matches expected")
                 .that(mInputMethodService.getCurrentInputViewStarted()).isEqualTo(inputViewStarted);
+
+        if (mFlagsValueProvider.getBoolean(Flags.FLAG_REFACTOR_INSETS_CONTROLLER)) {
+            // The IME visibility is only sent at the end of the hide animation. Therefore, we have
+            // to wait until the visibility was sent to the server and the IME window hidden.
+            eventually(() -> assertWithMessage(message).that(mInputMethodService.isInputViewShown())
+                    .isEqualTo(shown));
+        } else {
+            assertWithMessage(message).that(mInputMethodService.isInputViewShown())
+                    .isEqualTo(shown);
+        }
     }
 
     private void setOrientation(int orientation) {
@@ -1091,27 +1007,28 @@
     /**
      * Verifies the IME fullscreen mode state after executing the given runnable.
      *
-     * @param runnable            the runnable to execute for setting the orientation.
-     * @param expected            whether the runnable is expected to trigger the signal.
+     * @param runnable            the runnable to set the orientation.
+     * @param eventExpected       whether the event is expected to be called.
      * @param orientationPortrait whether the orientation is expected to be portrait.
      */
-    private void verifyFullscreenMode(@NonNull Runnable runnable, boolean expected,
+    private void verifyFullscreenMode(@NonNull Runnable runnable, boolean eventExpected,
             boolean orientationPortrait) {
-        verifyInputViewStatus(runnable, expected, false /* inputViewStarted */);
-        if (expected) {
+        verifyInputViewStatus(runnable, EVENT_CONFIG, eventExpected, false /* shown */,
+                "IME is not shown");
+        if (eventExpected) {
             // Wait for the TestActivity to be recreated.
             eventually(() -> assertWithMessage("Activity was re-created after rotation")
-                    .that(TestActivity.getLastCreatedInstance()).isNotEqualTo(mActivity));
+                    .that(TestActivity.getInstance()).isNotEqualTo(mActivity));
             // Get the new TestActivity.
-            mActivity = TestActivity.getLastCreatedInstance();
+            mActivity = TestActivity.getInstance();
             assertWithMessage("Re-created activity is not null").that(mActivity).isNotNull();
+            // Wait for the new EditText to be served by InputMethodManager.
+            eventually(() -> assertWithMessage("Has an input connection to the re-created Activity")
+                    .that(mImm.hasActiveInputConnection(mActivity.getEditText())).isTrue());
         }
 
-        verifyInputViewStatusOnMainSync(
-                () -> mActivity.showImeWithWindowInsetsController(),
-                true /* expected */,
-                true /* inputViewStarted */);
-        assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
+        verifyInputViewStatusOnMainSync(() -> mActivity.showImeWithWindowInsetsController(),
+                EVENT_SHOW, true /* eventExpected */, true /* shown */, "IME is shown");
 
         assertWithMessage("IME orientation matches expected")
                 .that(mInputMethodService.getResources().getConfiguration().orientation)
@@ -1132,20 +1049,8 @@
                 .that(mInputMethodService.isFullscreenMode()).isEqualTo(!orientationPortrait);
 
         // Hide IME before finishing the run.
-        verifyInputViewStatusOnMainSync(
-                () -> mActivity.hideImeWithWindowInsetsController(),
-                true /* expected */,
-                false /* inputViewStarted */);
-
-        if (mFlagsValueProvider.getBoolean(Flags.FLAG_REFACTOR_INSETS_CONTROLLER)) {
-            // The IME visibility is only sent at the end of the animation. Therefore, we have to
-            // wait until the visibility was sent to the server and the IME window hidden.
-            eventually(() -> assertWithMessage("IME is not shown")
-                    .that(mInputMethodService.isInputViewShown()).isFalse());
-        } else {
-            assertWithMessage("IME is not shown")
-                    .that(mInputMethodService.isInputViewShown()).isFalse();
-        }
+        verifyInputViewStatusOnMainSync(() -> mActivity.hideImeWithWindowInsetsController(),
+                EVENT_HIDE, true /* eventExpected */, false /* shown */, "IME is not shown");
     }
 
     private void prepareIme() {
@@ -1214,18 +1119,12 @@
         return uiObject;
     }
 
-    /** Checks whether gesture navigation move is enabled. */
-    private boolean isGestureNavEnabled() {
-        return mContext.getResources().getInteger(
-                com.android.internal.R.integer.config_navBarInteractionMode)
-                == WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL;
-    }
-
     /** Checks whether the device has a navigation bar on the IME's display. */
     private boolean hasNavigationBar() {
         try {
             return WindowManagerGlobal.getWindowManagerService()
-                    .hasNavigationBar(mInputMethodService.getDisplayId());
+                    .hasNavigationBar(mInputMethodService.getDisplayId())
+                    && mGestureNavSwitchHelper.hasNavigationBar();
         } catch (RemoteException e) {
             fail("Failed to check whether the device has a navigation bar: " + e.getMessage());
             return false;
diff --git a/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodManagerServiceTestBase.java b/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodManagerServiceTestBase.java
index 3af5db9..6af4064 100644
--- a/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodManagerServiceTestBase.java
+++ b/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodManagerServiceTestBase.java
@@ -66,6 +66,7 @@
 import com.android.internal.inputmethod.IRemoteAccessibilityInputConnection;
 import com.android.internal.inputmethod.IRemoteInputConnection;
 import com.android.internal.inputmethod.InputBindResult;
+import com.android.internal.protolog.IProtoLogConfigurationService;
 import com.android.internal.view.IInputMethodManager;
 import com.android.server.LocalServices;
 import com.android.server.ServiceThread;
@@ -124,6 +125,7 @@
     @Mock protected IBinder mMockInputMethodBinder;
     @Mock protected IInputManager mMockIInputManager;
     @Mock protected ImeTargetVisibilityPolicy mMockImeTargetVisibilityPolicy;
+    @Mock protected IProtoLogConfigurationService.Stub mMockProtoLogConfigurationService;
 
     protected Context mContext;
     protected MockitoSession mMockingSession;
@@ -186,6 +188,9 @@
                 .when(() -> ServiceManager.getServiceOrThrow(Context.INPUT_METHOD_SERVICE));
         doReturn(mMockIPlatformCompat)
                 .when(() -> ServiceManager.getService(Context.PLATFORM_COMPAT_SERVICE));
+        doReturn(mMockProtoLogConfigurationService)
+                .when(() -> ServiceManager.getServiceOrThrow(
+                        Context.PROTOLOG_CONFIGURATION_SERVICE));
 
         // Stubbing out context related methods to avoid the system holding strong references to
         // InputMethodManagerService.
diff --git a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/Android.bp b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/Android.bp
index 8a12dcd..e2362f7 100644
--- a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/Android.bp
+++ b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/Android.bp
@@ -53,6 +53,9 @@
     srcs: [
         "src/com/android/apps/inputmethod/simpleime/ims/*.java",
     ],
+    static_libs: [
+        "androidx.annotation_annotation",
+    ],
     sdk_version: "current",
 }
 
diff --git a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/AndroidManifest.xml b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/AndroidManifest.xml
index cf7d660..00873de 100644
--- a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/AndroidManifest.xml
+++ b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/AndroidManifest.xml
@@ -42,6 +42,7 @@
         <activity android:name="com.android.apps.inputmethod.simpleime.testing.TestActivity"
                   android:exported="false"
                   android:label="TestActivity"
+                  android:configChanges="assetsPaths"
                   android:launchMode="singleInstance"
                   android:excludeFromRecents="true"
                   android:noHistory="true"
diff --git a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/res/xml/method.xml b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/res/xml/method.xml
index 872b068..3dd4a97 100644
--- a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/res/xml/method.xml
+++ b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/res/xml/method.xml
@@ -17,7 +17,14 @@
 
 <input-method xmlns:android="http://schemas.android.com/apk/res/android">
     <subtype
-        android:label="FakeIme"
+        android:label="SimpleIme"
         android:imeSubtypeLocale="en_US"
-        android:imeSubtypeMode="keyboard"/>
+        android:imeSubtypeMode="keyboard"
+        android:subtypeId="1" />
+
+    <subtype
+        android:label="SimpleIme French"
+        android:imeSubtypeLocale="fr_FR"
+        android:imeSubtypeMode="keyboard"
+        android:subtypeId="2" />
 </input-method>
\ No newline at end of file
diff --git a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/KeyCodeConstants.java b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/KeyCodeConstants.java
index 990fa24..428ce1f 100644
--- a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/KeyCodeConstants.java
+++ b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/KeyCodeConstants.java
@@ -18,51 +18,58 @@
 
 import android.view.KeyEvent;
 
-import java.util.HashMap;
+import androidx.annotation.NonNull;
 
 /** Holder of key codes and their name. */
-public final class KeyCodeConstants {
-    private KeyCodeConstants() {}
+final class KeyCodeConstants {
 
-    static final HashMap<String, Integer> KEY_NAME_TO_CODE_MAP = new HashMap<>();
-
-    static {
-        KEY_NAME_TO_CODE_MAP.put("KEYCODE_A", KeyEvent.KEYCODE_A);
-        KEY_NAME_TO_CODE_MAP.put("KEYCODE_B", KeyEvent.KEYCODE_B);
-        KEY_NAME_TO_CODE_MAP.put("KEYCODE_C", KeyEvent.KEYCODE_C);
-        KEY_NAME_TO_CODE_MAP.put("KEYCODE_D", KeyEvent.KEYCODE_D);
-        KEY_NAME_TO_CODE_MAP.put("KEYCODE_E", KeyEvent.KEYCODE_E);
-        KEY_NAME_TO_CODE_MAP.put("KEYCODE_F", KeyEvent.KEYCODE_F);
-        KEY_NAME_TO_CODE_MAP.put("KEYCODE_G", KeyEvent.KEYCODE_G);
-        KEY_NAME_TO_CODE_MAP.put("KEYCODE_H", KeyEvent.KEYCODE_H);
-        KEY_NAME_TO_CODE_MAP.put("KEYCODE_I", KeyEvent.KEYCODE_I);
-        KEY_NAME_TO_CODE_MAP.put("KEYCODE_J", KeyEvent.KEYCODE_J);
-        KEY_NAME_TO_CODE_MAP.put("KEYCODE_K", KeyEvent.KEYCODE_K);
-        KEY_NAME_TO_CODE_MAP.put("KEYCODE_L", KeyEvent.KEYCODE_L);
-        KEY_NAME_TO_CODE_MAP.put("KEYCODE_M", KeyEvent.KEYCODE_M);
-        KEY_NAME_TO_CODE_MAP.put("KEYCODE_N", KeyEvent.KEYCODE_N);
-        KEY_NAME_TO_CODE_MAP.put("KEYCODE_O", KeyEvent.KEYCODE_O);
-        KEY_NAME_TO_CODE_MAP.put("KEYCODE_P", KeyEvent.KEYCODE_P);
-        KEY_NAME_TO_CODE_MAP.put("KEYCODE_Q", KeyEvent.KEYCODE_Q);
-        KEY_NAME_TO_CODE_MAP.put("KEYCODE_R", KeyEvent.KEYCODE_R);
-        KEY_NAME_TO_CODE_MAP.put("KEYCODE_S", KeyEvent.KEYCODE_S);
-        KEY_NAME_TO_CODE_MAP.put("KEYCODE_T", KeyEvent.KEYCODE_T);
-        KEY_NAME_TO_CODE_MAP.put("KEYCODE_U", KeyEvent.KEYCODE_U);
-        KEY_NAME_TO_CODE_MAP.put("KEYCODE_V", KeyEvent.KEYCODE_V);
-        KEY_NAME_TO_CODE_MAP.put("KEYCODE_W", KeyEvent.KEYCODE_W);
-        KEY_NAME_TO_CODE_MAP.put("KEYCODE_X", KeyEvent.KEYCODE_X);
-        KEY_NAME_TO_CODE_MAP.put("KEYCODE_Y", KeyEvent.KEYCODE_Y);
-        KEY_NAME_TO_CODE_MAP.put("KEYCODE_Z", KeyEvent.KEYCODE_Z);
-        KEY_NAME_TO_CODE_MAP.put("KEYCODE_SHIFT", KeyEvent.KEYCODE_SHIFT_LEFT);
-        KEY_NAME_TO_CODE_MAP.put("KEYCODE_DEL", KeyEvent.KEYCODE_DEL);
-        KEY_NAME_TO_CODE_MAP.put("KEYCODE_SPACE", KeyEvent.KEYCODE_SPACE);
-        KEY_NAME_TO_CODE_MAP.put("KEYCODE_ENTER", KeyEvent.KEYCODE_ENTER);
-        KEY_NAME_TO_CODE_MAP.put("KEYCODE_COMMA", KeyEvent.KEYCODE_COMMA);
-        KEY_NAME_TO_CODE_MAP.put("KEYCODE_PERIOD", KeyEvent.KEYCODE_PERIOD);
-        KEY_NAME_TO_CODE_MAP.put("KEYCODE_TAB", KeyEvent.KEYCODE_TAB);
+    private KeyCodeConstants() {
     }
 
-    public static boolean isAlphaKeyCode(int keyCode) {
+    /**
+     * Returns the keyCode value corresponding to the given keyCode name.
+     *
+     * @param keyCodeName the keyCode name.
+     */
+    static int getKeyCode(@NonNull String keyCodeName) {
+        return switch (keyCodeName) {
+            case "KEYCODE_A" -> KeyEvent.KEYCODE_A;
+            case "KEYCODE_B" -> KeyEvent.KEYCODE_B;
+            case "KEYCODE_C" -> KeyEvent.KEYCODE_C;
+            case "KEYCODE_D" -> KeyEvent.KEYCODE_D;
+            case "KEYCODE_E" -> KeyEvent.KEYCODE_E;
+            case "KEYCODE_F" -> KeyEvent.KEYCODE_F;
+            case "KEYCODE_G" -> KeyEvent.KEYCODE_G;
+            case "KEYCODE_H" -> KeyEvent.KEYCODE_H;
+            case "KEYCODE_I" -> KeyEvent.KEYCODE_I;
+            case "KEYCODE_J" -> KeyEvent.KEYCODE_J;
+            case "KEYCODE_K" -> KeyEvent.KEYCODE_K;
+            case "KEYCODE_L" -> KeyEvent.KEYCODE_L;
+            case "KEYCODE_M" -> KeyEvent.KEYCODE_M;
+            case "KEYCODE_N" -> KeyEvent.KEYCODE_N;
+            case "KEYCODE_O" -> KeyEvent.KEYCODE_O;
+            case "KEYCODE_P" -> KeyEvent.KEYCODE_P;
+            case "KEYCODE_Q" -> KeyEvent.KEYCODE_Q;
+            case "KEYCODE_R" -> KeyEvent.KEYCODE_R;
+            case "KEYCODE_S" -> KeyEvent.KEYCODE_S;
+            case "KEYCODE_T" -> KeyEvent.KEYCODE_T;
+            case "KEYCODE_U" -> KeyEvent.KEYCODE_U;
+            case "KEYCODE_V" -> KeyEvent.KEYCODE_V;
+            case "KEYCODE_W" -> KeyEvent.KEYCODE_W;
+            case "KEYCODE_X" -> KeyEvent.KEYCODE_X;
+            case "KEYCODE_Y" -> KeyEvent.KEYCODE_Y;
+            case "KEYCODE_Z" -> KeyEvent.KEYCODE_Z;
+            case "KEYCODE_SHIFT" -> KeyEvent.KEYCODE_SHIFT_LEFT;
+            case "KEYCODE_DEL" -> KeyEvent.KEYCODE_DEL;
+            case "KEYCODE_SPACE" -> KeyEvent.KEYCODE_SPACE;
+            case "KEYCODE_ENTER" -> KeyEvent.KEYCODE_ENTER;
+            case "KEYCODE_COMMA" -> KeyEvent.KEYCODE_COMMA;
+            case "KEYCODE_PERIOD" -> KeyEvent.KEYCODE_PERIOD;
+            default -> KeyEvent.KEYCODE_UNKNOWN;
+        };
+    }
+
+    static boolean isAlphaKeyCode(int keyCode) {
         return keyCode >= KeyEvent.KEYCODE_A && keyCode <= KeyEvent.KEYCODE_Z;
     }
 }
diff --git a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/SimpleInputMethodService.java b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/SimpleInputMethodService.java
index 61d1bb9..de9b528 100644
--- a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/SimpleInputMethodService.java
+++ b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/SimpleInputMethodService.java
@@ -20,45 +20,41 @@
 import android.os.SystemClock;
 import android.util.Log;
 import android.view.KeyEvent;
-import android.view.LayoutInflater;
 import android.view.View;
-import android.view.inputmethod.EditorInfo;
-import android.widget.FrameLayout;
 
 import androidx.annotation.NonNull;
 
 import com.android.apps.inputmethod.simpleime.ims.InputMethodServiceWrapper;
 
-/** The {@link InputMethodService} implementation for SimpleTestIme app. */
+/** A simple implementation of an {@link InputMethodService}. */
 public final class SimpleInputMethodService extends InputMethodServiceWrapper {
 
     private static final String TAG = "SimpleIMS";
 
-    private FrameLayout mInputView;
-
     @Override
     public View onCreateInputView() {
         Log.i(TAG, "onCreateInputView()");
-        mInputView = (FrameLayout) LayoutInflater.from(this).inflate(R.layout.input_view, null);
-        return mInputView;
+        final var simpleKeyboard = new SimpleKeyboardView(this);
+        simpleKeyboard.setKeyPressListener(this::onKeyPress);
+        return simpleKeyboard;
     }
 
-    @Override
-    public void onStartInputView(EditorInfo info, boolean restarting) {
-        super.onStartInputView(info, restarting);
-        mInputView.removeAllViews();
-        final var keyboard = new SimpleKeyboard(this, R.layout.qwerty_10_9_9);
-        mInputView.addView(keyboard.inflateKeyboardView(LayoutInflater.from(this), mInputView));
-    }
-
-    void handleKeyPress(@NonNull String keyCodeName, int keyboardState) {
-        final Integer keyCode = KeyCodeConstants.KEY_NAME_TO_CODE_MAP.get(keyCodeName);
-        Log.v(TAG, "keyCode: " + keyCode);
-        if (keyCode != null) {
-            final var downTime = SystemClock.uptimeMillis();
-            getCurrentInputConnection().sendKeyEvent(new KeyEvent(downTime, downTime,
-                    KeyEvent.ACTION_DOWN, keyCode, 0 /* repeat */,
-                    KeyCodeConstants.isAlphaKeyCode(keyCode) ? keyboardState : 0) /* metaState */);
+    /**
+     * Called when a key is pressed.
+     *
+     * @param keyCodeName the keycode of the key, as a string.
+     * @param metaState   the flags indicating which meta keys are currently pressed.
+     */
+    private void onKeyPress(@NonNull String keyCodeName, int metaState) {
+        final int keyCode = KeyCodeConstants.getKeyCode(keyCodeName);
+        Log.v(TAG, "onKeyPress: " + keyCode);
+        if (keyCode != KeyEvent.KEYCODE_UNKNOWN) {
+            final var ic = getCurrentInputConnection();
+            if (ic != null) {
+                final var downTime = SystemClock.uptimeMillis();
+                ic.sendKeyEvent(new KeyEvent(downTime, downTime, KeyEvent.ACTION_DOWN, keyCode,
+                        0 /* repeat */, KeyCodeConstants.isAlphaKeyCode(keyCode) ? metaState : 0));
+            }
         }
     }
 }
diff --git a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/SimpleKeyboard.java b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/SimpleKeyboard.java
deleted file mode 100644
index 62d90c8..0000000
--- a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/SimpleKeyboard.java
+++ /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.apps.inputmethod.simpleime;
-
-import android.text.TextUtils;
-import android.util.Log;
-import android.util.SparseArray;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.TextView;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-/** Controls the visible virtual keyboard view. */
-final class SimpleKeyboard {
-
-    private static final String TAG = "SimpleKeyboard";
-
-    private static final int[] SOFT_KEY_IDS = new int[]{
-            R.id.key_pos_0_0,
-            R.id.key_pos_0_1,
-            R.id.key_pos_0_2,
-            R.id.key_pos_0_3,
-            R.id.key_pos_0_4,
-            R.id.key_pos_0_5,
-            R.id.key_pos_0_6,
-            R.id.key_pos_0_7,
-            R.id.key_pos_0_8,
-            R.id.key_pos_0_9,
-            R.id.key_pos_1_0,
-            R.id.key_pos_1_1,
-            R.id.key_pos_1_2,
-            R.id.key_pos_1_3,
-            R.id.key_pos_1_4,
-            R.id.key_pos_1_5,
-            R.id.key_pos_1_6,
-            R.id.key_pos_1_7,
-            R.id.key_pos_1_8,
-            R.id.key_pos_2_0,
-            R.id.key_pos_2_1,
-            R.id.key_pos_2_2,
-            R.id.key_pos_2_3,
-            R.id.key_pos_2_4,
-            R.id.key_pos_2_5,
-            R.id.key_pos_2_6,
-            R.id.key_pos_shift,
-            R.id.key_pos_del,
-            R.id.key_pos_symbol,
-            R.id.key_pos_comma,
-            R.id.key_pos_space,
-            R.id.key_pos_period,
-            R.id.key_pos_enter,
-    };
-
-    @NonNull
-    private final SimpleInputMethodService mSimpleInputMethodService;
-    private final int mViewResId;
-    private final SparseArray<TextView> mSoftKeyViews = new SparseArray<>();
-    private View mKeyboardView;
-    private int mKeyboardState;
-
-    SimpleKeyboard(@NonNull SimpleInputMethodService simpleInputMethodService, int viewResId) {
-        mSimpleInputMethodService = simpleInputMethodService;
-        mViewResId = viewResId;
-        mKeyboardState = 0;
-    }
-
-    @NonNull
-    View inflateKeyboardView(@NonNull LayoutInflater inflater, @NonNull ViewGroup inputView) {
-        mKeyboardView = inflater.inflate(mViewResId, inputView, false);
-        mapSoftKeys();
-        return mKeyboardView;
-    }
-
-    private void mapSoftKeys() {
-        for (int id : SOFT_KEY_IDS) {
-            final TextView softKeyView = mKeyboardView.requireViewById(id);
-            mSoftKeyViews.put(id, softKeyView);
-            final var keyCodeName = softKeyView.getTag() != null
-                    ? softKeyView.getTag().toString() : null;
-            softKeyView.setOnClickListener(v -> handleKeyPress(keyCodeName));
-        }
-    }
-
-    private void handleKeyPress(@Nullable String keyCodeName) {
-        Log.i(TAG, "handle(): " + keyCodeName);
-        if (TextUtils.isEmpty(keyCodeName)) {
-            return;
-        }
-        if ("KEYCODE_SHIFT".equals(keyCodeName)) {
-            handleShift();
-            return;
-        }
-
-        mSimpleInputMethodService.handleKeyPress(keyCodeName, mKeyboardState);
-    }
-
-    private void handleShift() {
-        mKeyboardState = toggleShiftState(mKeyboardState);
-        Log.v(TAG, "currentKeyboardState: " + mKeyboardState);
-        final boolean isShiftOn = isShiftOn(mKeyboardState);
-        for (int i = 0; i < mSoftKeyViews.size(); i++) {
-            TextView softKeyView = mSoftKeyViews.valueAt(i);
-            softKeyView.setAllCaps(isShiftOn);
-        }
-    }
-
-    private static boolean isShiftOn(int state) {
-        return (state & KeyEvent.META_SHIFT_ON) == KeyEvent.META_SHIFT_ON;
-    }
-
-    private static int toggleShiftState(int state) {
-        return state ^ KeyEvent.META_SHIFT_ON;
-    }
-}
diff --git a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/SimpleKeyboardView.java b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/SimpleKeyboardView.java
new file mode 100644
index 0000000..1840cde
--- /dev/null
+++ b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/SimpleKeyboardView.java
@@ -0,0 +1,191 @@
+/*
+ * 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.apps.inputmethod.simpleime;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.util.SparseArray;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.WindowInsets;
+import android.widget.FrameLayout;
+import android.widget.TextView;
+
+import androidx.annotation.AttrRes;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+/** A simple implementation of a software keyboard view. */
+final class SimpleKeyboardView extends FrameLayout {
+
+    private static final String TAG = "SimpleKeyboard";
+
+    private static final int[] SOFT_KEY_IDS = new int[]{
+            R.id.key_pos_0_0,
+            R.id.key_pos_0_1,
+            R.id.key_pos_0_2,
+            R.id.key_pos_0_3,
+            R.id.key_pos_0_4,
+            R.id.key_pos_0_5,
+            R.id.key_pos_0_6,
+            R.id.key_pos_0_7,
+            R.id.key_pos_0_8,
+            R.id.key_pos_0_9,
+            R.id.key_pos_1_0,
+            R.id.key_pos_1_1,
+            R.id.key_pos_1_2,
+            R.id.key_pos_1_3,
+            R.id.key_pos_1_4,
+            R.id.key_pos_1_5,
+            R.id.key_pos_1_6,
+            R.id.key_pos_1_7,
+            R.id.key_pos_1_8,
+            R.id.key_pos_2_0,
+            R.id.key_pos_2_1,
+            R.id.key_pos_2_2,
+            R.id.key_pos_2_3,
+            R.id.key_pos_2_4,
+            R.id.key_pos_2_5,
+            R.id.key_pos_2_6,
+            R.id.key_pos_shift,
+            R.id.key_pos_del,
+            R.id.key_pos_symbol,
+            R.id.key_pos_comma,
+            R.id.key_pos_space,
+            R.id.key_pos_period,
+            R.id.key_pos_enter,
+    };
+
+    private final SparseArray<TextView> mSoftKeyViews = new SparseArray<>();
+
+    @FunctionalInterface
+    interface KeyPressListener {
+
+        /**
+         * Called when a key is pressed.
+         *
+         * @param keyCodeName the keycode of the key, as a string.
+         * @param metaState   the flags indicating which meta keys are currently pressed.
+         */
+        void onKeyPress(@NonNull String keyCodeName, int metaState);
+    }
+
+    /** A listener to react to key presses. */
+    @Nullable
+    private KeyPressListener mKeyPressListener;
+
+    /** The flags indicating which meta keys are currently pressed. */
+    private int mMetaState;
+
+    SimpleKeyboardView(@NonNull Context context) {
+        this(context, null);
+    }
+
+    SimpleKeyboardView(@NonNull Context context, @Nullable AttributeSet attrs) {
+        this(context, attrs, 0 /* defStyleAttr */);
+    }
+
+    SimpleKeyboardView(@NonNull Context context, @Nullable AttributeSet attrs,
+            @AttrRes int defStyleAttr) {
+        super(context, attrs, defStyleAttr, 0 /* defStyleRes */);
+        LayoutInflater.from(context).inflate(R.layout.qwerty_10_9_9, this, true);
+        mapSoftKeys();
+    }
+
+    @Override
+    public WindowInsets onApplyWindowInsets(WindowInsets insets) {
+        // Handle edge to edge for navigationBars insets (system nav bar)
+        // and captionBars insets (IME navigation bar).
+        final int insetBottom = insets.getInsets(WindowInsets.Type.systemBars()).bottom;
+        setPadding(getPaddingLeft(), getPaddingTop(), getPaddingRight(), insetBottom);
+        return insets.inset(0, 0, 0, insetBottom);
+    }
+
+    /**
+     * Sets the key press listener.
+     *
+     * @param listener the listener to set.
+     */
+    void setKeyPressListener(@NonNull KeyPressListener listener) {
+        mKeyPressListener = listener;
+    }
+
+    /** Maps the soft key ids to their corresponding views, and sets their on click listener. */
+    private void mapSoftKeys() {
+        for (final int id : SOFT_KEY_IDS) {
+            final TextView softKeyView = requireViewById(id);
+            mSoftKeyViews.put(id, softKeyView);
+            final var keyCodeName = softKeyView.getTag() != null
+                    ? softKeyView.getTag().toString() : null;
+            softKeyView.setOnClickListener(v -> onKeyPress(keyCodeName));
+        }
+    }
+
+    /**
+     * Called when a key is pressed.
+     *
+     * @param keyCodeName the keycode of the key, as a string.
+     */
+    private void onKeyPress(@Nullable String keyCodeName) {
+        Log.i(TAG, "onKeyPress: " + keyCodeName);
+        if (TextUtils.isEmpty(keyCodeName)) {
+            return;
+        }
+        if ("KEYCODE_SHIFT".equals(keyCodeName)) {
+            onShiftPress();
+            return;
+        }
+
+        if (mKeyPressListener != null) {
+            mKeyPressListener.onKeyPress(keyCodeName, mMetaState);
+        }
+    }
+
+    /**
+     * Called when the shift key is pressed. This will toggle the capitalization of all the keys.
+     */
+    private void onShiftPress() {
+        mMetaState = toggleShiftState(mMetaState);
+        Log.v(TAG, "onShiftPress, new metaState: " + mMetaState);
+        final boolean isShiftOn = isShiftOn(mMetaState);
+        for (int i = 0; i < mSoftKeyViews.size(); i++) {
+            final TextView softKeyView = mSoftKeyViews.valueAt(i);
+            softKeyView.setAllCaps(isShiftOn);
+        }
+    }
+
+    /**
+     * Checks whether the shift meta key is pressed.
+     *
+     * @param state the flags indicating which meta keys are currently pressed.
+     */
+    private static boolean isShiftOn(int state) {
+        return (state & KeyEvent.META_SHIFT_ON) == KeyEvent.META_SHIFT_ON;
+    }
+
+    /**
+     * Toggles the value of the shift meta key being pressed.
+     *
+     * @param state the flags indicating which meta keys are currently pressed.
+     * @return a new flag state, with the shift meta key value flipped.
+     */
+    private static int toggleShiftState(int state) {
+        return state ^ KeyEvent.META_SHIFT_ON;
+    }
+}
diff --git a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/ims/InputMethodServiceWrapper.java b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/ims/InputMethodServiceWrapper.java
index be59dd2..558d1a7 100644
--- a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/ims/InputMethodServiceWrapper.java
+++ b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/ims/InputMethodServiceWrapper.java
@@ -21,6 +21,13 @@
 import android.util.Log;
 import android.view.inputmethod.EditorInfo;
 
+import androidx.annotation.IntDef;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.ref.WeakReference;
 import java.util.concurrent.CountDownLatch;
 
 /** Wrapper of {@link InputMethodService} to expose interfaces for testing purpose. */
@@ -29,40 +36,44 @@
     private static final String TAG = "InputMethodServiceWrapper";
 
     /** Last created instance of this wrapper. */
-    private static InputMethodServiceWrapper sInstance;
+    @NonNull
+    private static WeakReference<InputMethodServiceWrapper> sInstance = new WeakReference<>(null);
+
+    /** IME show event ({@link #onStartInputView}). */
+    public static final int EVENT_SHOW = 0;
+
+    /** IME hide event ({@link #onFinishInputView}). */
+    public static final int EVENT_HIDE = 1;
+
+    /** IME configuration change event ({@link #onConfigurationChanged}). */
+    public static final int EVENT_CONFIG = 2;
+
+    /** The type of event that can be waited with a latch. */
+    @IntDef(value = {
+            EVENT_SHOW,
+            EVENT_HIDE,
+            EVENT_CONFIG,
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface Event {}
+
+    /** The IME event type that the current latch, if any, waits on. */
+    @Event
+    private int mLatchEvent;
 
     private boolean mInputViewStarted;
 
     /**
      * @see #setCountDownLatchForTesting
      */
-    private CountDownLatch mCountDownLatchForTesting;
-
-    /** Gets the last created instance of this wrapper, if available. */
-    public static InputMethodServiceWrapper getInstance() {
-        return sInstance;
-    }
-
-    public boolean getCurrentInputViewStarted() {
-        return mInputViewStarted;
-    }
-
-    /**
-     * Sets the latch used to wait for the IME to start showing ({@link #onStartInputView},
-     * start hiding ({@link #onFinishInputView}) or receive a configuration change
-     * ({@link #onConfigurationChanged}).
-     *
-     * @param countDownLatchForTesting the latch to wait on.
-     */
-    public void setCountDownLatchForTesting(CountDownLatch countDownLatchForTesting) {
-        mCountDownLatchForTesting = countDownLatchForTesting;
-    }
+    @Nullable
+    private CountDownLatch mCountDownLatch;
 
     @Override
     public void onCreate() {
         Log.i(TAG, "onCreate()");
         super.onCreate();
-        sInstance = this;
+        sInstance = new WeakReference<>(this);
     }
 
     @Override
@@ -72,30 +83,30 @@
     }
 
     @Override
+    public void onFinishInput() {
+        Log.i(TAG, "onFinishInput()");
+        super.onFinishInput();
+    }
+
+    @Override
     public void onStartInputView(EditorInfo info, boolean restarting) {
         Log.i(TAG, "onStartInputView() editor=" + dumpEditorInfo(info)
                 + ", restarting=" + restarting);
         super.onStartInputView(info, restarting);
         mInputViewStarted = true;
-        if (mCountDownLatchForTesting != null) {
-            mCountDownLatchForTesting.countDown();
+        if (mCountDownLatch != null && mLatchEvent == EVENT_SHOW) {
+            mCountDownLatch.countDown();
         }
     }
 
     @Override
-    public void onFinishInput() {
-        Log.i(TAG, "onFinishInput()");
-        super.onFinishInput();
-    }
-
-    @Override
     public void onFinishInputView(boolean finishingInput) {
         Log.i(TAG, "onFinishInputView()");
         super.onFinishInputView(finishingInput);
         mInputViewStarted = false;
 
-        if (mCountDownLatchForTesting != null) {
-            mCountDownLatchForTesting.countDown();
+        if (mCountDownLatch != null && mLatchEvent == EVENT_HIDE) {
+            mCountDownLatch.countDown();
         }
     }
 
@@ -110,11 +121,48 @@
         Log.i(TAG, "onConfigurationChanged() " + newConfig);
         super.onConfigurationChanged(newConfig);
 
-        if (mCountDownLatchForTesting != null) {
-            mCountDownLatchForTesting.countDown();
+        if (mCountDownLatch != null && mLatchEvent == EVENT_CONFIG) {
+            mCountDownLatch.countDown();
         }
     }
 
+    public boolean getCurrentInputViewStarted() {
+        return mInputViewStarted;
+    }
+
+    /**
+     * Sets the latch used to wait for the IME event.
+     *
+     * @param latch      the latch to wait on.
+     * @param latchEvent the event to set the latch on.
+     */
+    public void setCountDownLatchForTesting(@Nullable CountDownLatch latch, @Event int latchEvent) {
+        mCountDownLatch = latch;
+        mLatchEvent = latchEvent;
+    }
+
+    /** Gets the last created instance of this wrapper, if available. */
+    @Nullable
+    public static InputMethodServiceWrapper getInstance() {
+        return sInstance.get();
+    }
+
+    /**
+     * Gets the string representation of the IME event that is being waited on.
+     *
+     * @param eventType the IME event type.
+     */
+    @NonNull
+    public static String eventToString(@Event int eventType) {
+        return switch (eventType) {
+            case EVENT_SHOW -> "onStartInputView";
+            case EVENT_HIDE -> "onFinishInputView";
+            case EVENT_CONFIG -> "onConfigurationChanged";
+            default -> "unknownEvent";
+        };
+    }
+
+    @NonNull
     private String dumpEditorInfo(EditorInfo info) {
         if (info == null) {
             return "null";
diff --git a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/testing/TestActivity.java b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/testing/TestActivity.java
index eadbac3..ad90b32 100644
--- a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/testing/TestActivity.java
+++ b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/testing/TestActivity.java
@@ -45,30 +45,13 @@
 public final class TestActivity extends Activity {
 
     private static final String TAG = "TestActivity";
-    private static WeakReference<TestActivity> sLastCreatedInstance = new WeakReference<>(null);
 
-    /**
-     * Start a new test activity with an editor and wait for it to begin running before returning.
-     *
-     * @param instrumentation application instrumentation
-     * @return the newly started activity
-     */
+    /** Last created instance of this activity. */
     @NonNull
-    public static TestActivity startSync(@NonNull Instrumentation instrumentation) {
-        final var intent = new Intent()
-                .setAction(Intent.ACTION_MAIN)
-                .setClass(instrumentation.getTargetContext(), TestActivity.class)
-                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
-                .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
-        return (TestActivity) instrumentation.startActivitySync(intent);
-    }
+    private static WeakReference<TestActivity> sInstance = new WeakReference<>(null);
 
     private EditText mEditText;
 
-    public EditText getEditText() {
-        return mEditText;
-    }
-
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -80,13 +63,11 @@
         rootView.setFitsSystemWindows(true);
         setContentView(rootView);
         mEditText.requestFocus();
-        sLastCreatedInstance = new WeakReference<>(this);
+        sInstance = new WeakReference<>(this);
     }
 
-    /** Get the last created TestActivity instance, if available. */
-    @Nullable
-    public static TestActivity getLastCreatedInstance() {
-        return sLastCreatedInstance.get();
+    public EditText getEditText() {
+        return mEditText;
     }
 
     /** Shows soft keyboard via InputMethodManager. */
@@ -118,4 +99,26 @@
         controller.hide(WindowInsets.Type.ime());
         Log.i(TAG, "hideIme() via WindowInsetsController");
     }
+
+    /** Gets the last created instance of this activity, if available. */
+    @Nullable
+    public static TestActivity getInstance() {
+        return sInstance.get();
+    }
+
+    /**
+     * Start a new test activity with an editor and wait for it to begin running before returning.
+     *
+     * @param instrumentation application instrumentation.
+     * @return the newly started activity.
+     */
+    @NonNull
+    public static TestActivity startSync(@NonNull Instrumentation instrumentation) {
+        final var intent = new Intent()
+                .setAction(Intent.ACTION_MAIN)
+                .setClass(instrumentation.getTargetContext(), TestActivity.class)
+                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+                .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+        return (TestActivity) instrumentation.startActivitySync(intent);
+    }
 }
diff --git a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageParserTest.java b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageParserTest.java
index f5c0de0..e1c65d2 100644
--- a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageParserTest.java
+++ b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageParserTest.java
@@ -65,10 +65,13 @@
 import android.os.Bundle;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
 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.platform.test.flag.junit.SetFlagsRule;
 import android.util.ArraySet;
 
 import androidx.annotation.Nullable;
@@ -150,6 +153,9 @@
     @Rule
     public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
 
+    @Rule
+    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
     private File mTmpDir;
     private static final File FRAMEWORK = new File("/system/framework/framework-res.apk");
     private static final String TEST_APP1_APK = "PackageParserTestApp1.apk";
@@ -846,7 +852,42 @@
 
     @Test
     @RequiresFlagsEnabled(android.content.res.Flags.FLAG_MANIFEST_FLAGGING)
-    public void testParseWithFeatureFlagAttributes() throws Exception {
+    @DisableFlags(android.content.res.Flags.FLAG_USE_NEW_ACONFIG_STORAGE)
+    public void testParseWithFeatureFlagAttributes_oldStorage() throws Exception {
+        final File testFile = extractFile(TEST_APP8_APK);
+        try (PackageParser2 parser = new TestPackageParser2()) {
+            Map<String, Boolean> flagValues = new HashMap<>();
+            flagValues.put("my.flag1", true);
+            flagValues.put("my.flag2", false);
+            flagValues.put("my.flag3", false);
+            flagValues.put("my.flag4", true);
+            ParsingPackageUtils.getAconfigFlags().addFlagValuesForTesting(flagValues);
+
+            // The manifest has:
+            //    <permission android:name="PERM1" android:featureFlag="my.flag1 " />
+            //    <permission android:name="PERM2" android:featureFlag=" !my.flag2" />
+            //    <permission android:name="PERM3" android:featureFlag="my.flag3" />
+            //    <permission android:name="PERM4" android:featureFlag="!my.flag4" />
+            //    <permission android:name="PERM5" android:featureFlag="unknown.flag" />
+            // Therefore with the above flag values, only PERM1 and PERM2 should be present.
+
+            final ParsedPackage pkg = parser.parsePackage(testFile, 0, false);
+            List<String> permissionNames =
+                    pkg.getPermissions().stream().map(ParsedComponent::getName).toList();
+            assertThat(permissionNames).contains(PACKAGE_NAME + ".PERM1");
+            assertThat(permissionNames).contains(PACKAGE_NAME + ".PERM2");
+            assertThat(permissionNames).doesNotContain(PACKAGE_NAME + ".PERM3");
+            assertThat(permissionNames).doesNotContain(PACKAGE_NAME + ".PERM4");
+            assertThat(permissionNames).doesNotContain(PACKAGE_NAME + ".PERM5");
+        } finally {
+            testFile.delete();
+        }
+    }
+
+    @Test
+    @RequiresFlagsEnabled(android.content.res.Flags.FLAG_MANIFEST_FLAGGING)
+    @EnableFlags(android.content.res.Flags.FLAG_USE_NEW_ACONFIG_STORAGE)
+    public void testParseWithFeatureFlagAttributes_newStorage() throws Exception {
         final File testFile = extractFile(TEST_APP8_APK);
         try (PackageParser2 parser = new TestPackageParser2()) {
             Map<String, Boolean> flagValues = new HashMap<>();
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 0029674..3858615 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceTest.java
@@ -23,10 +23,17 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.isNull;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+
 import android.graphics.Point;
 import android.graphics.Rect;
 import android.platform.test.annotations.Presubmit;
 import android.view.Display;
+import android.view.Surface;
 import android.view.SurfaceControl;
 
 import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -37,6 +44,7 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
+import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
 
 /**
@@ -154,6 +162,65 @@
         assertThat(displayDevice.getDisplaySurfaceDefaultSizeLocked()).isEqualTo(LANDSCAPE_SIZE);
     }
 
+    @Test
+    public void testSetDisplaySize_landscapeInstallRotation() {
+        DisplayDevice displayDevice = new FakeDisplayDevice(mDisplayDeviceInfo,
+                mMockDisplayAdapter);
+        mDisplayDeviceInfo.installOrientation = Surface.ROTATION_0;
+        mDisplayDeviceInfo.width = 100;
+        mDisplayDeviceInfo.height = 200;
+        displayDevice.configureDisplaySizeLocked(mMockTransaction);
+        verify(mMockTransaction).setDisplaySize(isNull(), eq(100), eq(200));
+
+        Mockito.clearInvocations(mMockTransaction);
+
+        mDisplayDeviceInfo.installOrientation = Surface.ROTATION_180;
+        mDisplayDeviceInfo.width = 300;
+        mDisplayDeviceInfo.height = 400;
+        displayDevice.configureDisplaySizeLocked(mMockTransaction);
+        verify(mMockTransaction).setDisplaySize(isNull(), eq(300), eq(400));
+    }
+
+    @Test
+    public void testSetDisplaySize_portraitInstallRotation() {
+        DisplayDevice displayDevice = new FakeDisplayDevice(mDisplayDeviceInfo,
+                mMockDisplayAdapter);
+        mDisplayDeviceInfo.installOrientation = Surface.ROTATION_90;
+        mDisplayDeviceInfo.width = 100;
+        mDisplayDeviceInfo.height = 200;
+        displayDevice.configureDisplaySizeLocked(mMockTransaction);
+        verify(mMockTransaction).setDisplaySize(isNull(), eq(200), eq(100));
+
+        Mockito.clearInvocations(mMockTransaction);
+
+        mDisplayDeviceInfo.installOrientation = Surface.ROTATION_270;
+        mDisplayDeviceInfo.width = 300;
+        mDisplayDeviceInfo.height = 400;
+        displayDevice.configureDisplaySizeLocked(mMockTransaction);
+        verify(mMockTransaction).setDisplaySize(isNull(), eq(400), eq(300));
+    }
+
+    @Test
+    public void testSetDisplaySize_invokedOnlyAfterResize() {
+        DisplayDevice displayDevice = new FakeDisplayDevice(mDisplayDeviceInfo,
+                mMockDisplayAdapter);
+        mDisplayDeviceInfo.installOrientation = Surface.ROTATION_90;
+        mDisplayDeviceInfo.width = 100;
+        mDisplayDeviceInfo.height = 200;
+        displayDevice.configureDisplaySizeLocked(mMockTransaction);
+        verify(mMockTransaction).setDisplaySize(isNull(), eq(200), eq(100));
+
+        Mockito.clearInvocations(mMockTransaction);
+
+        displayDevice.configureDisplaySizeLocked(mMockTransaction);
+        verify(mMockTransaction, never()).setDisplaySize(isNull(), anyInt(), anyInt());
+
+        mDisplayDeviceInfo.width = 300;
+        mDisplayDeviceInfo.height = 400;
+        displayDevice.configureDisplaySizeLocked(mMockTransaction);
+        verify(mMockTransaction).setDisplaySize(isNull(), eq(400), eq(300));
+    }
+
     private static class FakeDisplayDevice extends DisplayDevice {
         private final DisplayDeviceInfo mDisplayDeviceInfo;
 
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 b9cea0c..f8b4113 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/LocalDisplayAdapterTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/LocalDisplayAdapterTest.java
@@ -550,10 +550,10 @@
 
         assertDisplayDpi(
                 mListener.addedDisplays.get(0).getDisplayDeviceInfoLocked(), PORT_A, 100, 100,
-                100);
+                136);
         assertDisplayDpi(
                 mListener.addedDisplays.get(1).getDisplayDeviceInfoLocked(), PORT_B, 100, 100,
-                100);
+                136);
     }
 
     private static class DisplayModeWrapper {
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 1a0ab25..37f8aba 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/LogicalDisplayTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/LogicalDisplayTest.java
@@ -159,7 +159,8 @@
         mDisplayDeviceInfo.type = Display.TYPE_INTERNAL;
         mLogicalDisplay = new LogicalDisplay(DISPLAY_ID, LAYER_STACK, mDisplayDevice,
                 /*isAnisotropyCorrectionEnabled=*/ true,
-                /*isAlwaysRotateDisplayDeviceEnabled=*/ true);
+                /*isAlwaysRotateDisplayDeviceEnabled=*/ true,
+                /*isSyncedResolutionSwitchEnabled=*/ 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
@@ -188,7 +189,8 @@
         mDisplayDeviceInfo.type = Display.TYPE_EXTERNAL;
         mLogicalDisplay = new LogicalDisplay(DISPLAY_ID, LAYER_STACK, mDisplayDevice,
                 /*isAnisotropyCorrectionEnabled=*/ true,
-                /*isAlwaysRotateDisplayDeviceEnabled=*/ true);
+                /*isAlwaysRotateDisplayDeviceEnabled=*/ true,
+                /*isSyncedResolutionSwitchEnabled=*/ 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
@@ -217,7 +219,8 @@
         mDisplayDeviceInfo.type = Display.TYPE_EXTERNAL;
         mLogicalDisplay = new LogicalDisplay(DISPLAY_ID, LAYER_STACK, mDisplayDevice,
                 /*isAnisotropyCorrectionEnabled=*/ true,
-                /*isAlwaysRotateDisplayDeviceEnabled=*/ true);
+                /*isAlwaysRotateDisplayDeviceEnabled=*/ true,
+                /*isSyncedResolutionSwitchEnabled=*/ true);
 
         DisplayInfo displayInfo = new DisplayInfo();
         displayInfo.logicalWidth = DISPLAY_WIDTH;
@@ -275,7 +278,8 @@
         mDisplayDeviceInfo.type = Display.TYPE_EXTERNAL;
         mLogicalDisplay = new LogicalDisplay(DISPLAY_ID, LAYER_STACK, mDisplayDevice,
                 /*isAnisotropyCorrectionEnabled=*/ true,
-                /*isAlwaysRotateDisplayDeviceEnabled=*/ true);
+                /*isAlwaysRotateDisplayDeviceEnabled=*/ true,
+                /*isSyncedResolutionSwitchEnabled=*/ true);
 
         DisplayInfo displayInfo = new DisplayInfo();
         displayInfo.logicalWidth = DISPLAY_WIDTH;
@@ -304,7 +308,8 @@
         mDisplayDeviceInfo.type = Display.TYPE_EXTERNAL;
         mLogicalDisplay = new LogicalDisplay(DISPLAY_ID, LAYER_STACK, mDisplayDevice,
                 /*isAnisotropyCorrectionEnabled=*/ true,
-                /*isAlwaysRotateDisplayDeviceEnabled=*/ true);
+                /*isAlwaysRotateDisplayDeviceEnabled=*/ true,
+                /*isSyncedResolutionSwitchEnabled=*/ 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
@@ -379,11 +384,24 @@
     }
 
     @Test
+    public void testSetDisplaySizeIsCalledDuringConfigureDisplayLocked() {
+        mLogicalDisplay = new LogicalDisplay(DISPLAY_ID, LAYER_STACK, mDisplayDevice,
+                /*isAnisotropyCorrectionEnabled=*/ true,
+                /*isAlwaysRotateDisplayDeviceEnabled=*/ true,
+                /*isSyncedResolutionSwitchEnabled=*/ true);
+        mLogicalDisplay.updateLocked(mDeviceRepo, mSyntheticModeManager);
+        SurfaceControl.Transaction t = mock(SurfaceControl.Transaction.class);
+        mLogicalDisplay.configureDisplayLocked(t, mDisplayDevice, false);
+        verify(mDisplayDevice).configureDisplaySizeLocked(eq(t));
+    }
+
+    @Test
     public void testGetDisplayPositionAlwaysRotateDisplayEnabled() {
         mDisplayDeviceInfo.type = Display.TYPE_EXTERNAL;
         mLogicalDisplay = new LogicalDisplay(DISPLAY_ID, LAYER_STACK, mDisplayDevice,
                 /*isAnisotropyCorrectionEnabled=*/ true,
-                /*isAlwaysRotateDisplayDeviceEnabled=*/ true);
+                /*isAlwaysRotateDisplayDeviceEnabled=*/ true,
+                /*isSyncedResolutionSwitchEnabled=*/ true);
         mLogicalDisplay.updateLocked(mDeviceRepo, mSyntheticModeManager);
         Point expectedPosition = new Point();
 
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueImplTest.java b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueImplTest.java
index 1e665c2..409706b 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueImplTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueImplTest.java
@@ -1550,6 +1550,118 @@
         verifyPendingRecords(queue, List.of(closeSystemDialogs1, closeSystemDialogs2));
     }
 
+    @SuppressWarnings("GuardedBy")
+    @Test
+    public void testDeliveryGroupPolicy_sameAction_multiplePolicies() {
+        // Create a PACKAGE_CHANGED broadcast corresponding to a change in the whole PACKAGE_GREEN
+        // package.
+        final Intent greenPackageChangedIntent = createPackageChangedIntent(
+                getUidForPackage(PACKAGE_GREEN), List.of(PACKAGE_GREEN));
+        // Create delivery group policy such that when there are multiple broadcasts within the
+        // delivery group identified by "com.example.green/10002", only the most recent one
+        // gets delivered and the rest get discarded.
+        final BroadcastOptions optionsMostRecentPolicyForPackageGreen =
+                BroadcastOptions.makeBasic();
+        optionsMostRecentPolicyForPackageGreen.setDeliveryGroupMatchingKey("package_changed",
+                PACKAGE_GREEN + "/" + getUidForPackage(PACKAGE_GREEN));
+        optionsMostRecentPolicyForPackageGreen.setDeliveryGroupPolicy(
+                BroadcastOptions.DELIVERY_GROUP_POLICY_MOST_RECENT);
+
+        // Create a PACKAGE_CHANGED broadcast corresponding to a change in the whole PACKAGE_RED
+        // package.
+        final Intent redPackageChangedIntent = createPackageChangedIntent(
+                getUidForPackage(PACKAGE_RED), List.of(PACKAGE_RED));
+        // Create delivery group policy such that when there are multiple broadcasts within the
+        // delivery group identified by "com.example.red/10001", only the most recent one
+        // gets delivered and the rest get discarded.
+        final BroadcastOptions optionsMostRecentPolicyForPackageRed =
+                BroadcastOptions.makeBasic();
+        optionsMostRecentPolicyForPackageRed.setDeliveryGroupMatchingKey("package_changed",
+                PACKAGE_RED + "/" + getUidForPackage(PACKAGE_RED));
+        optionsMostRecentPolicyForPackageRed.setDeliveryGroupPolicy(
+                BroadcastOptions.DELIVERY_GROUP_POLICY_MOST_RECENT);
+
+        // Create a PACKAGE_CHANGED broadcast corresponding to a change in some components of
+        // PACKAGE_GREEN package.
+        final Intent greenPackageComponentsChangedIntent1 = createPackageChangedIntent(
+                getUidForPackage(PACKAGE_GREEN),
+                List.of(PACKAGE_GREEN + ".comp1", PACKAGE_GREEN + ".comp2"));
+        final Intent greenPackageComponentsChangedIntent2 = createPackageChangedIntent(
+                getUidForPackage(PACKAGE_GREEN),
+                List.of(PACKAGE_GREEN + ".comp3"));
+        // Create delivery group policy such that when there are multiple broadcasts within the
+        // delivery group identified by "components-com.example.green/10002", merge the extras
+        // within these broadcasts such that only one broadcast is sent and the rest are
+        // discarded. Couple of things to note here:
+        // 1. We are intentionally using a different policy group
+        //    "components-com.example.green/10002" (as opposed to "com.example.green/10002" used
+        //    earlier), because this is corresponding to a change in some particular components,
+        //    rather than a change to the whole package and we want to keep these two types of
+        //    broadcasts independent.
+        // 2. We are using 'extrasMerger' to indicate how we want the extras to be merged. This
+        //    assumes that broadcasts belonging to the group 'components-com.example.green/10002'
+        //    will have the same values for all the extras, except for the one extra
+        //    'EXTRA_CHANGED_COMPONENT_NAME_LIST'. So, we explicitly specify how to merge this
+        //    extra by using 'STRATEGY_ARRAY_APPEND' strategy, which basically indicates that
+        //    the extra values which are arrays should be concatenated.
+        final BundleMerger extrasMerger = new BundleMerger();
+        extrasMerger.setMergeStrategy(Intent.EXTRA_CHANGED_COMPONENT_NAME_LIST,
+                BundleMerger.STRATEGY_ARRAY_APPEND);
+        final BroadcastOptions optionsMergedPolicyForPackageGreen = BroadcastOptions.makeBasic();
+        optionsMergedPolicyForPackageGreen.setDeliveryGroupMatchingKey("package_changed",
+                "components-" + PACKAGE_GREEN + "/" + getUidForPackage(PACKAGE_GREEN));
+        optionsMergedPolicyForPackageGreen.setDeliveryGroupPolicy(
+                BroadcastOptions.DELIVERY_GROUP_POLICY_MERGED);
+        optionsMergedPolicyForPackageGreen.setDeliveryGroupExtrasMerger(extrasMerger);
+
+        // Create a PACKAGE_CHANGED broadcast corresponding to a change in some components of
+        // PACKAGE_RED package.
+        final Intent redPackageComponentsChangedIntent = createPackageChangedIntent(
+                getUidForPackage(PACKAGE_RED),
+                List.of(PACKAGE_RED + ".comp1", PACKAGE_RED + ".comp2"));
+        // Create delivery group policy such that when there are multiple broadcasts within the
+        // delivery group identified by "components-com.example.red/10001", merge the extras
+        // within these broadcasts such that only one broadcast is sent and the rest are
+        // discarded.
+        final BroadcastOptions optionsMergedPolicyForPackageRed = BroadcastOptions.makeBasic();
+        optionsMergedPolicyForPackageGreen.setDeliveryGroupMatchingKey("package_changed",
+                "components-" + PACKAGE_RED + "/" + getUidForPackage(PACKAGE_RED));
+        optionsMergedPolicyForPackageRed.setDeliveryGroupPolicy(
+                BroadcastOptions.DELIVERY_GROUP_POLICY_MERGED);
+        optionsMergedPolicyForPackageRed.setDeliveryGroupExtrasMerger(extrasMerger);
+
+        mImpl.enqueueBroadcastLocked(makeBroadcastRecord(greenPackageChangedIntent,
+                optionsMostRecentPolicyForPackageGreen));
+        mImpl.enqueueBroadcastLocked(makeBroadcastRecord(redPackageChangedIntent,
+                optionsMostRecentPolicyForPackageRed));
+        mImpl.enqueueBroadcastLocked(makeBroadcastRecord(greenPackageComponentsChangedIntent1,
+                optionsMergedPolicyForPackageGreen));
+        mImpl.enqueueBroadcastLocked(makeBroadcastRecord(redPackageComponentsChangedIntent,
+                optionsMergedPolicyForPackageRed));
+        // Since this broadcast has DELIVERY_GROUP_MOST_RECENT policy set, the earlier
+        // greenPackageChangedIntent broadcast with the same policy will be discarded.
+        mImpl.enqueueBroadcastLocked(makeBroadcastRecord(greenPackageChangedIntent,
+                optionsMostRecentPolicyForPackageGreen));
+        // Since this broadcast has DELIVERY_GROUP_MERGED policy set, the earlier
+        // greenPackageComponentsChangedIntent1 broadcast with the same policy will be merged
+        // with this one and then will be discarded.
+        mImpl.enqueueBroadcastLocked(makeBroadcastRecord(greenPackageComponentsChangedIntent2,
+                optionsMergedPolicyForPackageGreen));
+
+        final BroadcastProcessQueue queue = mImpl.getProcessQueue(PACKAGE_GREEN,
+                getUidForPackage(PACKAGE_GREEN));
+        // The extra EXTRA_CHANGED_COMPONENT_NAME_LIST values from
+        // greenPackageComponentsChangedIntent1 and
+        // greenPackageComponentsChangedIntent2 broadcasts would be merged, since
+        // STRATEGY_ARRAY_APPEND was used for this extra.
+        final Intent expectedGreenPackageComponentsChangedIntent = createPackageChangedIntent(
+                getUidForPackage(PACKAGE_GREEN), List.of(PACKAGE_GREEN + ".comp3",
+                        PACKAGE_GREEN + ".comp1", PACKAGE_GREEN + ".comp2"));
+        verifyPendingRecords(queue, List.of(redPackageChangedIntent,
+                redPackageComponentsChangedIntent, greenPackageChangedIntent,
+                expectedGreenPackageComponentsChangedIntent));
+    }
+
     private Pair<Intent, BroadcastOptions> createDropboxBroadcast(String tag, long timestampMs,
             int droppedCount) {
         final Intent dropboxEntryAdded = new Intent(DropBoxManager.ACTION_DROPBOX_ENTRY_ADDED);
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 2cd105b..67b26c1 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
@@ -60,6 +60,8 @@
 import android.content.pm.PackageManagerInternal;
 import android.net.Uri;
 import android.os.SystemClock;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
 import android.provider.MediaStore;
 import android.util.SparseIntArray;
 
@@ -71,6 +73,7 @@
 
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -92,6 +95,9 @@
     private static final Uri IMAGES_MEDIA_URI = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
     private static final Uri VIDEO_MEDIA_URI = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
 
+    @Rule
+    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
     @Mock
     private JobSchedulerInternal mJobSchedulerInternal;
     private MockitoSession mMockingSession;
@@ -1373,6 +1379,86 @@
         assertEquals("@TestNamespace@TestTag:foo", jobStatus.getBatteryName());
     }
 
+    @Test
+    @EnableFlags({
+        com.android.server.job.Flags.FLAG_INCLUDE_TRACE_TAG_IN_JOB_NAME,
+        android.app.job.Flags.FLAG_JOB_DEBUG_INFO_APIS
+    })
+    public void testJobName_NotTagNoNamespace_IncludeTraceTagInJobNameEnabled() {
+        JobInfo jobInfo = new JobInfo.Builder(101, new ComponentName("foo", "bar"))
+                        .setTraceTag("TestTraceTag")
+                        .build();
+        JobStatus jobStatus = createJobStatus(jobInfo, null, -1, null, null);
+        assertEquals("#TestTraceTag#foo/bar", jobStatus.getBatteryName());
+    }
+
+    @Test
+    @EnableFlags({
+        com.android.server.job.Flags.FLAG_INCLUDE_TRACE_TAG_IN_JOB_NAME,
+        android.app.job.Flags.FLAG_JOB_DEBUG_INFO_APIS
+    })
+    public void testJobName_NoTagWithNamespace_IncludeTraceTagInJobNameEnabled() {
+        JobInfo jobInfo = new JobInfo.Builder(101, new ComponentName("foo", "bar"))
+                        .setTraceTag("TestTraceTag")
+                        .build();
+        JobStatus jobStatus = createJobStatus(jobInfo, null, -1, "TestNamespace", null);
+        assertEquals("#TestTraceTag#@TestNamespace@foo/bar", jobStatus.getBatteryName());
+    }
+
+    @Test
+    @EnableFlags({
+        com.android.server.job.Flags.FLAG_INCLUDE_TRACE_TAG_IN_JOB_NAME,
+        android.app.job.Flags.FLAG_JOB_DEBUG_INFO_APIS
+    })
+    public void testJobName_WithTagNoNamespace_IncludeTraceTagInJobNameEnabled() {
+        JobInfo jobInfo = new JobInfo.Builder(101, new ComponentName("foo", "bar"))
+                        .setTraceTag("TestTraceTag")
+                        .build();
+        JobStatus jobStatus = createJobStatus(jobInfo, SOURCE_PACKAGE, 0, null, "TestTag");
+        assertEquals("#TestTraceTag#TestTag:foo", jobStatus.getBatteryName());
+    }
+
+    @Test
+    @EnableFlags({
+        com.android.server.job.Flags.FLAG_INCLUDE_TRACE_TAG_IN_JOB_NAME,
+        android.app.job.Flags.FLAG_JOB_DEBUG_INFO_APIS
+    })
+    public void testJobName_FilteredTraceTagEmail_IncludeTraceTagInJobNameEnabled() {
+        JobInfo jobInfo = new JobInfo.Builder(101, new ComponentName("foo", "bar"))
+                        .setTraceTag("test@email.com")
+                        .build();
+        JobStatus jobStatus = createJobStatus(jobInfo, SOURCE_PACKAGE, 0, null, "TestTag");
+        assertEquals("#[EMAIL]#TestTag:foo", jobStatus.getBatteryName());
+    }
+
+    @Test
+    @EnableFlags({
+        com.android.server.job.Flags.FLAG_INCLUDE_TRACE_TAG_IN_JOB_NAME,
+        android.app.job.Flags.FLAG_JOB_DEBUG_INFO_APIS
+    })
+    public void testJobName_FilteredTraceTagPhone_IncludeTraceTagInJobNameEnabled() {
+        JobInfo jobInfo = new JobInfo.Builder(101, new ComponentName("foo", "bar"))
+                        .setTraceTag("123-456-7890")
+                        .build();
+        JobStatus jobStatus = createJobStatus(jobInfo, SOURCE_PACKAGE, 0, null, "TestTag");
+        assertEquals("#[PHONE]#TestTag:foo", jobStatus.getBatteryName());
+    }
+
+    @Test
+    @EnableFlags({
+        com.android.server.job.Flags.FLAG_INCLUDE_TRACE_TAG_IN_JOB_NAME,
+        android.app.job.Flags.FLAG_JOB_DEBUG_INFO_APIS
+    })
+    public void testJobName_WithTagAndNamespace_IncludeTraceTagInJobNameEnabled() {
+        JobInfo jobInfo =
+                new JobInfo.Builder(101, new ComponentName("foo", "bar"))
+                        .setTraceTag("TestTraceTag")
+                        .build();
+        JobStatus jobStatus =
+                createJobStatus(jobInfo, SOURCE_PACKAGE, 0, "TestNamespace", "TestTag");
+        assertEquals("#TestTraceTag#@TestNamespace@TestTag:foo", jobStatus.getBatteryName());
+    }
+
     private void markExpeditedQuotaApproved(JobStatus job, boolean isApproved) {
         if (job.isRequestedExpeditedJob()) {
             job.setExpeditedJobQuotaApproved(sElapsedRealtimeClock.millis(), isApproved);
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 f79cb11..360d6eb 100644
--- a/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java
@@ -19,6 +19,11 @@
 import static android.content.pm.PackageManager.FEATURE_EMBEDDED;
 import static android.content.pm.PackageManager.FEATURE_LEANBACK;
 import static android.content.pm.PackageManager.FEATURE_WATCH;
+import static android.multiuser.Flags.FLAG_BLOCK_PRIVATE_SPACE_CREATION;
+import static android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES;
+import static android.multiuser.Flags.FLAG_LOGOUT_USER_API;
+import static android.multiuser.Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE;
+import static android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE;
 import static android.os.UserManager.DISALLOW_OUTGOING_CALLS;
 import static android.os.UserManager.DISALLOW_SMS;
 import static android.os.UserManager.DISALLOW_USER_SWITCH;
@@ -54,7 +59,6 @@
 import android.content.pm.PackageManagerInternal;
 import android.content.pm.UserInfo;
 import android.content.res.Resources;
-import android.multiuser.Flags;
 import android.os.PowerManager;
 import android.os.ServiceSpecificException;
 import android.os.SystemProperties;
@@ -401,15 +405,27 @@
     }
 
     @Test
-    public void testGetBootUser_Headless_ThrowsIfOnlySystemUserExists() throws Exception {
+    public void testGetBootUser_CannotSwitchToHeadlessSystemUser_ThrowsIfOnlySystemUserExists()
+            throws Exception {
         setSystemUserHeadless(true);
         removeNonSystemUsers();
+        mockCanSwitchToHeadlessSystemUser(false);
 
         assertThrows(UserManager.CheckedUserOperationException.class,
                 () -> mUmi.getBootUser(/* waitUntilSet= */ false));
     }
 
     @Test
+    public void testGetBootUser_CanSwitchToHeadlessSystemUser_NoThrowIfOnlySystemUserExists()
+            throws Exception {
+        setSystemUserHeadless(true);
+        removeNonSystemUsers();
+        mockCanSwitchToHeadlessSystemUser(true);
+
+        assertThat(mUmi.getBootUser(/* waitUntilSet= */ false)).isEqualTo(UserHandle.USER_SYSTEM);
+    }
+
+    @Test
     public void testGetPreviousFullUserToEnterForeground() throws Exception {
         addUser(USER_ID);
         setLastForegroundTime(USER_ID, 1_000_000L);
@@ -601,9 +617,8 @@
     }
 
     @Test
+    @EnableFlags({FLAG_ALLOW_PRIVATE_PROFILE, FLAG_ENABLE_PRIVATE_SPACE_FEATURES})
     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);
@@ -622,10 +637,12 @@
     }
 
     @Test
+    @EnableFlags({
+        FLAG_ALLOW_PRIVATE_PROFILE,
+        FLAG_ENABLE_PRIVATE_SPACE_FEATURES,
+        FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE
+    })
     public void testAutoLockOnDeviceLockForPrivateProfile() {
-        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);
@@ -645,10 +662,12 @@
     }
 
     @Test
+    @EnableFlags({
+        FLAG_ALLOW_PRIVATE_PROFILE,
+        FLAG_ENABLE_PRIVATE_SPACE_FEATURES,
+        FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE
+    })
     public void testAutoLockOnDeviceLockForPrivateProfile_keyguardUnlocked() {
-        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 =
@@ -665,10 +684,9 @@
     }
 
     @Test
+    @EnableFlags({FLAG_ALLOW_PRIVATE_PROFILE, FLAG_ENABLE_PRIVATE_SPACE_FEATURES})
+    @DisableFlags(FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE)
     public void testAutoLockOnDeviceLockForPrivateProfile_flagDisabled() {
-        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);
@@ -687,10 +705,12 @@
     }
 
     @Test
+    @EnableFlags({
+        FLAG_ALLOW_PRIVATE_PROFILE,
+        FLAG_ENABLE_PRIVATE_SPACE_FEATURES,
+        FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE
+    })
     public void testAutoLockAfterInactityForPrivateProfile() {
-        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);
@@ -711,11 +731,12 @@
     }
 
     @Test
+    @EnableFlags({
+        FLAG_ALLOW_PRIVATE_PROFILE,
+        FLAG_ENABLE_PRIVATE_SPACE_FEATURES,
+        FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE
+    })
     public void testSetOrUpdateAutoLockPreference_noPrivateProfile() {
-        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);
-
         mUms.setOrUpdateAutoLockPreferenceForPrivateProfile(
                 Settings.Secure.PRIVATE_SPACE_AUTO_LOCK_AFTER_INACTIVITY);
 
@@ -726,10 +747,12 @@
     }
 
     @Test
+    @EnableFlags({
+        FLAG_ALLOW_PRIVATE_PROFILE,
+        FLAG_ENABLE_PRIVATE_SPACE_FEATURES,
+        FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE
+    })
     public void testSetOrUpdateAutoLockPreference() {
-        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,
@@ -780,10 +803,12 @@
     }
 
     @Test
+    @EnableFlags({
+        FLAG_ALLOW_PRIVATE_PROFILE,
+        FLAG_ENABLE_PRIVATE_SPACE_FEATURES,
+        android.multiuser.Flags.FLAG_ENABLE_HIDING_PROFILES
+    })
     public void testGetProfileIdsExcludingHidden() {
-        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",
@@ -794,8 +819,11 @@
     }
 
     @Test
-    @RequiresFlagsEnabled({android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
-            Flags.FLAG_BLOCK_PRIVATE_SPACE_CREATION, Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES})
+    @RequiresFlagsEnabled({
+        FLAG_ALLOW_PRIVATE_PROFILE,
+        FLAG_BLOCK_PRIVATE_SPACE_CREATION,
+        FLAG_ENABLE_PRIVATE_SPACE_FEATURES
+    })
     public void testCreatePrivateProfileOnHeadlessSystemUser_shouldAllowCreation() {
         UserManagerService mSpiedUms = spy(mUms);
         assumeTrue(mUms.isHeadlessSystemUserMode());
@@ -807,8 +835,11 @@
     }
 
     @Test
-    @RequiresFlagsEnabled({android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
-            Flags.FLAG_BLOCK_PRIVATE_SPACE_CREATION, Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES})
+    @RequiresFlagsEnabled({
+        FLAG_ALLOW_PRIVATE_PROFILE,
+        FLAG_BLOCK_PRIVATE_SPACE_CREATION,
+        FLAG_ENABLE_PRIVATE_SPACE_FEATURES
+    })
     public void testCreatePrivateProfileOnSecondaryUser_shouldNotAllowCreation() {
         assumeTrue(mUms.canAddMoreUsersOfType(USER_TYPE_FULL_SECONDARY));
         UserInfo user = mUms.createUserWithThrow(generateLongString(), USER_TYPE_FULL_SECONDARY, 0);
@@ -819,8 +850,11 @@
     }
 
     @Test
-    @RequiresFlagsEnabled({android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
-            Flags.FLAG_BLOCK_PRIVATE_SPACE_CREATION, Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES})
+    @RequiresFlagsEnabled({
+        FLAG_ALLOW_PRIVATE_PROFILE,
+        FLAG_BLOCK_PRIVATE_SPACE_CREATION,
+        FLAG_ENABLE_PRIVATE_SPACE_FEATURES
+    })
     public void testCreatePrivateProfileOnAutoDevices_shouldNotAllowCreation() {
         doReturn(true).when(mMockPms).hasSystemFeature(eq(FEATURE_AUTOMOTIVE), anyInt());
         int mainUser = mUms.getMainUserId();
@@ -831,8 +865,11 @@
     }
 
     @Test
-    @RequiresFlagsEnabled({android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
-            Flags.FLAG_BLOCK_PRIVATE_SPACE_CREATION, Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES})
+    @RequiresFlagsEnabled({
+        FLAG_ALLOW_PRIVATE_PROFILE,
+        FLAG_BLOCK_PRIVATE_SPACE_CREATION,
+        FLAG_ENABLE_PRIVATE_SPACE_FEATURES
+    })
     public void testCreatePrivateProfileOnTV_shouldNotAllowCreation() {
         doReturn(true).when(mMockPms).hasSystemFeature(eq(FEATURE_LEANBACK), anyInt());
         int mainUser = mUms.getMainUserId();
@@ -843,8 +880,11 @@
     }
 
     @Test
-    @RequiresFlagsEnabled({android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
-            Flags.FLAG_BLOCK_PRIVATE_SPACE_CREATION, Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES})
+    @RequiresFlagsEnabled({
+        FLAG_ALLOW_PRIVATE_PROFILE,
+        FLAG_BLOCK_PRIVATE_SPACE_CREATION,
+        FLAG_ENABLE_PRIVATE_SPACE_FEATURES
+    })
     public void testCreatePrivateProfileOnEmbedded_shouldNotAllowCreation() {
         doReturn(true).when(mMockPms).hasSystemFeature(eq(FEATURE_EMBEDDED), anyInt());
         int mainUser = mUms.getMainUserId();
@@ -855,8 +895,11 @@
     }
 
     @Test
-    @RequiresFlagsEnabled({android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
-            Flags.FLAG_BLOCK_PRIVATE_SPACE_CREATION, Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES})
+    @RequiresFlagsEnabled({
+        FLAG_ALLOW_PRIVATE_PROFILE,
+        FLAG_BLOCK_PRIVATE_SPACE_CREATION,
+        FLAG_ENABLE_PRIVATE_SPACE_FEATURES
+    })
     public void testCreatePrivateProfileOnWatch_shouldNotAllowCreation() {
         doReturn(true).when(mMockPms).hasSystemFeature(eq(FEATURE_WATCH), anyInt());
         int mainUser = mUms.getMainUserId();
@@ -910,7 +953,7 @@
     }
 
     @Test
-    @EnableFlags(android.multiuser.Flags.FLAG_LOGOUT_USER_API)
+    @EnableFlags(FLAG_LOGOUT_USER_API)
     public void testGetUserLogoutability_HsumAndInteractiveHeadlessSystem_UserCanLogout()
             throws Exception {
         setSystemUserHeadless(true);
@@ -926,7 +969,7 @@
     }
 
     @Test
-    @EnableFlags(android.multiuser.Flags.FLAG_LOGOUT_USER_API)
+    @EnableFlags(FLAG_LOGOUT_USER_API)
     public void testGetUserLogoutability_HsumAndNonInteractiveHeadlessSystem_UserCannotLogout()
             throws Exception {
         setSystemUserHeadless(true);
@@ -941,7 +984,7 @@
     }
 
     @Test
-    @EnableFlags(android.multiuser.Flags.FLAG_LOGOUT_USER_API)
+    @EnableFlags(FLAG_LOGOUT_USER_API)
     public void testGetUserLogoutability_Hsum_SystemUserCannotLogout() throws Exception {
         setSystemUserHeadless(true);
         mockCurrentUser(UserHandle.USER_SYSTEM);
@@ -950,7 +993,7 @@
     }
 
     @Test
-    @EnableFlags(android.multiuser.Flags.FLAG_LOGOUT_USER_API)
+    @EnableFlags(FLAG_LOGOUT_USER_API)
     public void testGetUserLogoutability_NonHsum_SystemUserCannotLogout() throws Exception {
         setSystemUserHeadless(false);
         mockCurrentUser(UserHandle.USER_SYSTEM);
@@ -960,7 +1003,7 @@
     }
 
     @Test
-    @EnableFlags(android.multiuser.Flags.FLAG_LOGOUT_USER_API)
+    @EnableFlags(FLAG_LOGOUT_USER_API)
     public void testGetUserLogoutability_CannotSwitch_CannotLogout() throws Exception {
         setSystemUserHeadless(true);
         addUser(USER_ID);
@@ -973,7 +1016,7 @@
     }
 
     @Test
-    @DisableFlags(android.multiuser.Flags.FLAG_LOGOUT_USER_API)
+    @DisableFlags(FLAG_LOGOUT_USER_API)
     public void testGetUserLogoutability_LogoutDisabled() throws Exception {
         assertThrows(UnsupportedOperationException.class, () -> mUms.getUserLogoutability(USER_ID));
     }
diff --git a/services/tests/powerservicetests/src/com/android/server/power/NotifierTest.java b/services/tests/powerservicetests/src/com/android/server/power/NotifierTest.java
index 83a390d..4e56422 100644
--- a/services/tests/powerservicetests/src/com/android/server/power/NotifierTest.java
+++ b/services/tests/powerservicetests/src/com/android/server/power/NotifierTest.java
@@ -437,6 +437,42 @@
     }
 
     @Test
+    public void testOnGroupChanged_perDisplayWakeByTouchEnabled() {
+        createNotifier();
+        // GIVEN per-display wake by touch is enabled and one display group has been defined with
+        // two displays
+        when(mPowerManagerFlags.isPerDisplayWakeByTouchEnabled()).thenReturn(true);
+        final int groupId = 121;
+        final int displayId1 = 1221;
+        final int displayId2 = 1222;
+        final int[] displays = new int[]{displayId1, displayId2};
+        when(mDisplayManagerInternal.getDisplayIds()).thenReturn(IntArray.wrap(displays));
+        when(mDisplayManagerInternal.getDisplayIdsForGroup(groupId)).thenReturn(displays);
+        SparseArray<int[]> displayIdsByGroupId = new SparseArray<>();
+        displayIdsByGroupId.put(groupId, displays);
+        when(mDisplayManagerInternal.getDisplayIdsByGroupsIds()).thenReturn(displayIdsByGroupId);
+        mNotifier.onGroupWakefulnessChangeStarted(
+                groupId, WAKEFULNESS_AWAKE, PowerManager.WAKE_REASON_TAP, /* eventTime= */ 1000);
+        final SparseBooleanArray expectedDisplayInteractivities = new SparseBooleanArray();
+        expectedDisplayInteractivities.put(displayId1, true);
+        expectedDisplayInteractivities.put(displayId2, true);
+        verify(mInputManagerInternal).setDisplayInteractivities(expectedDisplayInteractivities);
+
+        // WHEN display group is changed to only contain one display
+        SparseArray<int[]> newDisplayIdsByGroupId = new SparseArray<>();
+        newDisplayIdsByGroupId.put(groupId, new int[]{displayId1});
+        when(mDisplayManagerInternal.getDisplayIdsByGroupsIds()).thenReturn(newDisplayIdsByGroupId);
+        mNotifier.onGroupChanged();
+
+        // THEN native input manager is informed that the displays in the group have changed
+        final SparseBooleanArray expectedDisplayInteractivitiesAfterChange =
+            new SparseBooleanArray();
+        expectedDisplayInteractivitiesAfterChange.put(displayId1, true);
+        verify(mInputManagerInternal).setDisplayInteractivities(
+            expectedDisplayInteractivitiesAfterChange);
+    }
+
+    @Test
     public void testOnWakeLockReleased_FrameworkStatsLogged_NoChains() {
         when(mPowerManagerFlags.isMoveWscLoggingToNotifierEnabled()).thenReturn(true);
         createNotifier();
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 29a17e1..ff67965 100644
--- a/services/tests/powerservicetests/src/com/android/server/power/PowerManagerServiceTest.java
+++ b/services/tests/powerservicetests/src/com/android/server/power/PowerManagerServiceTest.java
@@ -2501,6 +2501,49 @@
     }
 
     @Test
+    public void testMultiDisplay_twoDisplays_onlyDefaultDisplayCanDream() {
+        final int nonDefaultDisplayGroupId = Display.DEFAULT_DISPLAY_GROUP + 1;
+        final int nonDefaultDisplay = Display.DEFAULT_DISPLAY + 1;
+        final AtomicReference<DisplayManagerInternal.DisplayGroupListener> listener =
+                new AtomicReference<>();
+        doAnswer((Answer<Void>) invocation -> {
+            listener.set(invocation.getArgument(0));
+            return null;
+        }).when(mDisplayManagerInternalMock).registerDisplayGroupListener(any());
+        final DisplayInfo info = new DisplayInfo();
+        info.displayGroupId = nonDefaultDisplayGroupId;
+        when(mDisplayManagerInternalMock.getDisplayInfo(nonDefaultDisplay)).thenReturn(info);
+        when(mBatteryManagerInternalMock.isPowered(anyInt())).thenReturn(true);
+        Settings.Secure.putInt(mContextSpy.getContentResolver(),
+                Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP, 1);
+        doAnswer(inv -> {
+            when(mDreamManagerInternalMock.isDreaming()).thenReturn(true);
+            return null;
+        }).when(mDreamManagerInternalMock).startDream(anyBoolean(), anyString());
+
+        setMinimumScreenOffTimeoutConfig(5);
+        createService();
+        startSystem();
+
+        listener.get().onDisplayGroupAdded(nonDefaultDisplayGroupId);
+
+        assertThat(mService.getWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP)).isEqualTo(
+                WAKEFULNESS_AWAKE);
+        assertThat(mService.getWakefulnessLocked(nonDefaultDisplayGroupId)).isEqualTo(
+                WAKEFULNESS_AWAKE);
+        assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+
+        advanceTime(15000);
+
+        // Only the default display group is dreaming.
+        assertThat(mService.getWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP)).isEqualTo(
+                WAKEFULNESS_DREAMING);
+        assertThat(mService.getWakefulnessLocked(nonDefaultDisplayGroupId)).isEqualTo(
+                WAKEFULNESS_DOZING);
+        assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_DREAMING);
+    }
+
+    @Test
     public void testMultiDisplay_addNewDisplay_becomeGloballyAwakeButDefaultRemainsDozing() {
         final int nonDefaultDisplayGroupId = Display.DEFAULT_DISPLAY_GROUP + 1;
         final int nonDefaultDisplay = Display.DEFAULT_DISPLAY + 1;
diff --git a/services/tests/security/intrusiondetection/src/com/android/server/security/intrusiondetection/IntrusionDetectionServiceTest.java b/services/tests/security/intrusiondetection/src/com/android/server/security/intrusiondetection/IntrusionDetectionServiceTest.java
index 298d27e..879aa48 100644
--- a/services/tests/security/intrusiondetection/src/com/android/server/security/intrusiondetection/IntrusionDetectionServiceTest.java
+++ b/services/tests/security/intrusiondetection/src/com/android/server/security/intrusiondetection/IntrusionDetectionServiceTest.java
@@ -17,7 +17,6 @@
 package com.android.server.security.intrusiondetection;
 
 import static android.Manifest.permission.BIND_INTRUSION_DETECTION_EVENT_TRANSPORT_SERVICE;
-import static android.Manifest.permission.INTERNET;
 import static android.Manifest.permission.MANAGE_INTRUSION_DETECTION_STATE;
 import static android.Manifest.permission.READ_INTRUSION_DETECTION_STATE;
 
@@ -28,7 +27,6 @@
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
@@ -37,8 +35,8 @@
 
 import android.annotation.SuppressLint;
 import android.app.admin.ConnectEvent;
+import android.app.admin.DevicePolicyManagerInternal;
 import android.app.admin.DnsEvent;
-import android.app.admin.SecurityLog;
 import android.app.admin.SecurityLog.SecurityEvent;
 import android.content.ComponentName;
 import android.content.Context;
@@ -53,37 +51,22 @@
 import android.security.intrusiondetection.IIntrusionDetectionServiceCommandCallback;
 import android.security.intrusiondetection.IIntrusionDetectionServiceStateCallback;
 import android.security.intrusiondetection.IntrusionDetectionEvent;
-import android.security.keystore.KeyGenParameterSpec;
-import android.security.keystore.KeyProperties;
 import android.util.Log;
 
 import androidx.test.core.app.ApplicationProvider;
 
 import com.android.bedstead.harrier.BedsteadJUnit4;
 import com.android.bedstead.multiuser.annotations.RequireRunOnSystemUser;
-import com.android.bedstead.nene.TestApis;
-import com.android.bedstead.nene.devicepolicy.DeviceOwner;
 import com.android.bedstead.permissions.CommonPermissions;
-import com.android.bedstead.permissions.PermissionContext;
 import com.android.bedstead.permissions.annotations.EnsureHasPermission;
 import com.android.coretests.apps.testapp.LocalIntrusionDetectionEventTransport;
 import com.android.server.ServiceThread;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
 
-import java.io.IOException;
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.security.GeneralSecurityException;
-import java.security.KeyPair;
-import java.security.KeyPairGenerator;
-import java.security.KeyStore;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
@@ -107,7 +90,6 @@
     private static final int ERROR_DATA_SOURCE_UNAVAILABLE =
             IIntrusionDetectionServiceCommandCallback.ErrorCode.DATA_SOURCE_UNAVAILABLE;
 
-    private static DeviceOwner sDeviceOwner;
 
     private Context mContext;
     private IntrusionDetectionEventTransportConnection mIntrusionDetectionEventTransportConnection;
@@ -124,6 +106,8 @@
         "com.android.coretests.apps.testapp";
     private static final String TEST_SERVICE = TEST_PKG + ".TestLoggingService";
 
+    DevicePolicyManagerInternal mDevicePolicyManagerInternal;
+
     @SuppressLint("VisibleForTests")
     @Before
     public void setUp() throws Exception {
@@ -189,6 +173,7 @@
     }
 
     @Test
+    @EnsureHasPermission(CommonPermissions.MANAGE_DEVICE_POLICY_AUDIT_LOGGING)
     public void testAddStateCallback_Disabled_TwoStateCallbacks() throws RemoteException {
         StateCallback scb1 = new StateCallback();
         assertEquals(STATE_UNKNOWN, scb1.mState);
@@ -204,7 +189,7 @@
     }
 
     @Test
-    @Ignore("Unit test does not run as system service UID")
+    @EnsureHasPermission(CommonPermissions.MANAGE_DEVICE_POLICY_AUDIT_LOGGING)
     public void testRemoveStateCallback() throws RemoteException {
         mIntrusionDetectionService.setState(STATE_DISABLED);
         StateCallback scb1 = new StateCallback();
@@ -220,15 +205,19 @@
         mIntrusionDetectionService.getBinderService().removeStateCallback(scb2);
 
         CommandCallback ccb = new CommandCallback();
+
+        // Enable will fail; caller does not run as system server.
+        doNothing().when(mDataAggregator).enable();
         mIntrusionDetectionService.getBinderService().enable(ccb);
+
         mTestLooper.dispatchAll();
         assertEquals(STATE_ENABLED, scb1.mState);
         assertEquals(STATE_DISABLED, scb2.mState);
         assertNull(ccb.mErrorCode);
     }
 
-    @Ignore("Unit test does not run as system service UID")
     @Test
+    @EnsureHasPermission(CommonPermissions.MANAGE_DEVICE_POLICY_AUDIT_LOGGING)
     public void testEnable_FromDisabled_TwoStateCallbacks() throws RemoteException {
         mIntrusionDetectionService.setState(STATE_DISABLED);
         StateCallback scb1 = new StateCallback();
@@ -243,6 +232,9 @@
 
         CommandCallback ccb = new CommandCallback();
         mIntrusionDetectionService.getBinderService().enable(ccb);
+
+        // Enable will fail; caller does not run as system server.
+        doNothing().when(mDataAggregator).enable();
         mTestLooper.dispatchAll();
 
         verify(mDataAggregator, times(1)).enable();
@@ -319,7 +311,7 @@
         assertNull(ccb.mErrorCode);
     }
 
-    @Ignore("Enable once the IntrusionDetectionEventTransportConnection is ready")
+    @EnsureHasPermission(CommonPermissions.MANAGE_DEVICE_POLICY_AUDIT_LOGGING)
     @Test
     public void testEnable_FromDisable_TwoStateCallbacks_TransportUnavailable()
             throws RemoteException {
@@ -390,146 +382,6 @@
     }
 
     @Test
-    @Ignore("Unit test does not run as system service UID")
-    @RequireRunOnSystemUser
-    @EnsureHasPermission(CommonPermissions.MANAGE_DEVICE_POLICY_AUDIT_LOGGING)
-    public void testDataAggregator_AddSecurityEvent() throws Exception {
-        mIntrusionDetectionService.setState(STATE_ENABLED);
-        ServiceThread mockThread = spy(ServiceThread.class);
-        mDataAggregator.setHandler(mLooperOfDataAggregator, mockThread);
-
-        // SecurityLogging generates a number of events and callbacks, so create a latch to wait for
-        // the given event.
-        String eventString = this.getClass().getName() + ".testSecurityEvent";
-
-        final CountDownLatch latch = new CountDownLatch(1);
-        // TODO: Replace this mock when the IntrusionDetectionEventTransportConnection is ready.
-        doAnswer(
-                    new Answer<Boolean>() {
-                        @Override
-                        public Boolean answer(InvocationOnMock input) {
-                            List<IntrusionDetectionEvent> receivedEvents =
-                                    (List<IntrusionDetectionEvent>) input.getArguments()[0];
-                            for (IntrusionDetectionEvent event : receivedEvents) {
-                                if (event.getType() == IntrusionDetectionEvent.SECURITY_EVENT) {
-                                    SecurityEvent securityEvent = event.getSecurityEvent();
-                                    Object[] eventData = (Object[]) securityEvent.getData();
-                                    if (securityEvent.getTag() == SecurityLog.TAG_KEY_GENERATED
-                                            && eventData[1].equals(eventString)) {
-                                        latch.countDown();
-                                    }
-                                }
-                            }
-                            return true;
-                        }
-                    })
-            .when(mIntrusionDetectionEventTransportConnection).addData(any());
-        mDataAggregator.enable();
-
-        // Generate the security event.
-        generateSecurityEvent(eventString);
-        TestApis.devicePolicy().forceSecurityLogs();
-
-        // Verify the event is received.
-        mTestLooper.startAutoDispatch();
-        assertTrue(latch.await(1, TimeUnit.SECONDS));
-        mTestLooper.stopAutoDispatch();
-
-        mDataAggregator.disable();
-    }
-
-    @Test
-    @RequireRunOnSystemUser
-    @Ignore("Unit test does not run as system service UID")
-    @EnsureHasPermission(CommonPermissions.MANAGE_DEVICE_POLICY_AUDIT_LOGGING)
-    public void testDataAggregator_AddNetworkEvent() throws Exception {
-        mIntrusionDetectionService.setState(STATE_ENABLED);
-        ServiceThread mockThread = spy(ServiceThread.class);
-        mDataAggregator.setHandler(mLooperOfDataAggregator, mockThread);
-
-        // Network logging may log multiple and callbacks, so create a latch to wait for
-        // the given event.
-        // eventServer must be a valid domain to generate a network log event.
-        String eventServer = "google.com";
-        final CountDownLatch latch = new CountDownLatch(1);
-        // TODO: Replace this mock when the IntrusionDetectionEventTransportConnection is ready.
-        doAnswer(
-                    new Answer<Boolean>() {
-                        @Override
-                        public Boolean answer(InvocationOnMock input) {
-                            List<IntrusionDetectionEvent> receivedEvents =
-                                    (List<IntrusionDetectionEvent>) input.getArguments()[0];
-                            for (IntrusionDetectionEvent event : receivedEvents) {
-                                if (event.getType()
-                                        == IntrusionDetectionEvent.NETWORK_EVENT_DNS) {
-                                    DnsEvent dnsEvent = event.getDnsEvent();
-                                    if (dnsEvent.getHostname().equals(eventServer)) {
-                                        latch.countDown();
-                                    }
-                                }
-                            }
-                            return true;
-                        }
-                    })
-            .when(mIntrusionDetectionEventTransportConnection).addData(any());
-        mDataAggregator.enable();
-
-        // Generate the network event.
-        generateNetworkEvent(eventServer);
-        TestApis.devicePolicy().forceNetworkLogs();
-
-        // Verify the event is received.
-        mTestLooper.startAutoDispatch();
-        assertTrue(latch.await(1, TimeUnit.SECONDS));
-        mTestLooper.stopAutoDispatch();
-
-        mDataAggregator.disable();
-    }
-
-    /** Emits a given string into security log (if enabled). */
-    private void generateSecurityEvent(String eventString)
-            throws IllegalArgumentException, GeneralSecurityException, IOException {
-        if (eventString == null || eventString.isEmpty()) {
-            throw new IllegalArgumentException(
-                    "Error generating security event: eventString must not be empty");
-        }
-
-        final KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
-        keyGen.initialize(
-                new KeyGenParameterSpec.Builder(eventString, KeyProperties.PURPOSE_SIGN).build());
-        // Emit key generation event.
-        final KeyPair keyPair = keyGen.generateKeyPair();
-        assertNotNull(keyPair);
-
-        final KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
-        ks.load(null);
-        // Emit key destruction event.
-        ks.deleteEntry(eventString);
-    }
-
-    /** Emits a given string into network log (if enabled). */
-    private void generateNetworkEvent(String server) throws IllegalArgumentException, IOException {
-        if (server == null || server.isEmpty()) {
-            throw new IllegalArgumentException(
-                    "Error generating network event: server must not be empty");
-        }
-
-        HttpURLConnection urlConnection = null;
-        int connectionTimeoutMS = 2_000;
-        try (PermissionContext p = TestApis.permissions().withPermission(INTERNET)) {
-            final URL url = new URL("http://" + server);
-            urlConnection = (HttpURLConnection) url.openConnection();
-            urlConnection.setConnectTimeout(connectionTimeoutMS);
-            urlConnection.setReadTimeout(connectionTimeoutMS);
-            urlConnection.getResponseCode();
-        } finally {
-            if (urlConnection != null) {
-                urlConnection.disconnect();
-            }
-        }
-    }
-
-    @Test
     @RequireRunOnSystemUser
     @EnsureHasPermission(
             android.Manifest.permission.BIND_INTRUSION_DETECTION_EVENT_TRANSPORT_SERVICE)
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/autoclick/AutoclickControllerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/autoclick/AutoclickControllerTest.java
index 0227ef1..7f60caa 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/autoclick/AutoclickControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/autoclick/AutoclickControllerTest.java
@@ -326,6 +326,80 @@
         assertThat(mController.mClickScheduler.getIsActiveForTesting()).isTrue();
     }
 
+    @Test
+    public void smallJitteryMovement_doesNotTriggerClick() {
+        // Initial hover move to set an anchor point.
+        MotionEvent initialHoverMove = MotionEvent.obtain(
+                /* downTime= */ 0,
+                /* eventTime= */ 100,
+                /* action= */ MotionEvent.ACTION_HOVER_MOVE,
+                /* x= */ 30f,
+                /* y= */ 40f,
+                /* metaState= */ 0);
+        initialHoverMove.setSource(InputDevice.SOURCE_MOUSE);
+        mController.onMotionEvent(initialHoverMove, initialHoverMove, /* policyFlags= */ 0);
+
+        // Get the initial scheduled click time.
+        long initialScheduledTime = mController.mClickScheduler.getScheduledClickTimeForTesting();
+
+        // Simulate small, jittery movements (all within the default slop).
+        MotionEvent jitteryMove1 = MotionEvent.obtain(
+                /* downTime= */ 0,
+                /* eventTime= */ 150,
+                /* action= */ MotionEvent.ACTION_HOVER_MOVE,
+                /* x= */ 31f,  // Small change in x
+                /* y= */ 41f,  // Small change in y
+                /* metaState= */ 0);
+        jitteryMove1.setSource(InputDevice.SOURCE_MOUSE);
+        mController.onMotionEvent(jitteryMove1, jitteryMove1, /* policyFlags= */ 0);
+
+        MotionEvent jitteryMove2 = MotionEvent.obtain(
+                /* downTime= */ 0,
+                /* eventTime= */ 200,
+                /* action= */ MotionEvent.ACTION_HOVER_MOVE,
+                /* x= */ 30.5f, // Small change in x
+                /* y= */ 39.8f, // Small change in y
+                /* metaState= */ 0);
+        jitteryMove2.setSource(InputDevice.SOURCE_MOUSE);
+        mController.onMotionEvent(jitteryMove2, jitteryMove2, /* policyFlags= */ 0);
+
+        // Verify that the scheduled click time has NOT changed.
+        assertThat(mController.mClickScheduler.getScheduledClickTimeForTesting())
+                .isEqualTo(initialScheduledTime);
+    }
+
+    @Test
+    public void singleSignificantMovement_triggersClick() {
+        // Initial hover move to set an anchor point.
+        MotionEvent initialHoverMove = MotionEvent.obtain(
+                /* downTime= */ 0,
+                /* eventTime= */ 100,
+                /* action= */ MotionEvent.ACTION_HOVER_MOVE,
+                /* x= */ 30f,
+                /* y= */ 40f,
+                /* metaState= */ 0);
+        initialHoverMove.setSource(InputDevice.SOURCE_MOUSE);
+        mController.onMotionEvent(initialHoverMove, initialHoverMove, /* policyFlags= */ 0);
+
+        // Get the initial scheduled click time.
+        long initialScheduledTime = mController.mClickScheduler.getScheduledClickTimeForTesting();
+
+        // Simulate a single, significant movement (greater than the default slop).
+        MotionEvent significantMove = MotionEvent.obtain(
+                /* downTime= */ 0,
+                /* eventTime= */ 150,
+                /* action= */ MotionEvent.ACTION_HOVER_MOVE,
+                /* x= */ 60f,  // Significant change in x (30f difference)
+                /* y= */ 70f,  // Significant change in y (30f difference)
+                /* metaState= */ 0);
+        significantMove.setSource(InputDevice.SOURCE_MOUSE);
+        mController.onMotionEvent(significantMove, significantMove, /* policyFlags= */ 0);
+
+        // Verify that the scheduled click time has changed (click was rescheduled).
+        assertThat(mController.mClickScheduler.getScheduledClickTimeForTesting())
+                .isNotEqualTo(initialScheduledTime);
+    }
+
     private void injectFakeMouseActionHoverMoveEvent() {
         MotionEvent event = getFakeMotionHoverMoveEvent();
         event.setSource(InputDevice.SOURCE_MOUSE);
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/autoclick/AutoclickTypePanelTest.java b/services/tests/servicestests/src/com/android/server/accessibility/autoclick/AutoclickTypePanelTest.java
index 7b8824c..00cc726 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/autoclick/AutoclickTypePanelTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/autoclick/AutoclickTypePanelTest.java
@@ -18,6 +18,11 @@
 
 import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
 
+import static com.android.server.accessibility.autoclick.AutoclickTypePanel.AUTOCLICK_TYPE_LEFT_CLICK;
+import static com.android.server.accessibility.autoclick.AutoclickTypePanel.AUTOCLICK_TYPE_SCROLL;
+import static com.android.server.accessibility.autoclick.AutoclickTypePanel.AutoclickType;
+import static com.android.server.accessibility.autoclick.AutoclickTypePanel.ClickPanelControllerInterface;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import android.content.Context;
@@ -59,11 +64,25 @@
     private LinearLayout mDragButton;
     private LinearLayout mScrollButton;
 
+    private @AutoclickType int mActiveClickType = AUTOCLICK_TYPE_LEFT_CLICK;
+
+    private final ClickPanelControllerInterface clickPanelController =
+            new ClickPanelControllerInterface() {
+                @Override
+                public void handleAutoclickTypeChange(@AutoclickType int clickType) {
+                    mActiveClickType = clickType;
+                }
+
+                @Override
+                public void toggleAutoclickPause() {}
+            };
+
     @Before
     public void setUp() {
         mTestableContext.addMockSystemService(Context.WINDOW_SERVICE, mMockWindowManager);
 
-        mAutoclickTypePanel = new AutoclickTypePanel(mTestableContext, mMockWindowManager);
+        mAutoclickTypePanel =
+                new AutoclickTypePanel(mTestableContext, mMockWindowManager, clickPanelController);
         View contentView = mAutoclickTypePanel.getContentViewForTesting();
         mLeftClickButton = contentView.findViewById(R.id.accessibility_autoclick_left_click_layout);
         mRightClickButton =
@@ -136,6 +155,17 @@
         verifyButtonHasSelectedStyle(mScrollButton);
     }
 
+    @Test
+    public void togglePanelExpansion_selectButton_correctActiveClickType() {
+        // By first click, the panel is expanded.
+        mLeftClickButton.callOnClick();
+
+        // Clicks any button in the expanded state to select a type button.
+        mScrollButton.callOnClick();
+
+        assertThat(mActiveClickType).isEqualTo(AUTOCLICK_TYPE_SCROLL);
+    }
+
     private void verifyButtonHasSelectedStyle(@NonNull LinearLayout button) {
         GradientDrawable gradientDrawable = (GradientDrawable) button.getBackground();
         assertThat(gradientDrawable.getColor().getDefaultColor())
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 06958b8..1627f68 100644
--- a/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java
@@ -25,6 +25,7 @@
 import static android.app.ActivityManagerInternal.ALLOW_NON_FULL;
 import static android.app.ActivityManagerInternal.ALLOW_NON_FULL_IN_PROFILE;
 import static android.app.ActivityManagerInternal.ALLOW_PROFILES_OR_NON_FULL;
+import static android.app.KeyguardManager.LOCK_ON_USER_SWITCH_CALLBACK;
 import static android.content.pm.PackageManager.PERMISSION_GRANTED;
 import static android.testing.DexmakerShareClassLoaderRule.runWithDexmakerShareClassLoader;
 
@@ -115,7 +116,6 @@
 import com.android.server.pm.UserManagerService;
 import com.android.server.pm.UserTypeDetails;
 import com.android.server.pm.UserTypeFactory;
-import com.android.server.wm.ActivityTaskManagerInternal;
 import com.android.server.wm.WindowManagerService;
 
 import com.google.common.collect.Range;
@@ -1563,11 +1563,11 @@
         // and the thread is still alive
         assertTrue(threadStartUser.isAlive());
 
-        // mock send the keyguard shown event
-        ArgumentCaptor<ActivityTaskManagerInternal.ScreenObserver> captor = ArgumentCaptor.forClass(
-                ActivityTaskManagerInternal.ScreenObserver.class);
-        verify(mInjector.mActivityTaskManagerInternal).registerScreenObserver(captor.capture());
-        captor.getValue().onKeyguardStateChanged(true);
+        // mock the binder response for the user switch completion
+        ArgumentCaptor<Bundle> captor = ArgumentCaptor.forClass(Bundle.class);
+        verify(mInjector.mWindowManagerMock).lockNow(captor.capture());
+        IRemoteCallback.Stub.asInterface(captor.getValue().getBinder(
+                LOCK_ON_USER_SWITCH_CALLBACK)).sendResult(null);
 
         // verify the switch now moves on...
         Thread.sleep(1000);
@@ -1757,7 +1757,6 @@
         private final IStorageManager mStorageManagerMock;
         private final UserManagerInternal mUserManagerInternalMock;
         private final WindowManagerService mWindowManagerMock;
-        private final ActivityTaskManagerInternal mActivityTaskManagerInternal;
         private final PowerManagerInternal mPowerManagerInternal;
         private final AlarmManagerInternal mAlarmManagerInternal;
         private final KeyguardManager mKeyguardManagerMock;
@@ -1779,7 +1778,6 @@
             mUserManagerMock = mock(UserManagerService.class);
             mUserManagerInternalMock = mock(UserManagerInternal.class);
             mWindowManagerMock = mock(WindowManagerService.class);
-            mActivityTaskManagerInternal = mock(ActivityTaskManagerInternal.class);
             mStorageManagerMock = mock(IStorageManager.class);
             mPowerManagerInternal = mock(PowerManagerInternal.class);
             mAlarmManagerInternal = mock(AlarmManagerInternal.class);
@@ -1843,11 +1841,6 @@
         }
 
         @Override
-        ActivityTaskManagerInternal getActivityTaskManagerInternal() {
-            return mActivityTaskManagerInternal;
-        }
-
-        @Override
         PowerManagerInternal getPowerManagerInternal() {
             return mPowerManagerInternal;
         }
diff --git a/services/tests/servicestests/src/com/android/server/app/GameManagerServiceSettingsTests.java b/services/tests/servicestests/src/com/android/server/app/GameManagerServiceSettingsTests.java
index 17f5ebb..7349c5f4 100644
--- a/services/tests/servicestests/src/com/android/server/app/GameManagerServiceSettingsTests.java
+++ b/services/tests/servicestests/src/com/android/server/app/GameManagerServiceSettingsTests.java
@@ -116,6 +116,10 @@
         deleteFolder(InstrumentationRegistry.getTargetContext().getFilesDir());
     }
 
+    static {
+        System.loadLibrary("servicestestjni");
+    }
+
     @Test
     public void testReadGameServiceSettings() {
         writeOldFiles();
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
index 30aa8ce..e0023e5 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
@@ -1768,6 +1768,7 @@
     }
 
     @Test
+    @Ignore // b/396073342
     public void testCertificateDisclosure() throws Exception {
         final int userId = CALLER_USER_HANDLE;
         final UserHandle user = UserHandle.of(userId);
@@ -4612,6 +4613,7 @@
     }
 
     @Test
+    @Ignore // b/396073342
     public void testGetLastBugReportRequestTime() throws Exception {
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
         setupDeviceOwner();
@@ -4659,6 +4661,7 @@
     }
 
     @Test
+    @Ignore // b/396073342
     public void testGetLastNetworkLogRetrievalTime() throws Exception {
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
         setupDeviceOwner();
@@ -6441,6 +6444,7 @@
     }
 
     @Test
+    @Ignore // b/396073342
     public void testGetOwnerInstalledCaCertsForDeviceOwner() throws Exception {
         mServiceContext.packageName = mRealTestContext.getPackageName();
         mServiceContext.applicationInfo = new ApplicationInfo();
@@ -6452,6 +6456,7 @@
     }
 
     @Test
+    @Ignore // b/396073342
     public void testGetOwnerInstalledCaCertsForProfileOwner() throws Exception {
         mServiceContext.packageName = mRealTestContext.getPackageName();
         mServiceContext.applicationInfo = new ApplicationInfo();
@@ -6464,6 +6469,7 @@
     }
 
     @Test
+    @Ignore // b/396073342
     public void testGetOwnerInstalledCaCertsForDelegate() throws Exception {
         mServiceContext.packageName = mRealTestContext.getPackageName();
         mServiceContext.applicationInfo = new ApplicationInfo();
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 f74e2ac..563baac 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java
@@ -66,6 +66,7 @@
 import androidx.test.filters.SmallTest;
 
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -1033,6 +1034,7 @@
     }
 
     @Test
+    @Ignore("b/360768278")
     public void onHotplug_doNotSend_systemAudioModeRequestWithParameter(){
         // Add a device to the network and assert that this device is included in the list of
         // devices.
diff --git a/services/tests/servicestests/src/com/android/server/location/contexthub/ContextHubEndpointTest.java b/services/tests/servicestests/src/com/android/server/location/contexthub/ContextHubEndpointTest.java
index 04d0752..a4e77c0 100644
--- a/services/tests/servicestests/src/com/android/server/location/contexthub/ContextHubEndpointTest.java
+++ b/services/tests/servicestests/src/com/android/server/location/contexthub/ContextHubEndpointTest.java
@@ -20,10 +20,12 @@
 
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
+import android.hardware.contexthub.EndpointInfo;
 import android.hardware.contexthub.ErrorCode;
 import android.hardware.contexthub.HubEndpointInfo;
 import android.hardware.contexthub.HubEndpointInfo.HubEndpointIdentifier;
@@ -32,6 +34,7 @@
 import android.hardware.contexthub.IContextHubEndpointCallback;
 import android.hardware.contexthub.IEndpointCommunication;
 import android.hardware.contexthub.MessageDeliveryStatus;
+import android.hardware.contexthub.Reason;
 import android.os.Binder;
 import android.os.RemoteException;
 import android.platform.test.annotations.Presubmit;
@@ -61,6 +64,9 @@
     private static final int ENDPOINT_ID = 1;
     private static final String ENDPOINT_PACKAGE_NAME = "com.android.server.location.contexthub";
 
+    private static final String TARGET_ENDPOINT_NAME = "Example target endpoint";
+    private static final int TARGET_ENDPOINT_ID = 1;
+
     private ContextHubClientManager mClientManager;
     private ContextHubEndpointManager mEndpointManager;
     private HubInfoRegistry mHubInfoRegistry;
@@ -95,23 +101,8 @@
 
     @Test
     public void testRegisterEndpoint() throws RemoteException {
-        // Register an endpoint and confirm we can get a valid IContextHubEndoint reference
-        HubEndpointInfo info =
-                new HubEndpointInfo(
-                        ENDPOINT_NAME, ENDPOINT_ID, ENDPOINT_PACKAGE_NAME, Collections.emptyList());
-        IContextHubEndpoint endpoint =
-                mEndpointManager.registerEndpoint(
-                        info, mMockCallback, ENDPOINT_PACKAGE_NAME, /* attributionTag= */ null);
-        assertThat(mEndpointManager.getNumRegisteredClients()).isEqualTo(1);
-        assertThat(endpoint).isNotNull();
-        HubEndpointInfo assignedInfo = endpoint.getAssignedHubEndpointInfo();
-        assertThat(assignedInfo).isNotNull();
-        HubEndpointIdentifier assignedIdentifier = assignedInfo.getIdentifier();
-        assertThat(assignedIdentifier).isNotNull();
-
-        // Unregister the endpoint and confirm proper clean-up
-        mEndpointManager.unregisterEndpoint(assignedIdentifier.getEndpoint());
-        assertThat(mEndpointManager.getNumRegisteredClients()).isEqualTo(0);
+        IContextHubEndpoint endpoint = registerExampleEndpoint();
+        unregisterExampleEndpoint(endpoint);
     }
 
     @Test
@@ -146,4 +137,107 @@
         assertThat(statusCaptor.getValue().messageSequenceNumber).isEqualTo(sequenceNumber);
         assertThat(statusCaptor.getValue().errorCode).isEqualTo(ErrorCode.DESTINATION_NOT_FOUND);
     }
+
+    @Test
+    public void testHalRestart() throws RemoteException {
+        IContextHubEndpoint endpoint = registerExampleEndpoint();
+
+        // Verify that the endpoint is still registered after a HAL restart
+        HubEndpointInfo assignedInfo = endpoint.getAssignedHubEndpointInfo();
+        HubEndpointIdentifier assignedIdentifier = assignedInfo.getIdentifier();
+        mEndpointManager.onHalRestart();
+        ArgumentCaptor<EndpointInfo> statusCaptor = ArgumentCaptor.forClass(EndpointInfo.class);
+        verify(mMockEndpointCommunications, times(2)).registerEndpoint(statusCaptor.capture());
+        assertThat(statusCaptor.getValue().id.id).isEqualTo(assignedIdentifier.getEndpoint());
+        assertThat(statusCaptor.getValue().id.hubId).isEqualTo(assignedIdentifier.getHub());
+
+        unregisterExampleEndpoint(endpoint);
+    }
+
+    @Test
+    public void testHalRestartOnOpenSession() throws RemoteException {
+        assertThat(mEndpointManager.getNumAvailableSessions()).isEqualTo(SESSION_ID_RANGE);
+        IContextHubEndpoint endpoint = registerExampleEndpoint();
+
+        HubEndpointInfo targetInfo =
+                new HubEndpointInfo(
+                        TARGET_ENDPOINT_NAME,
+                        TARGET_ENDPOINT_ID,
+                        ENDPOINT_PACKAGE_NAME,
+                        Collections.emptyList());
+        int sessionId = endpoint.openSession(targetInfo, /* serviceDescriptor= */ null);
+        mEndpointManager.onEndpointSessionOpenComplete(sessionId);
+        assertThat(mEndpointManager.getNumAvailableSessions()).isEqualTo(SESSION_ID_RANGE - 1);
+
+        mEndpointManager.onHalRestart();
+
+        HubEndpointInfo assignedInfo = endpoint.getAssignedHubEndpointInfo();
+        HubEndpointIdentifier assignedIdentifier = assignedInfo.getIdentifier();
+        ArgumentCaptor<EndpointInfo> statusCaptor = ArgumentCaptor.forClass(EndpointInfo.class);
+        verify(mMockEndpointCommunications, times(2)).registerEndpoint(statusCaptor.capture());
+        assertThat(statusCaptor.getValue().id.id).isEqualTo(assignedIdentifier.getEndpoint());
+        assertThat(statusCaptor.getValue().id.hubId).isEqualTo(assignedIdentifier.getHub());
+
+        verify(mMockCallback)
+                .onSessionClosed(
+                        sessionId, ContextHubServiceUtil.toAppHubEndpointReason(Reason.HUB_RESET));
+
+        unregisterExampleEndpoint(endpoint);
+        assertThat(mEndpointManager.getNumAvailableSessions()).isEqualTo(SESSION_ID_RANGE);
+    }
+
+    @Test
+    public void testOpenSessionOnUnregistration() throws RemoteException {
+        assertThat(mEndpointManager.getNumAvailableSessions()).isEqualTo(SESSION_ID_RANGE);
+        IContextHubEndpoint endpoint = registerExampleEndpoint();
+
+        HubEndpointInfo targetInfo =
+                new HubEndpointInfo(
+                        TARGET_ENDPOINT_NAME,
+                        TARGET_ENDPOINT_ID,
+                        ENDPOINT_PACKAGE_NAME,
+                        Collections.emptyList());
+        int sessionId = endpoint.openSession(targetInfo, /* serviceDescriptor= */ null);
+        mEndpointManager.onEndpointSessionOpenComplete(sessionId);
+        assertThat(mEndpointManager.getNumAvailableSessions()).isEqualTo(SESSION_ID_RANGE - 1);
+
+        unregisterExampleEndpoint(endpoint);
+        verify(mMockEndpointCommunications).closeEndpointSession(sessionId, Reason.ENDPOINT_GONE);
+        assertThat(mEndpointManager.getNumAvailableSessions()).isEqualTo(SESSION_ID_RANGE);
+    }
+
+    private IContextHubEndpoint registerExampleEndpoint() throws RemoteException {
+        HubEndpointInfo info =
+                new HubEndpointInfo(
+                        ENDPOINT_NAME, ENDPOINT_ID, ENDPOINT_PACKAGE_NAME, Collections.emptyList());
+        IContextHubEndpoint endpoint =
+                mEndpointManager.registerEndpoint(
+                        info, mMockCallback, ENDPOINT_PACKAGE_NAME, /* attributionTag= */ null);
+        assertThat(endpoint).isNotNull();
+        HubEndpointInfo assignedInfo = endpoint.getAssignedHubEndpointInfo();
+        assertThat(assignedInfo).isNotNull();
+        HubEndpointIdentifier assignedIdentifier = assignedInfo.getIdentifier();
+        assertThat(assignedIdentifier).isNotNull();
+
+        // Confirm registerEndpoint was called with the right contents
+        ArgumentCaptor<EndpointInfo> statusCaptor = ArgumentCaptor.forClass(EndpointInfo.class);
+        verify(mMockEndpointCommunications).registerEndpoint(statusCaptor.capture());
+        assertThat(statusCaptor.getValue().id.id).isEqualTo(assignedIdentifier.getEndpoint());
+        assertThat(statusCaptor.getValue().id.hubId).isEqualTo(assignedIdentifier.getHub());
+        assertThat(mEndpointManager.getNumRegisteredClients()).isEqualTo(1);
+
+        return endpoint;
+    }
+
+    private void unregisterExampleEndpoint(IContextHubEndpoint endpoint) throws RemoteException {
+        HubEndpointInfo expectedInfo = endpoint.getAssignedHubEndpointInfo();
+        endpoint.unregister();
+        ArgumentCaptor<EndpointInfo> statusCaptor = ArgumentCaptor.forClass(EndpointInfo.class);
+        verify(mMockEndpointCommunications).unregisterEndpoint(statusCaptor.capture());
+        assertThat(statusCaptor.getValue().id.id)
+                .isEqualTo(expectedInfo.getIdentifier().getEndpoint());
+        assertThat(statusCaptor.getValue().id.hubId)
+                .isEqualTo(expectedInfo.getIdentifier().getHub());
+        assertThat(mEndpointManager.getNumRegisteredClients()).isEqualTo(0);
+    }
 }
diff --git a/services/tests/uiservicestests/Android.bp b/services/tests/uiservicestests/Android.bp
index 0eb20eb..66d7611 100644
--- a/services/tests/uiservicestests/Android.bp
+++ b/services/tests/uiservicestests/Android.bp
@@ -32,6 +32,7 @@
         "androidx.test.rules",
         "hamcrest-library",
         "mockito-target-inline-minus-junit4",
+        "mockito-target-extended",
         "platform-compat-test-rules",
         "platform-test-annotations",
         "platformprotosnano",
diff --git a/services/tests/uiservicestests/src/android/app/NotificationManagerZenTest.java b/services/tests/uiservicestests/src/android/app/NotificationManagerZenTest.java
index 779fa1a..dbbe40f 100644
--- a/services/tests/uiservicestests/src/android/app/NotificationManagerZenTest.java
+++ b/services/tests/uiservicestests/src/android/app/NotificationManagerZenTest.java
@@ -80,7 +80,7 @@
     }
 
     @Test
-    @RequiresFlagsEnabled({Flags.FLAG_MODES_API, Flags.FLAG_MODES_UI})
+    @RequiresFlagsEnabled(Flags.FLAG_MODES_UI)
     public void setAutomaticZenRuleState_manualActivation() {
         AutomaticZenRule ruleToCreate = createZenRule("rule");
         String ruleId = mNotificationManager.addAutomaticZenRule(ruleToCreate);
@@ -111,7 +111,7 @@
     }
 
     @Test
-    @RequiresFlagsEnabled({Flags.FLAG_MODES_API, Flags.FLAG_MODES_UI})
+    @RequiresFlagsEnabled(Flags.FLAG_MODES_UI)
     public void setAutomaticZenRuleState_manualDeactivation() {
         AutomaticZenRule ruleToCreate = createZenRule("rule");
         String ruleId = mNotificationManager.addAutomaticZenRule(ruleToCreate);
@@ -145,7 +145,7 @@
     }
 
     @Test
-    @RequiresFlagsEnabled({Flags.FLAG_MODES_API, Flags.FLAG_MODES_UI})
+    @RequiresFlagsEnabled(Flags.FLAG_MODES_UI)
     public void setAutomaticZenRuleState_respectsManuallyActivated() {
         AutomaticZenRule ruleToCreate = createZenRule("rule");
         String ruleId = mNotificationManager.addAutomaticZenRule(ruleToCreate);
@@ -178,7 +178,7 @@
     }
 
     @Test
-    @RequiresFlagsEnabled({Flags.FLAG_MODES_API, Flags.FLAG_MODES_UI})
+    @RequiresFlagsEnabled(Flags.FLAG_MODES_UI)
     public void setAutomaticZenRuleState_respectsManuallyDeactivated() {
         AutomaticZenRule ruleToCreate = createZenRule("rule");
         String ruleId = mNotificationManager.addAutomaticZenRule(ruleToCreate);
@@ -212,7 +212,7 @@
     }
 
     @Test
-    @RequiresFlagsEnabled({Flags.FLAG_MODES_API, Flags.FLAG_MODES_UI})
+    @RequiresFlagsEnabled(Flags.FLAG_MODES_UI)
     public void setAutomaticZenRuleState_manualActivationFromApp() {
         AutomaticZenRule ruleToCreate = createZenRule("rule");
         String ruleId = mNotificationManager.addAutomaticZenRule(ruleToCreate);
@@ -244,7 +244,7 @@
     }
 
     @Test
-    @RequiresFlagsEnabled({Flags.FLAG_MODES_API, Flags.FLAG_MODES_UI})
+    @RequiresFlagsEnabled(Flags.FLAG_MODES_UI)
     public void setAutomaticZenRuleState_manualDeactivationFromApp() {
         AutomaticZenRule ruleToCreate = createZenRule("rule");
         String ruleId = mNotificationManager.addAutomaticZenRule(ruleToCreate);
diff --git a/services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java
index c4b8599..9930c9f 100644
--- a/services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java
@@ -70,7 +70,6 @@
 import android.app.Activity;
 import android.app.ActivityManager;
 import android.app.AlarmManager;
-import android.app.Flags;
 import android.app.IOnProjectionStateChangedListener;
 import android.app.IUiModeManager;
 import android.content.BroadcastReceiver;
@@ -91,7 +90,6 @@
 import android.os.RemoteException;
 import android.os.UserHandle;
 import android.os.test.FakePermissionEnforcer;
-import android.platform.test.annotations.EnableFlags;
 import android.platform.test.flag.junit.SetFlagsRule;
 import android.provider.Settings;
 import android.service.dreams.DreamManagerInternal;
@@ -1508,13 +1506,11 @@
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_MODES_API)
     public void testAttentionModeThemeOverlay_nightModeDisabled() throws RemoteException {
         testAttentionModeThemeOverlay(false);
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_MODES_API)
     public void testAttentionModeThemeOverlay_nightModeEnabled() throws RemoteException {
         testAttentionModeThemeOverlay(true);
     }
diff --git a/services/tests/uiservicestests/src/com/android/server/UiServiceTestCase.java b/services/tests/uiservicestests/src/com/android/server/UiServiceTestCase.java
index b3ec215..c9d5241 100644
--- a/services/tests/uiservicestests/src/com/android/server/UiServiceTestCase.java
+++ b/services/tests/uiservicestests/src/com/android/server/UiServiceTestCase.java
@@ -30,6 +30,7 @@
 
 import androidx.test.InstrumentationRegistry;
 
+import com.android.server.pm.UserManagerInternal;
 import com.android.server.uri.UriGrantsManagerInternal;
 
 import org.junit.After;
@@ -41,6 +42,7 @@
 
 public class UiServiceTestCase {
     @Mock protected PackageManagerInternal mPmi;
+    @Mock protected UserManagerInternal mUmi;
     @Mock protected UriGrantsManagerInternal mUgmInternal;
 
     protected static final String PKG_N_MR1 = "com.example.n_mr1";
@@ -92,6 +94,8 @@
                     }
                 });
 
+        LocalServices.removeServiceForTest(UserManagerInternal.class);
+        LocalServices.addService(UserManagerInternal.class, mUmi);
         LocalServices.removeServiceForTest(UriGrantsManagerInternal.class);
         LocalServices.addService(UriGrantsManagerInternal.class, mUgmInternal);
         when(mUgmInternal.checkGrantUriPermission(
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/DefaultDeviceEffectsApplierTest.java b/services/tests/uiservicestests/src/com/android/server/notification/DefaultDeviceEffectsApplierTest.java
index 1890879..5ce9a3e 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/DefaultDeviceEffectsApplierTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/DefaultDeviceEffectsApplierTest.java
@@ -47,7 +47,6 @@
 import android.content.IntentFilter;
 import android.hardware.display.ColorDisplayManager;
 import android.os.PowerManager;
-import android.platform.test.annotations.EnableFlags;
 import android.platform.test.flag.junit.SetFlagsRule;
 import android.service.notification.ZenDeviceEffects;
 import android.testing.TestableContext;
@@ -102,8 +101,6 @@
 
     @Test
     public void apply_appliesEffects() {
-        mSetFlagsRule.enableFlags(android.app.Flags.FLAG_MODES_API);
-
         ZenDeviceEffects effects = new ZenDeviceEffects.Builder()
                 .setShouldSuppressAmbientDisplay(true)
                 .setShouldDimWallpaper(true)
@@ -119,7 +116,6 @@
     }
 
     @Test
-    @EnableFlags(android.app.Flags.FLAG_MODES_API)
     public void apply_logsToZenLog() {
         when(mPowerManager.isInteractive()).thenReturn(true);
         ArgumentCaptor<BroadcastReceiver> broadcastReceiverCaptor =
@@ -155,8 +151,6 @@
 
     @Test
     public void apply_removesEffects() {
-        mSetFlagsRule.enableFlags(android.app.Flags.FLAG_MODES_API);
-
         ZenDeviceEffects previousEffects = new ZenDeviceEffects.Builder()
                 .setShouldSuppressAmbientDisplay(true)
                 .setShouldDimWallpaper(true)
@@ -180,8 +174,6 @@
 
     @Test
     public void apply_removesOnlyPreviouslyAppliedEffects() {
-        mSetFlagsRule.enableFlags(android.app.Flags.FLAG_MODES_API);
-
         ZenDeviceEffects previousEffects = new ZenDeviceEffects.Builder()
                 .setShouldSuppressAmbientDisplay(true)
                 .build();
@@ -197,7 +189,6 @@
 
     @Test
     public void apply_missingSomeServices_okay() {
-        mSetFlagsRule.enableFlags(android.app.Flags.FLAG_MODES_API);
         mContext.addMockSystemService(ColorDisplayManager.class, null);
         mContext.addMockSystemService(WallpaperManager.class, null);
         mApplier = new DefaultDeviceEffectsApplier(mContext);
@@ -216,7 +207,6 @@
 
     @Test
     public void apply_disabledWallpaperService_dimWallpaperNotApplied() {
-        mSetFlagsRule.enableFlags(android.app.Flags.FLAG_MODES_API);
         WallpaperManager disabledWallpaperService = mock(WallpaperManager.class);
         when(mWallpaperManager.isWallpaperSupported()).thenReturn(false);
         mContext.addMockSystemService(WallpaperManager.class, disabledWallpaperService);
@@ -236,8 +226,6 @@
 
     @Test
     public void apply_someEffects_onlyThoseEffectsApplied() {
-        mSetFlagsRule.enableFlags(android.app.Flags.FLAG_MODES_API);
-
         ZenDeviceEffects effects = new ZenDeviceEffects.Builder()
                 .setShouldDimWallpaper(true)
                 .setShouldDisplayGrayscale(true)
@@ -253,8 +241,6 @@
 
     @Test
     public void apply_onlyEffectDeltaApplied() {
-        mSetFlagsRule.enableFlags(android.app.Flags.FLAG_MODES_API);
-
         mApplier.apply(new ZenDeviceEffects.Builder().setShouldDimWallpaper(true).build(),
                 ORIGIN_USER_IN_SYSTEMUI);
         verify(mWallpaperManager).setWallpaperDimAmount(eq(0.6f));
@@ -272,7 +258,6 @@
 
     @Test
     public void apply_nightModeFromApp_appliedOnScreenOff() {
-        mSetFlagsRule.enableFlags(android.app.Flags.FLAG_MODES_API);
         ArgumentCaptor<BroadcastReceiver> broadcastReceiverCaptor =
                 ArgumentCaptor.forClass(BroadcastReceiver.class);
         ArgumentCaptor<IntentFilter> intentFilterCaptor =
@@ -301,8 +286,6 @@
     @Test
     public void apply_nightModeWithScreenOff_appliedImmediately(
             @TestParameter ZenChangeOrigin origin) {
-        mSetFlagsRule.enableFlags(android.app.Flags.FLAG_MODES_API);
-
         when(mPowerManager.isInteractive()).thenReturn(false);
 
         mApplier.apply(new ZenDeviceEffects.Builder().setShouldUseNightMode(true).build(),
@@ -314,7 +297,6 @@
     }
 
     @Test
-    @EnableFlags({android.app.Flags.FLAG_MODES_API, android.app.Flags.FLAG_MODES_UI})
     public void apply_nightModeWithScreenOnAndKeyguardShowing_appliedImmediately(
             @TestParameter ZenChangeOrigin origin) {
 
@@ -334,8 +316,6 @@
             "{origin: ORIGIN_INIT}", "{origin: ORIGIN_INIT_USER}"})
     public void apply_nightModeWithScreenOn_appliedImmediatelyBasedOnOrigin(
             ZenChangeOrigin origin) {
-        mSetFlagsRule.enableFlags(android.app.Flags.FLAG_MODES_API);
-
         when(mPowerManager.isInteractive()).thenReturn(true);
 
         mApplier.apply(new ZenDeviceEffects.Builder().setShouldUseNightMode(true).build(),
@@ -351,8 +331,6 @@
             "{origin: ORIGIN_SYSTEM}", "{origin: ORIGIN_UNKNOWN}"})
     public void apply_nightModeWithScreenOn_willBeAppliedLaterBasedOnOrigin(
             ZenChangeOrigin origin) {
-        mSetFlagsRule.enableFlags(android.app.Flags.FLAG_MODES_API);
-
         when(mPowerManager.isInteractive()).thenReturn(true);
 
         mApplier.apply(new ZenDeviceEffects.Builder().setShouldUseNightMode(true).build(),
@@ -367,8 +345,6 @@
 
     @Test
     public void apply_servicesThrow_noCrash() {
-        mSetFlagsRule.enableFlags(android.app.Flags.FLAG_MODES_API);
-
         doThrow(new RuntimeException()).when(mPowerManager)
                 .suppressAmbientDisplay(anyString(), anyBoolean());
         doThrow(new RuntimeException()).when(mColorDisplayManager).setSaturationLevel(anyInt());
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 e5c42082..98440ec 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java
@@ -17,12 +17,17 @@
 
 import static android.content.Context.DEVICE_POLICY_SERVICE;
 import static android.app.Flags.FLAG_LIFETIME_EXTENSION_REFACTOR;
+import static android.os.UserHandle.USER_ALL;
+import static android.os.UserHandle.USER_CURRENT;
 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.dx.mockito.inline.extended.ExtendedMockito.spyOn;
+import static com.android.server.notification.Flags.FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER;
+import static com.android.server.notification.Flags.managedServicesConcurrentMultiuser;
 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;
@@ -66,7 +71,9 @@
 import android.os.RemoteException;
 import android.os.UserHandle;
 import android.os.UserManager;
+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.text.TextUtils;
 import android.util.ArrayMap;
@@ -83,6 +90,7 @@
 import com.google.android.collect.Lists;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
@@ -105,6 +113,9 @@
 
 public class ManagedServicesTest extends UiServiceTestCase {
 
+    @Rule
+    public SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
     @Mock
     private IPackageManager mIpm;
     @Mock
@@ -155,6 +166,7 @@
         users.add(new UserInfo(11, "11", 0));
         users.add(new UserInfo(12, "12", 0));
         users.add(new UserInfo(13, "13", 0));
+        users.add(new UserInfo(99, "99", 0));
         for (UserInfo user : users) {
             when(mUm.getUserInfo(eq(user.id))).thenReturn(user);
         }
@@ -804,6 +816,7 @@
     }
 
     @Test
+    @DisableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
     public void rebindServices_onlyBindsExactMatchesIfComponent() throws Exception {
         // If the primary and secondary lists contain component names, only those components within
         // the package should be matched
@@ -841,6 +854,45 @@
     }
 
     @Test
+    @EnableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
+    public void rebindServices_onlyBindsExactMatchesIfComponent_concurrent_multiUser()
+            throws Exception {
+        // If the primary and secondary lists contain component names, only those components within
+        // the package should be matched
+        ManagedServices service = new TestManagedServices(getContext(), mLock, mUserProfiles,
+                mIpm,
+                ManagedServices.APPROVAL_BY_COMPONENT);
+
+        List<String> packages = new ArrayList<>();
+        packages.add("package");
+        packages.add("anotherPackage");
+        addExpectedServices(service, packages, 0);
+
+        // only 2 components are approved per package
+        mExpectedPrimaryComponentNames.clear();
+        mExpectedPrimaryComponentNames.put(0, "package/C1:package/C2");
+        mExpectedSecondaryComponentNames.clear();
+        mExpectedSecondaryComponentNames.put(0, "anotherPackage/C1:anotherPackage/C2");
+
+        loadXml(service);
+        // verify the 2 components per package are enabled (bound)
+        verifyExpectedBoundEntries(service, true, 0);
+        verifyExpectedBoundEntries(service, false, 0);
+
+        // verify the last component per package is not enabled/we don't try to bind to it
+        for (String pkg : packages) {
+            ComponentName unapprovedAdditionalComponent =
+                    ComponentName.unflattenFromString(pkg + "/C3");
+            assertFalse(
+                    service.isComponentEnabledForUser(
+                            unapprovedAdditionalComponent, 0));
+            verify(mIpm, never()).getServiceInfo(
+                    eq(unapprovedAdditionalComponent), anyLong(), anyInt());
+        }
+    }
+
+    @Test
+    @DisableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
     public void rebindServices_bindsEverythingInAPackage() throws Exception {
         // If the primary and secondary lists contain packages, all components within those packages
         // should be bound
@@ -866,6 +918,32 @@
     }
 
     @Test
+    @EnableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
+    public void rebindServices_bindsEverythingInAPackage_concurrent_multiUser() throws Exception {
+        // If the primary and secondary lists contain packages, all components within those packages
+        // should be bound
+        ManagedServices service = new TestManagedServices(getContext(), mLock, mUserProfiles, mIpm,
+                APPROVAL_BY_PACKAGE);
+
+        List<String> packages = new ArrayList<>();
+        packages.add("package");
+        packages.add("packagea");
+        addExpectedServices(service, packages, 0);
+
+        // 2 approved packages
+        mExpectedPrimaryPackages.clear();
+        mExpectedPrimaryPackages.put(0, "package");
+        mExpectedSecondaryPackages.clear();
+        mExpectedSecondaryPackages.put(0, "packagea");
+
+        loadXml(service);
+
+        // verify the 3 components per package are enabled (bound)
+        verifyExpectedBoundEntries(service, true, 0);
+        verifyExpectedBoundEntries(service, false, 0);
+    }
+
+    @Test
     public void reregisterService_checksAppIsApproved_pkg() throws Exception {
         Context context = mock(Context.class);
         PackageManager pm = mock(PackageManager.class);
@@ -1118,6 +1196,7 @@
     }
 
     @Test
+    @DisableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
     public void testUpgradeAppBindsNewServices() throws Exception {
         // If the primary and secondary lists contain component names, only those components within
         // the package should be matched
@@ -1159,6 +1238,49 @@
     }
 
     @Test
+    @EnableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
+    public void testUpgradeAppBindsNewServices_concurrent_multiUser() throws Exception {
+        // If the primary and secondary lists contain component names, only those components within
+        // the package should be matched
+        ManagedServices service = new TestManagedServices(getContext(), mLock, mUserProfiles,
+                mIpm,
+                ManagedServices.APPROVAL_BY_PACKAGE);
+
+        List<String> packages = new ArrayList<>();
+        packages.add("package");
+        addExpectedServices(service, packages, 0);
+
+        // only 2 components are approved per package
+        mExpectedPrimaryComponentNames.clear();
+        mExpectedPrimaryPackages.clear();
+        mExpectedPrimaryComponentNames.put(0, "package/C1:package/C2");
+        mExpectedSecondaryComponentNames.clear();
+        mExpectedSecondaryPackages.clear();
+
+        loadXml(service);
+
+        // new component expected
+        mExpectedPrimaryComponentNames.put(0, "package/C1:package/C2:package/C3");
+
+        service.onPackagesChanged(false, new String[]{"package"}, new int[]{0});
+
+        // verify the 3 components per package are enabled (bound)
+        verifyExpectedBoundEntries(service, true, 0);
+
+        // verify the last component per package is not enabled/we don't try to bind to it
+        for (String pkg : packages) {
+            ComponentName unapprovedAdditionalComponent =
+                    ComponentName.unflattenFromString(pkg + "/C3");
+            assertFalse(
+                    service.isComponentEnabledForUser(
+                            unapprovedAdditionalComponent, 0));
+            verify(mIpm, never()).getServiceInfo(
+                    eq(unapprovedAdditionalComponent), anyLong(), anyInt());
+        }
+    }
+
+    @Test
+    @DisableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
     public void testUpgradeAppNoPermissionNoRebind() throws Exception {
         Context context = spy(getContext());
         doReturn(true).when(context).bindServiceAsUser(any(), any(), anyInt(), any());
@@ -1211,6 +1333,59 @@
     }
 
     @Test
+    @EnableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
+    public void testUpgradeAppNoPermissionNoRebind_concurrent_multiUser() throws Exception {
+        Context context = spy(getContext());
+        doReturn(true).when(context).bindServiceAsUser(any(), any(), anyInt(), any());
+
+        ManagedServices service = new TestManagedServices(context, mLock, mUserProfiles,
+                mIpm,
+                APPROVAL_BY_COMPONENT);
+
+        List<String> packages = new ArrayList<>();
+        packages.add("package");
+        addExpectedServices(service, packages, 0);
+
+        final ComponentName unapprovedComponent = ComponentName.unflattenFromString("package/C1");
+        final ComponentName approvedComponent = ComponentName.unflattenFromString("package/C2");
+
+        // Both components are approved initially
+        mExpectedPrimaryComponentNames.clear();
+        mExpectedPrimaryPackages.clear();
+        mExpectedPrimaryComponentNames.put(0, "package/C1:package/C2");
+        mExpectedSecondaryComponentNames.clear();
+        mExpectedSecondaryPackages.clear();
+
+        loadXml(service);
+
+        //Component package/C1 loses bind permission
+        when(mIpm.getServiceInfo(any(), anyLong(), anyInt())).thenAnswer(
+                (Answer<ServiceInfo>) invocation -> {
+                    ComponentName invocationCn = invocation.getArgument(0);
+                    if (invocationCn != null) {
+                        ServiceInfo serviceInfo = new ServiceInfo();
+                        serviceInfo.packageName = invocationCn.getPackageName();
+                        serviceInfo.name = invocationCn.getClassName();
+                        if (invocationCn.equals(unapprovedComponent)) {
+                            serviceInfo.permission = "none";
+                        } else {
+                            serviceInfo.permission = service.getConfig().bindPermission;
+                        }
+                        serviceInfo.metaData = null;
+                        return serviceInfo;
+                    }
+                    return null;
+                }
+        );
+
+        // Trigger package update
+        service.onPackagesChanged(false, new String[]{"package"}, new int[]{0});
+
+        assertFalse(service.isComponentEnabledForUser(unapprovedComponent, 0));
+        assertTrue(service.isComponentEnabledForUser(approvedComponent, 0));
+    }
+
+    @Test
     public void testSetPackageOrComponentEnabled() throws Exception {
         for (int approvalLevel : new int[] {APPROVAL_BY_COMPONENT, APPROVAL_BY_PACKAGE}) {
             ManagedServices service = new TestManagedServices(getContext(), mLock, mUserProfiles,
@@ -1517,6 +1692,201 @@
         assertTrue(componentsToBind.get(10).contains(ComponentName.unflattenFromString("c/c")));
     }
 
+    @SuppressWarnings("GuardedBy")
+    @Test
+    @EnableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
+    public void testPopulateComponentsToBindWithNonProfileUser() {
+        ManagedServices service = new TestManagedServices(getContext(), mLock, mUserProfiles, mIpm,
+                APPROVAL_BY_COMPONENT);
+        spyOn(service);
+
+        SparseArray<ArraySet<ComponentName>> approvedComponentsByUser = new SparseArray<>();
+        ArraySet<ComponentName> allowed0 = new ArraySet<>();
+        allowed0.add(ComponentName.unflattenFromString("a/a"));
+        approvedComponentsByUser.put(0, allowed0);
+        ArraySet<ComponentName> allowed10 = new ArraySet<>();
+        allowed10.add(ComponentName.unflattenFromString("b/b"));
+        approvedComponentsByUser.put(10, allowed10);
+
+        int nonProfileUser = 99;
+        ArraySet<ComponentName> allowedForNonProfileUser = new ArraySet<>();
+        allowedForNonProfileUser.add(ComponentName.unflattenFromString("c/c"));
+        approvedComponentsByUser.put(nonProfileUser, allowedForNonProfileUser);
+
+        IntArray users = new IntArray();
+        users.add(nonProfileUser);
+        users.add(10);
+        users.add(0);
+
+        SparseArray<Set<ComponentName>> componentsToBind = new SparseArray<>();
+        spyOn(service.mUmInternal);
+        when(service.mUmInternal.isVisibleBackgroundFullUser(nonProfileUser)).thenReturn(true);
+
+        service.populateComponentsToBind(componentsToBind, users, approvedComponentsByUser);
+
+        assertTrue(service.isComponentEnabledForUser(
+                ComponentName.unflattenFromString("a/a"), 0));
+        assertTrue(service.isComponentEnabledForPackage("a", 0));
+        assertTrue(service.isComponentEnabledForUser(
+                ComponentName.unflattenFromString("b/b"), 10));
+        assertTrue(service.isComponentEnabledForPackage("b", 0));
+        assertTrue(service.isComponentEnabledForPackage("b", 10));
+        assertTrue(service.isComponentEnabledForUser(
+                ComponentName.unflattenFromString("c/c"), nonProfileUser));
+        assertTrue(service.isComponentEnabledForPackage("c", nonProfileUser));
+    }
+
+
+    @Test
+    @EnableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
+    public void testRebindService_profileUser() throws Exception {
+        final int profileUserId = 10;
+        when(mUserProfiles.isProfileUser(profileUserId, mContext)).thenReturn(true);
+        spyOn(mService);
+        ArgumentCaptor<IntArray> captor = ArgumentCaptor.forClass(
+                IntArray.class);
+        when(mService.allowRebindForParentUser()).thenReturn(true);
+
+        mService.rebindServices(false, profileUserId);
+
+        verify(mService).populateComponentsToBind(any(), captor.capture(), any());
+        assertTrue(captor.getValue().contains(0));
+        assertTrue(captor.getValue().contains(profileUserId));
+    }
+
+    @Test
+    @EnableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
+    public void testRebindService_nonProfileUser() throws Exception {
+        final int userId = 99;
+        when(mUserProfiles.isProfileUser(userId, mContext)).thenReturn(false);
+        spyOn(mService);
+        ArgumentCaptor<IntArray> captor = ArgumentCaptor.forClass(
+                IntArray.class);
+        when(mService.allowRebindForParentUser()).thenReturn(true);
+
+        mService.rebindServices(false, userId);
+
+        verify(mService).populateComponentsToBind(any(), captor.capture(), any());
+        assertFalse(captor.getValue().contains(0));
+        assertTrue(captor.getValue().contains(userId));
+    }
+
+    @Test
+    @EnableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
+    public void testRebindService_userAll() throws Exception {
+        final int userId = 99;
+        spyOn(mService);
+        spyOn(mService.mUmInternal);
+        when(mService.mUmInternal.isVisibleBackgroundFullUser(userId)).thenReturn(true);
+        ArgumentCaptor<IntArray> captor = ArgumentCaptor.forClass(
+                IntArray.class);
+        when(mService.allowRebindForParentUser()).thenReturn(true);
+
+        mService.rebindServices(false, USER_ALL);
+
+        verify(mService).populateComponentsToBind(any(), captor.capture(), any());
+        assertTrue(captor.getValue().contains(0));
+        assertTrue(captor.getValue().contains(userId));
+    }
+
+    @Test
+    @EnableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
+    public void testOnUserStoppedWithVisibleBackgroundUser() throws Exception {
+        ManagedServices service = new TestManagedServices(getContext(), mLock, mUserProfiles, mIpm,
+                APPROVAL_BY_COMPONENT);
+        spyOn(service);
+        int userId = 99;
+        SparseArray<ArraySet<ComponentName>> approvedComponentsByUser = new SparseArray<>();
+        ArraySet<ComponentName> allowedForNonProfileUser = new ArraySet<>();
+        allowedForNonProfileUser.add(ComponentName.unflattenFromString("a/a"));
+        approvedComponentsByUser.put(userId, allowedForNonProfileUser);
+        IntArray users = new IntArray();
+        users.add(userId);
+        SparseArray<Set<ComponentName>> componentsToBind = new SparseArray<>();
+        spyOn(service.mUmInternal);
+        when(service.mUmInternal.isVisibleBackgroundFullUser(userId)).thenReturn(true);
+        service.populateComponentsToBind(componentsToBind, users, approvedComponentsByUser);
+        assertTrue(service.isComponentEnabledForUser(
+                ComponentName.unflattenFromString("a/a"), userId));
+        assertTrue(service.isComponentEnabledForPackage("a", userId));
+
+        service.onUserStopped(userId);
+
+        assertFalse(service.isComponentEnabledForUser(
+                ComponentName.unflattenFromString("a/a"), userId));
+        assertFalse(service.isComponentEnabledForPackage("a", userId));
+        verify(service).unbindUserServices(eq(userId));
+    }
+
+    @Test
+    @EnableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
+    public void testUnbindServicesImpl_serviceOfForegroundUser() throws Exception {
+        int switchingUserId = 10;
+        int userId = 99;
+
+        ManagedServices service = new TestManagedServices(getContext(), mLock, mUserProfiles, mIpm,
+                APPROVAL_BY_COMPONENT);
+        spyOn(service);
+        spyOn(service.mUmInternal);
+        when(service.mUmInternal.isVisibleBackgroundFullUser(userId)).thenReturn(false);
+
+        IInterface iInterface = mock(IInterface.class);
+        when(iInterface.asBinder()).thenReturn(mock(IBinder.class));
+
+        ManagedServices.ManagedServiceInfo serviceInfo = service.new ManagedServiceInfo(
+                iInterface, ComponentName.unflattenFromString("a/a"), userId, false,
+                mock(ServiceConnection.class), 26, 34);
+
+        Set<ManagedServices.ManagedServiceInfo> removableBoundServices = new ArraySet<>();
+        removableBoundServices.add(serviceInfo);
+
+        when(service.getRemovableConnectedServices()).thenReturn(removableBoundServices);
+        ArgumentCaptor<SparseArray<Set<ComponentName>>> captor = ArgumentCaptor.forClass(
+                SparseArray.class);
+
+        service.unbindServicesImpl(switchingUserId, true);
+
+        verify(service).unbindFromServices(captor.capture());
+
+        assertEquals(captor.getValue().size(), 1);
+        assertTrue(captor.getValue().indexOfKey(userId) != -1);
+        assertTrue(captor.getValue().get(userId).contains(
+                ComponentName.unflattenFromString("a/a")));
+    }
+
+    @Test
+    @EnableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
+    public void testUnbindServicesImpl_serviceOfVisibleBackgroundUser() throws Exception {
+        int switchingUserId = 10;
+        int userId = 99;
+
+        ManagedServices service = new TestManagedServices(getContext(), mLock, mUserProfiles, mIpm,
+                APPROVAL_BY_COMPONENT);
+        spyOn(service);
+        spyOn(service.mUmInternal);
+        when(service.mUmInternal.isVisibleBackgroundFullUser(userId)).thenReturn(true);
+
+        IInterface iInterface = mock(IInterface.class);
+        when(iInterface.asBinder()).thenReturn(mock(IBinder.class));
+
+        ManagedServices.ManagedServiceInfo serviceInfo = service.new ManagedServiceInfo(
+                iInterface, ComponentName.unflattenFromString("a/a"), userId,
+                false, mock(ServiceConnection.class), 26, 34);
+
+        Set<ManagedServices.ManagedServiceInfo> removableBoundServices = new ArraySet<>();
+        removableBoundServices.add(serviceInfo);
+
+        when(service.getRemovableConnectedServices()).thenReturn(removableBoundServices);
+        ArgumentCaptor<SparseArray<Set<ComponentName>>> captor = ArgumentCaptor.forClass(
+                SparseArray.class);
+
+        service.unbindServicesImpl(switchingUserId, true);
+
+        verify(service).unbindFromServices(captor.capture());
+
+        assertEquals(captor.getValue().size(), 0);
+    }
+
     @Test
     public void testOnNullBinding() throws Exception {
         Context context = mock(Context.class);
@@ -1681,6 +2051,7 @@
         assertFalse(service.isBound(cn, mZero.id));
         assertFalse(service.isBound(cn, mTen.id));
     }
+
     @Test
     public void testOnPackagesChanged_nullValuesPassed_noNullPointers() {
         for (int approvalLevel : new int[] {APPROVAL_BY_COMPONENT, APPROVAL_BY_PACKAGE}) {
@@ -2012,6 +2383,7 @@
     }
 
     @Test
+    @DisableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
     public void isComponentEnabledForCurrentProfiles_isThreadSafe() throws InterruptedException {
         for (UserInfo userInfo : mUm.getUsers()) {
             mService.addApprovedList("pkg1/cmp1:pkg2/cmp2:pkg3/cmp3", userInfo.id, true);
@@ -2024,6 +2396,20 @@
     }
 
     @Test
+    @EnableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
+    public void isComponentEnabledForUser_isThreadSafe() throws InterruptedException {
+        for (UserInfo userInfo : mUm.getUsers()) {
+            mService.addApprovedList("pkg1/cmp1:pkg2/cmp2:pkg3/cmp3", userInfo.id, true);
+        }
+        testThreadSafety(() -> {
+            mService.rebindServices(false, 0);
+            assertThat(mService.isComponentEnabledForUser(
+                    new ComponentName("pkg1", "cmp1"), 0)).isTrue();
+        }, 20, 30);
+    }
+
+    @Test
+    @DisableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
     public void isComponentEnabledForCurrentProfiles_profileUserId() {
         final int profileUserId = 10;
         when(mUserProfiles.isProfileUser(profileUserId, mContext)).thenReturn(true);
@@ -2037,6 +2423,24 @@
     }
 
     @Test
+    @EnableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
+    public void isComponentEnabledForUser_profileUserId() {
+        final int profileUserId = 10;
+        when(mUserProfiles.isProfileUser(profileUserId, mContext)).thenReturn(true);
+        spyOn(mService);
+        doReturn(USER_CURRENT).when(mService).resolveUserId(anyInt());
+
+        // Only approve for parent user (0)
+        mService.addApprovedList("pkg1/cmp1:pkg2/cmp2:pkg3/cmp3", 0, true);
+
+        // Test that the component is enabled after calling rebindServices with profile userId (10)
+        mService.rebindServices(false, profileUserId);
+        assertThat(mService.isComponentEnabledForUser(
+                new ComponentName("pkg1", "cmp1"), profileUserId)).isTrue();
+    }
+
+    @Test
+    @DisableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
     public void isComponentEnabledForCurrentProfiles_profileUserId_NAS() {
         final int profileUserId = 10;
         when(mUserProfiles.isProfileUser(profileUserId, mContext)).thenReturn(true);
@@ -2054,6 +2458,25 @@
     }
 
     @Test
+    @EnableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
+    public void isComponentEnabledForUser_profileUserId_NAS() {
+        final int profileUserId = 10;
+        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);
+        doReturn(USER_CURRENT).when(service).resolveUserId(anyInt());
+
+        // Only approve for parent user (0)
+        service.addApprovedList("pkg1/cmp1:pkg2/cmp2:pkg3/cmp3", 0, true);
+
+        // Test that the component is disabled after calling rebindServices with profile userId (10)
+        service.rebindServices(false, profileUserId);
+        assertThat(service.isComponentEnabledForUser(
+                new ComponentName("pkg1", "cmp1"), profileUserId)).isFalse();
+    }
+
+    @Test
     @EnableFlags(FLAG_LIFETIME_EXTENSION_REFACTOR)
     public void testManagedServiceInfoIsSystemUi() {
         ManagedServices service = new TestManagedServices(getContext(), mLock, mUserProfiles, mIpm,
@@ -2069,6 +2492,48 @@
         assertThat(service0.isSystemUi()).isFalse();
     }
 
+    @Test
+    @EnableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
+    public void testUserMatchesAndEnabled_profileUser() throws Exception {
+        int currentUserId = 10;
+        int profileUserId = 11;
+
+        ManagedServices service = new TestManagedServices(getContext(), mLock, mUserProfiles, mIpm,
+                APPROVAL_BY_COMPONENT);
+        ManagedServices.ManagedServiceInfo listener = spy(service.new ManagedServiceInfo(
+                mock(IInterface.class), ComponentName.unflattenFromString("a/a"), currentUserId,
+                false, mock(ServiceConnection.class), 26, 34));
+
+        doReturn(currentUserId).when(service.mUmInternal).getProfileParentId(profileUserId);
+        doReturn(currentUserId).when(service.mUmInternal).getProfileParentId(currentUserId);
+        doReturn(true).when(listener).isEnabledForUser();
+        doReturn(true).when(mUserProfiles).isCurrentProfile(anyInt());
+
+        assertThat(listener.enabledAndUserMatches(profileUserId)).isTrue();
+    }
+
+    @Test
+    @EnableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
+    public void testUserMatchesAndDisabled_visibleBackgroudUser() throws Exception {
+        int currentUserId = 10;
+        int profileUserId = 11;
+        int visibleBackgroundUserId = 12;
+
+        ManagedServices service = new TestManagedServices(getContext(), mLock, mUserProfiles, mIpm,
+                APPROVAL_BY_COMPONENT);
+        ManagedServices.ManagedServiceInfo listener = spy(service.new ManagedServiceInfo(
+                mock(IInterface.class), ComponentName.unflattenFromString("a/a"), profileUserId,
+                false, mock(ServiceConnection.class), 26, 34));
+
+        doReturn(currentUserId).when(service.mUmInternal).getProfileParentId(profileUserId);
+        doReturn(currentUserId).when(service.mUmInternal).getProfileParentId(currentUserId);
+        doReturn(visibleBackgroundUserId).when(service.mUmInternal)
+                .getProfileParentId(visibleBackgroundUserId);
+        doReturn(true).when(listener).isEnabledForUser();
+
+        assertThat(listener.enabledAndUserMatches(visibleBackgroundUserId)).isFalse();
+    }
+
     private void mockServiceInfoWithMetaData(List<ComponentName> componentNames,
             ManagedServices service, ArrayMap<ComponentName, Bundle> metaDatas)
             throws RemoteException {
@@ -2247,26 +2712,47 @@
 
     private void verifyExpectedBoundEntries(ManagedServices service, boolean primary)
             throws Exception {
+        verifyExpectedBoundEntries(service, primary, UserHandle.USER_CURRENT);
+    }
+
+    private void verifyExpectedBoundEntries(ManagedServices service, boolean primary,
+            int targetUserId) throws Exception {
         ArrayMap<Integer, String> verifyMap = primary ? mExpectedPrimary.get(service.mApprovalLevel)
                 : mExpectedSecondary.get(service.mApprovalLevel);
         for (int userId : verifyMap.keySet()) {
             for (String packageOrComponent : verifyMap.get(userId).split(":")) {
                 if (!TextUtils.isEmpty(packageOrComponent)) {
                     if (service.mApprovalLevel == APPROVAL_BY_PACKAGE) {
-                        assertTrue(packageOrComponent,
-                                service.isComponentEnabledForPackage(packageOrComponent));
+                        if (managedServicesConcurrentMultiuser()) {
+                            assertTrue(packageOrComponent,
+                                    service.isComponentEnabledForPackage(packageOrComponent,
+                                            targetUserId));
+                        } else {
+                            assertTrue(packageOrComponent,
+                                    service.isComponentEnabledForPackage(packageOrComponent));
+                        }
                         for (int i = 1; i <= 3; i++) {
                             ComponentName componentName = ComponentName.unflattenFromString(
                                     packageOrComponent +"/C" + i);
-                            assertTrue(service.isComponentEnabledForCurrentProfiles(
-                                    componentName));
+                            if (managedServicesConcurrentMultiuser()) {
+                                assertTrue(service.isComponentEnabledForUser(
+                                        componentName, targetUserId));
+                            } else {
+                                assertTrue(service.isComponentEnabledForCurrentProfiles(
+                                        componentName));
+                            }
                             verify(mIpm, times(1)).getServiceInfo(
                                     eq(componentName), anyLong(), anyInt());
                         }
                     } else {
                         ComponentName componentName =
                                 ComponentName.unflattenFromString(packageOrComponent);
-                        assertTrue(service.isComponentEnabledForCurrentProfiles(componentName));
+                        if (managedServicesConcurrentMultiuser()) {
+                            assertTrue(service.isComponentEnabledForUser(componentName,
+                                    targetUserId));
+                        } else {
+                            assertTrue(service.isComponentEnabledForCurrentProfiles(componentName));
+                        }
                         verify(mIpm, times(1)).getServiceInfo(
                                 eq(componentName), anyLong(), anyInt());
                     }
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 0373eb6..37ab541 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -140,6 +140,7 @@
 import static com.android.server.am.PendingIntentRecord.FLAG_BROADCAST_SENDER;
 import static com.android.server.am.PendingIntentRecord.FLAG_SERVICE_SENDER;
 import static com.android.server.notification.Flags.FLAG_ALL_NOTIFS_NEED_TTL;
+import static com.android.server.notification.Flags.FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER;
 import static com.android.server.notification.Flags.FLAG_REJECT_OLD_NOTIFICATIONS;
 import static com.android.server.notification.GroupHelper.AUTOGROUP_KEY;
 import static com.android.server.notification.NotificationManagerService.BITMAP_DURATION;
@@ -867,7 +868,8 @@
                     && filter.hasAction(Intent.ACTION_PACKAGES_SUSPENDED)) {
                 mPackageIntentReceiver = broadcastReceivers.get(i);
             }
-            if (filter.hasAction(Intent.ACTION_USER_SWITCHED)
+            if (filter.hasAction(Intent.ACTION_USER_STOPPED)
+                    || filter.hasAction(Intent.ACTION_USER_SWITCHED)
                     || filter.hasAction(Intent.ACTION_PROFILE_UNAVAILABLE)
                     || filter.hasAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE)) {
                 // There may be multiple receivers, get the NMS one
@@ -5383,6 +5385,42 @@
     }
 
     @Test
+    public void testGetPackagesWithChannels_blocked() throws Exception {
+        // While we mostly rely on the PreferencesHelper implementation of channels, we filter in
+        // NMS so that we do not return blocked packages.
+        // Three packages; all under user 1.
+        // pkg2 is blocked, but pkg1 and pkg3 are not.
+        String pkg1 = "com.package.one", pkg2 = "com.package.two", pkg3 = "com.package.three";
+        int uid1 = UserHandle.getUid(1, 111);
+        int uid2 = UserHandle.getUid(1, 222);
+        int uid3 = UserHandle.getUid(1, 333);
+
+        when(mPackageManager.getPackageUid(eq(pkg1), anyLong(), anyInt())).thenReturn(uid1);
+        when(mPackageManager.getPackageUid(eq(pkg2), anyLong(), anyInt())).thenReturn(uid2);
+        when(mPackageManager.getPackageUid(eq(pkg3), anyLong(), anyInt())).thenReturn(uid3);
+        when(mPermissionHelper.hasPermission(uid1)).thenReturn(true);
+        when(mPermissionHelper.hasPermission(uid2)).thenReturn(false);
+        when(mPermissionHelper.hasPermission(uid3)).thenReturn(true);
+
+        NotificationChannel channel1 = new NotificationChannel("id1", "name1",
+                NotificationManager.IMPORTANCE_DEFAULT);
+        NotificationChannel channel2 = new NotificationChannel("id3", "name3",
+                NotificationManager.IMPORTANCE_DEFAULT);
+        NotificationChannel channel3 = new NotificationChannel("id4", "name3",
+                NotificationManager.IMPORTANCE_DEFAULT);
+        mService.mPreferencesHelper.createNotificationChannel(pkg1, uid1, channel1, true, false,
+                uid1, false);
+        mService.mPreferencesHelper.createNotificationChannel(pkg2, uid2, channel2, true, false,
+                uid2, false);
+        mService.mPreferencesHelper.createNotificationChannel(pkg3, uid3, channel3, true, false,
+                uid3, false);
+
+        // Output should contain only the package with notification permissions (1, 3).
+        enableInteractAcrossUsers();
+        assertThat(mBinderService.getPackagesWithAnyChannels(1)).containsExactly(pkg1, pkg3);
+    }
+
+    @Test
     public void testHasCompanionDevice_failure() throws Exception {
         when(mCompanionMgr.getAssociations(anyString(), anyInt())).thenThrow(
                 new IllegalArgumentException());
@@ -10992,7 +11030,6 @@
     }
 
     @Test
-    @EnableFlags(android.app.Flags.FLAG_MODES_API)
     public void testAddAutomaticZenRule_typeManagedCanBeUsedByDeviceOwners() throws Exception {
         ZenModeHelper zenModeHelper = setUpMockZenTest();
         mService.setCallerIsNormalPackage();
@@ -11010,20 +11047,17 @@
     }
 
     @Test
-    @EnableFlags(android.app.Flags.FLAG_MODES_API)
     public void testAddAutomaticZenRule_typeManagedCanBeUsedBySystem() throws Exception {
         addAutomaticZenRule_restrictedRuleTypeCanBeUsedBySystem(AutomaticZenRule.TYPE_MANAGED);
     }
 
     @Test
-    @EnableFlags(android.app.Flags.FLAG_MODES_API)
     public void testAddAutomaticZenRule_typeManagedCannotBeUsedByRegularApps() throws Exception {
         addAutomaticZenRule_restrictedRuleTypeCannotBeUsedByRegularApps(
                 AutomaticZenRule.TYPE_MANAGED);
     }
 
     @Test
-    @EnableFlags(android.app.Flags.FLAG_MODES_API)
     public void testAddAutomaticZenRule_typeBedtimeCanBeUsedByWellbeing() throws Exception {
         ZenModeHelper zenModeHelper = setUpMockZenTest();
         mService.setCallerIsNormalPackage();
@@ -11046,7 +11080,6 @@
     }
 
     @Test
-    @EnableFlags(android.app.Flags.FLAG_MODES_API)
     public void testAddAutomaticZenRule_typeBedtimeCanBeUsedBySystem() throws Exception {
         reset(mPackageManagerInternal);
         when(mPackageManagerInternal.isSameApp(eq(mPkg), eq(mUid), anyInt())).thenReturn(true);
@@ -11054,7 +11087,6 @@
     }
 
     @Test
-    @EnableFlags(android.app.Flags.FLAG_MODES_API)
     public void testAddAutomaticZenRule_typeBedtimeCannotBeUsedByRegularApps() throws Exception {
         reset(mPackageManagerInternal);
         when(mPackageManagerInternal.isSameApp(eq(mPkg), eq(mUid), anyInt())).thenReturn(true);
@@ -11097,7 +11129,6 @@
     }
 
     @Test
-    @EnableFlags(android.app.Flags.FLAG_MODES_API)
     public void addAutomaticZenRule_fromUser_mappedToOriginUser() throws Exception {
         ZenModeHelper zenModeHelper = setUpMockZenTest();
         mService.isSystemUid = true;
@@ -11109,7 +11140,6 @@
     }
 
     @Test
-    @EnableFlags(android.app.Flags.FLAG_MODES_API)
     public void addAutomaticZenRule_fromSystemNotUser_mappedToOriginSystem() throws Exception {
         ZenModeHelper zenModeHelper = setUpMockZenTest();
         mService.isSystemUid = true;
@@ -11121,7 +11151,6 @@
     }
 
     @Test
-    @EnableFlags(android.app.Flags.FLAG_MODES_API)
     public void addAutomaticZenRule_fromApp_mappedToOriginApp() throws Exception {
         ZenModeHelper zenModeHelper = setUpMockZenTest();
         mService.setCallerIsNormalPackage();
@@ -11133,7 +11162,6 @@
     }
 
     @Test
-    @EnableFlags(android.app.Flags.FLAG_MODES_API)
     public void addAutomaticZenRule_fromAppFromUser_blocked() throws Exception {
         setUpMockZenTest();
         mService.setCallerIsNormalPackage();
@@ -11143,7 +11171,6 @@
     }
 
     @Test
-    @EnableFlags(android.app.Flags.FLAG_MODES_API)
     public void updateAutomaticZenRule_fromUserFromSystem_allowed() throws Exception {
         ZenModeHelper zenModeHelper = setUpMockZenTest();
         mService.isSystemUid = true;
@@ -11155,7 +11182,6 @@
     }
 
     @Test
-    @EnableFlags(android.app.Flags.FLAG_MODES_API)
     public void updateAutomaticZenRule_fromUserFromApp_blocked() throws Exception {
         setUpMockZenTest();
         mService.setCallerIsNormalPackage();
@@ -11165,7 +11191,6 @@
     }
 
     @Test
-    @EnableFlags(android.app.Flags.FLAG_MODES_API)
     public void removeAutomaticZenRule_fromUserFromSystem_allowed() throws Exception {
         ZenModeHelper zenModeHelper = setUpMockZenTest();
         mService.isSystemUid = true;
@@ -11177,7 +11202,6 @@
     }
 
     @Test
-    @EnableFlags(android.app.Flags.FLAG_MODES_API)
     public void removeAutomaticZenRule_fromUserFromApp_blocked() throws Exception {
         setUpMockZenTest();
         mService.setCallerIsNormalPackage();
@@ -11187,7 +11211,6 @@
     }
 
     @Test
-    @EnableFlags(android.app.Flags.FLAG_MODES_API)
     public void setAutomaticZenRuleState_fromAppWithConditionFromUser_originUserInApp()
             throws Exception {
         ZenModeHelper zenModeHelper = setUpMockZenTest();
@@ -11202,7 +11225,6 @@
     }
 
     @Test
-    @EnableFlags(android.app.Flags.FLAG_MODES_API)
     public void setAutomaticZenRuleState_fromAppWithConditionNotFromUser_originApp()
             throws Exception {
         ZenModeHelper zenModeHelper = setUpMockZenTest();
@@ -11217,7 +11239,6 @@
     }
 
     @Test
-    @EnableFlags(android.app.Flags.FLAG_MODES_API)
     public void setAutomaticZenRuleState_fromSystemWithConditionFromUser_originUserInSystemUi()
             throws Exception {
         ZenModeHelper zenModeHelper = setUpMockZenTest();
@@ -11231,7 +11252,6 @@
                 eq(ZenModeConfig.ORIGIN_USER_IN_SYSTEMUI), anyInt());
     }
     @Test
-    @EnableFlags(android.app.Flags.FLAG_MODES_API)
     public void setAutomaticZenRuleState_fromSystemWithConditionNotFromUser_originSystem()
             throws Exception {
         ZenModeHelper zenModeHelper = setUpMockZenTest();
@@ -11402,7 +11422,6 @@
     }
 
     @Test
-    @EnableFlags(android.app.Flags.FLAG_MODES_API)
     public void onAutomaticRuleStatusChanged_sendsBroadcastToRuleOwner() throws Exception {
         mService.mZenModeHelper.getCallbacks().forEach(c -> c.onAutomaticRuleStatusChanged(
                 mUserId, "rule.owner.pkg", "rule_id", AUTOMATIC_RULE_STATUS_ACTIVATED));
@@ -16266,7 +16285,7 @@
 
         InOrder inOrder = inOrder(mPreferencesHelper, mService.mZenModeHelper);
         inOrder.verify(mService.mZenModeHelper).onUserSwitched(eq(20));
-        inOrder.verify(mPreferencesHelper).syncChannelsBypassingDnd();
+        inOrder.verify(mPreferencesHelper).syncHasPriorityChannels();
         inOrder.verifyNoMoreInteractions();
     }
 
@@ -16282,11 +16301,25 @@
 
         InOrder inOrder = inOrder(mPreferencesHelper, mService.mZenModeHelper);
         inOrder.verify(mService.mZenModeHelper).onUserSwitched(eq(20));
-        inOrder.verify(mPreferencesHelper).syncChannelsBypassingDnd();
+        inOrder.verify(mPreferencesHelper).syncHasPriorityChannels();
         inOrder.verifyNoMoreInteractions();
     }
 
     @Test
+    @EnableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
+    public void onUserStopped_callBackToListeners() {
+        Intent intent = new Intent(Intent.ACTION_USER_STOPPED);
+        intent.putExtra(Intent.EXTRA_USER_HANDLE, 20);
+
+        mUserIntentReceiver.onReceive(mContext, intent);
+
+        verify(mConditionProviders).onUserStopped(eq(20));
+        verify(mListeners).onUserStopped(eq(20));
+        verify(mAssistants).onUserStopped(eq(20));
+    }
+
+    @Test
+    @DisableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
     public void isNotificationPolicyAccessGranted_invalidPackage() throws Exception {
         final String notReal = "NOT REAL";
         final var checker = mService.permissionChecker;
@@ -16303,6 +16336,25 @@
     }
 
     @Test
+    @EnableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
+    public void isNotificationPolicyAccessGranted_invalidPackage_concurrent_multiUser()
+                throws Exception {
+        final String notReal = "NOT REAL";
+        final var checker = mService.permissionChecker;
+
+        when(mPackageManagerClient.getPackageUidAsUser(eq(notReal), anyInt())).thenThrow(
+                PackageManager.NameNotFoundException.class);
+
+        assertThat(mBinderService.isNotificationPolicyAccessGranted(notReal)).isFalse();
+        verify(mPackageManagerClient).getPackageUidAsUser(eq(notReal), anyInt());
+        verify(checker, never()).check(any(), anyInt(), anyInt(), anyBoolean());
+        verify(mConditionProviders, never()).isPackageOrComponentAllowed(eq(notReal), anyInt());
+        verify(mListeners, never()).isComponentEnabledForPackage(any(), anyInt());
+        verify(mDevicePolicyManager, never()).isActiveDeviceOwner(anyInt());
+    }
+
+    @Test
+    @DisableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
     public void isNotificationPolicyAccessGranted_hasPermission() throws Exception {
         final String packageName = "target";
         final int uid = 123;
@@ -16321,6 +16373,27 @@
     }
 
     @Test
+    @EnableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
+    public void isNotificationPolicyAccessGranted_hasPermission_concurrent_multiUser()
+                throws Exception {
+        final String packageName = "target";
+        final int uid = 123;
+        final var checker = mService.permissionChecker;
+
+        when(mPackageManagerClient.getPackageUidAsUser(eq(packageName), anyInt())).thenReturn(uid);
+        when(checker.check(android.Manifest.permission.MANAGE_NOTIFICATIONS, uid, -1, true))
+                .thenReturn(PackageManager.PERMISSION_GRANTED);
+
+        assertThat(mBinderService.isNotificationPolicyAccessGranted(packageName)).isTrue();
+        verify(mPackageManagerClient).getPackageUidAsUser(eq(packageName), anyInt());
+        verify(checker).check(android.Manifest.permission.MANAGE_NOTIFICATIONS, uid, -1, true);
+        verify(mConditionProviders, never()).isPackageOrComponentAllowed(eq(packageName), anyInt());
+        verify(mListeners, never()).isComponentEnabledForPackage(any(), anyInt());
+        verify(mDevicePolicyManager, never()).isActiveDeviceOwner(anyInt());
+    }
+
+    @Test
+    @DisableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
     public void isNotificationPolicyAccessGranted_isPackageAllowed() throws Exception {
         final String packageName = "target";
         final int uid = 123;
@@ -16339,6 +16412,27 @@
     }
 
     @Test
+    @EnableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
+    public void isNotificationPolicyAccessGranted_isPackageAllowed_concurrent_multiUser()
+                throws Exception {
+        final String packageName = "target";
+        final int uid = 123;
+        final var checker = mService.permissionChecker;
+
+        when(mPackageManagerClient.getPackageUidAsUser(eq(packageName), anyInt())).thenReturn(uid);
+        when(mConditionProviders.isPackageOrComponentAllowed(eq(packageName), anyInt()))
+                .thenReturn(true);
+
+        assertThat(mBinderService.isNotificationPolicyAccessGranted(packageName)).isTrue();
+        verify(mPackageManagerClient).getPackageUidAsUser(eq(packageName), anyInt());
+        verify(checker).check(android.Manifest.permission.MANAGE_NOTIFICATIONS, uid, -1, true);
+        verify(mConditionProviders).isPackageOrComponentAllowed(eq(packageName), anyInt());
+        verify(mListeners, never()).isComponentEnabledForPackage(any(), anyInt());
+        verify(mDevicePolicyManager, never()).isActiveDeviceOwner(anyInt());
+    }
+
+    @Test
+    @DisableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
     public void isNotificationPolicyAccessGranted_isComponentEnabled() throws Exception {
         final String packageName = "target";
         final int uid = 123;
@@ -16356,6 +16450,26 @@
     }
 
     @Test
+    @EnableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
+    public void isNotificationPolicyAccessGranted_isComponentEnabled_concurrent_multiUser()
+                throws Exception {
+        final String packageName = "target";
+        final int uid = 123;
+        final var checker = mService.permissionChecker;
+
+        when(mPackageManagerClient.getPackageUidAsUser(eq(packageName), anyInt())).thenReturn(uid);
+        when(mListeners.isComponentEnabledForPackage(packageName, mUserId)).thenReturn(true);
+
+        assertThat(mBinderService.isNotificationPolicyAccessGranted(packageName)).isTrue();
+        verify(mPackageManagerClient).getPackageUidAsUser(eq(packageName), anyInt());
+        verify(checker).check(android.Manifest.permission.MANAGE_NOTIFICATIONS, uid, -1, true);
+        verify(mConditionProviders).isPackageOrComponentAllowed(eq(packageName), anyInt());
+        verify(mListeners).isComponentEnabledForPackage(packageName, mUserId);
+        verify(mDevicePolicyManager, never()).isActiveDeviceOwner(anyInt());
+    }
+
+    @Test
+    @DisableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
     public void isNotificationPolicyAccessGranted_isDeviceOwner() throws Exception {
         final String packageName = "target";
         final int uid = 123;
@@ -16372,10 +16486,30 @@
         verify(mDevicePolicyManager).isActiveDeviceOwner(uid);
     }
 
+    @Test
+    @EnableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
+    public void isNotificationPolicyAccessGranted_isDeviceOwner_concurrent_multiUser()
+            throws Exception {
+        final String packageName = "target";
+        final int uid = 123;
+        final var checker = mService.permissionChecker;
+
+        when(mPackageManagerClient.getPackageUidAsUser(eq(packageName), anyInt())).thenReturn(uid);
+        when(mDevicePolicyManager.isActiveDeviceOwner(uid)).thenReturn(true);
+
+        assertThat(mBinderService.isNotificationPolicyAccessGranted(packageName)).isTrue();
+        verify(mPackageManagerClient).getPackageUidAsUser(eq(packageName), anyInt());
+        verify(checker).check(android.Manifest.permission.MANAGE_NOTIFICATIONS, uid, -1, true);
+        verify(mConditionProviders).isPackageOrComponentAllowed(eq(packageName), anyInt());
+        verify(mListeners).isComponentEnabledForPackage(packageName, mUserId);
+        verify(mDevicePolicyManager).isActiveDeviceOwner(uid);
+    }
+
     /**
      * b/292163859
      */
     @Test
+    @DisableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
     public void isNotificationPolicyAccessGranted_callerIsDeviceOwner() throws Exception {
         final String packageName = "target";
         final int uid = 123;
@@ -16394,7 +16528,32 @@
         verify(mDevicePolicyManager, never()).isActiveDeviceOwner(callingUid);
     }
 
+    /**
+     * b/292163859
+     */
     @Test
+    @EnableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
+    public void isNotificationPolicyAccessGranted_callerIsDeviceOwner_concurrent_multiUser()
+                throws Exception {
+        final String packageName = "target";
+        final int uid = 123;
+        final int callingUid = Binder.getCallingUid();
+        final var checker = mService.permissionChecker;
+
+        when(mPackageManagerClient.getPackageUidAsUser(eq(packageName), anyInt())).thenReturn(uid);
+        when(mDevicePolicyManager.isActiveDeviceOwner(callingUid)).thenReturn(true);
+
+        assertThat(mBinderService.isNotificationPolicyAccessGranted(packageName)).isFalse();
+        verify(mPackageManagerClient).getPackageUidAsUser(eq(packageName), anyInt());
+        verify(checker).check(android.Manifest.permission.MANAGE_NOTIFICATIONS, uid, -1, true);
+        verify(mConditionProviders).isPackageOrComponentAllowed(eq(packageName), anyInt());
+        verify(mListeners).isComponentEnabledForPackage(packageName, mUserId);
+        verify(mDevicePolicyManager).isActiveDeviceOwner(uid);
+        verify(mDevicePolicyManager, never()).isActiveDeviceOwner(callingUid);
+    }
+
+    @Test
+    @DisableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
     public void isNotificationPolicyAccessGranted_notGranted() throws Exception {
         final String packageName = "target";
         final int uid = 123;
@@ -16411,6 +16570,24 @@
     }
 
     @Test
+    @EnableFlags(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
+    public void isNotificationPolicyAccessGranted_notGranted_concurrent_multiUser()
+                throws Exception {
+        final String packageName = "target";
+        final int uid = 123;
+        final var checker = mService.permissionChecker;
+
+        when(mPackageManagerClient.getPackageUidAsUser(eq(packageName), anyInt())).thenReturn(uid);
+
+        assertThat(mBinderService.isNotificationPolicyAccessGranted(packageName)).isFalse();
+        verify(mPackageManagerClient).getPackageUidAsUser(eq(packageName), anyInt());
+        verify(checker).check(android.Manifest.permission.MANAGE_NOTIFICATIONS, uid, -1, true);
+        verify(mConditionProviders).isPackageOrComponentAllowed(eq(packageName), anyInt());
+        verify(mListeners).isComponentEnabledForPackage(packageName, mUserId);
+        verify(mDevicePolicyManager).isActiveDeviceOwner(uid);
+    }
+
+    @Test
     public void testResetDefaultDnd() {
         TestableNotificationManagerService service = spy(mService);
         UserInfo user = new UserInfo(0, "owner", 0);
@@ -16445,7 +16622,6 @@
     }
 
     @Test
-    @EnableFlags(android.app.Flags.FLAG_MODES_API)
     public void setDeviceEffectsApplier_succeeds() throws Exception {
         initNMS(SystemService.PHASE_SYSTEM_SERVICES_READY);
 
@@ -16456,7 +16632,6 @@
     }
 
     @Test
-    @EnableFlags(android.app.Flags.FLAG_MODES_API)
     public void setDeviceEffectsApplier_tooLate_throws() throws Exception {
         initNMS(SystemService.PHASE_THIRD_PARTY_APPS_CAN_START);
 
@@ -16465,7 +16640,6 @@
     }
 
     @Test
-    @EnableFlags(android.app.Flags.FLAG_MODES_API)
     public void setDeviceEffectsApplier_calledTwice_throws() throws Exception {
         initNMS(SystemService.PHASE_SYSTEM_SERVICES_READY);
 
@@ -16477,7 +16651,6 @@
     @Test
     @EnableCompatChanges(NotificationManagerService.MANAGE_GLOBAL_ZEN_VIA_IMPLICIT_RULES)
     public void setNotificationPolicy_mappedToImplicitRule() throws RemoteException {
-        mSetFlagsRule.enableFlags(android.app.Flags.FLAG_MODES_API);
         mService.setCallerIsNormalPackage();
         ZenModeHelper zenHelper = mock(ZenModeHelper.class);
         mService.mZenModeHelper = zenHelper;
@@ -16494,7 +16667,6 @@
     @Test
     @EnableCompatChanges(NotificationManagerService.MANAGE_GLOBAL_ZEN_VIA_IMPLICIT_RULES)
     public void setNotificationPolicy_systemCaller_setsGlobalPolicy() throws RemoteException {
-        mSetFlagsRule.enableFlags(android.app.Flags.FLAG_MODES_API);
         ZenModeHelper zenModeHelper = mock(ZenModeHelper.class);
         mService.mZenModeHelper = zenModeHelper;
         when(mConditionProviders.isPackageOrComponentAllowed(anyString(), anyInt()))
@@ -16534,7 +16706,6 @@
     private void setNotificationPolicy_dependingOnCompanionAppDevice_maySetGlobalPolicy(
             @AssociationRequest.DeviceProfile String deviceProfile, boolean canSetGlobalPolicy)
             throws RemoteException {
-        mSetFlagsRule.enableFlags(android.app.Flags.FLAG_MODES_API);
         mService.setCallerIsNormalPackage();
         ZenModeHelper zenModeHelper = mock(ZenModeHelper.class);
         mService.mZenModeHelper = zenModeHelper;
@@ -16561,7 +16732,6 @@
     @Test
     @DisableCompatChanges(NotificationManagerService.MANAGE_GLOBAL_ZEN_VIA_IMPLICIT_RULES)
     public void setNotificationPolicy_withoutCompat_setsGlobalPolicy() throws RemoteException {
-        mSetFlagsRule.enableFlags(android.app.Flags.FLAG_MODES_API);
         mService.setCallerIsNormalPackage();
         ZenModeHelper zenModeHelper = mock(ZenModeHelper.class);
         mService.mZenModeHelper = zenModeHelper;
@@ -16577,7 +16747,6 @@
     @Test
     @EnableCompatChanges(NotificationManagerService.MANAGE_GLOBAL_ZEN_VIA_IMPLICIT_RULES)
     public void getNotificationPolicy_mappedFromImplicitRule() throws RemoteException {
-        mSetFlagsRule.enableFlags(android.app.Flags.FLAG_MODES_API);
         mService.setCallerIsNormalPackage();
         ZenModeHelper zenHelper = mock(ZenModeHelper.class);
         mService.mZenModeHelper = zenHelper;
@@ -16592,7 +16761,6 @@
     @Test
     @EnableCompatChanges(NotificationManagerService.MANAGE_GLOBAL_ZEN_VIA_IMPLICIT_RULES)
     public void setInterruptionFilter_mappedToImplicitRule() throws RemoteException {
-        mSetFlagsRule.enableFlags(android.app.Flags.FLAG_MODES_API);
         mService.setCallerIsNormalPackage();
         ZenModeHelper zenHelper = mock(ZenModeHelper.class);
         mService.mZenModeHelper = zenHelper;
@@ -16608,7 +16776,6 @@
     @Test
     @EnableCompatChanges(NotificationManagerService.MANAGE_GLOBAL_ZEN_VIA_IMPLICIT_RULES)
     public void setInterruptionFilter_systemCaller_setsGlobalPolicy() throws RemoteException {
-        mSetFlagsRule.enableFlags(android.app.Flags.FLAG_MODES_API);
         mService.setCallerIsNormalPackage();
         ZenModeHelper zenModeHelper = mock(ZenModeHelper.class);
         mService.mZenModeHelper = zenModeHelper;
@@ -16647,7 +16814,6 @@
     private void setInterruptionFilter_dependingOnCompanionAppDevice_maySetGlobalZen(
             @AssociationRequest.DeviceProfile String deviceProfile, boolean canSetGlobalPolicy)
             throws RemoteException {
-        mSetFlagsRule.enableFlags(android.app.Flags.FLAG_MODES_API);
         ZenModeHelper zenModeHelper = mock(ZenModeHelper.class);
         mService.mZenModeHelper = zenModeHelper;
         mService.setCallerIsNormalPackage();
@@ -16672,7 +16838,6 @@
     }
 
     @Test
-    @EnableFlags(android.app.Flags.FLAG_MODES_API)
     @EnableCompatChanges(NotificationManagerService.MANAGE_GLOBAL_ZEN_VIA_IMPLICIT_RULES)
     public void requestInterruptionFilterFromListener_fromApp_doesNotSetGlobalZen()
             throws Exception {
@@ -16690,7 +16855,6 @@
     }
 
     @Test
-    @EnableFlags(android.app.Flags.FLAG_MODES_API)
     @EnableCompatChanges(NotificationManagerService.MANAGE_GLOBAL_ZEN_VIA_IMPLICIT_RULES)
     public void requestInterruptionFilterFromListener_fromSystem_setsGlobalZen()
             throws Exception {
@@ -16709,24 +16873,6 @@
     }
 
     @Test
-    @DisableFlags(android.app.Flags.FLAG_MODES_API)
-    public void requestInterruptionFilterFromListener_flagOff_callsRequestFromListener()
-            throws Exception {
-        mService.setCallerIsNormalPackage();
-        mService.mZenModeHelper = mock(ZenModeHelper.class);
-        ManagedServices.ManagedServiceInfo info = mock(ManagedServices.ManagedServiceInfo.class);
-        when(mListeners.checkServiceTokenLocked(any())).thenReturn(info);
-        info.component = new ComponentName("pkg", "cls");
-
-        mBinderService.requestInterruptionFilterFromListener(mock(INotificationListener.class),
-                INTERRUPTION_FILTER_PRIORITY);
-
-        verify(mService.mZenModeHelper).requestFromListener(eq(info.component),
-                eq(INTERRUPTION_FILTER_PRIORITY), eq(mUid), /* fromSystemOrSystemUi= */ eq(false));
-    }
-
-    @Test
-    @EnableFlags(android.app.Flags.FLAG_MODES_API)
     @EnableCompatChanges(NotificationManagerService.MANAGE_GLOBAL_ZEN_VIA_IMPLICIT_RULES)
     public void updateAutomaticZenRule_implicitRuleWithoutCPS_disallowedFromApp() throws Exception {
         setUpRealZenTest();
@@ -16752,7 +16898,6 @@
     }
 
     @Test
-    @EnableFlags(android.app.Flags.FLAG_MODES_API)
     @EnableCompatChanges(NotificationManagerService.MANAGE_GLOBAL_ZEN_VIA_IMPLICIT_RULES)
     public void updateAutomaticZenRule_implicitRuleWithoutCPS_allowedFromSystem() throws Exception {
         setUpRealZenTest();
@@ -16778,7 +16923,7 @@
     }
 
     @Test
-    @EnableFlags({android.app.Flags.FLAG_MODES_API, android.app.Flags.FLAG_MODES_UI})
+    @EnableFlags(android.app.Flags.FLAG_MODES_UI)
     public void setNotificationPolicy_fromSystemApp_appliesPriorityChannelsAllowed()
             throws Exception {
         setUpRealZenTest();
@@ -16808,7 +16953,7 @@
     }
 
     @Test
-    @EnableFlags({android.app.Flags.FLAG_MODES_API, android.app.Flags.FLAG_MODES_UI})
+    @EnableFlags(android.app.Flags.FLAG_MODES_UI)
     @DisableCompatChanges(NotificationManagerService.MANAGE_GLOBAL_ZEN_VIA_IMPLICIT_RULES)
     public void setNotificationPolicy_fromRegularAppThatCanModifyPolicy_ignoresState()
             throws Exception {
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 3f26cd9..5dea44d 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
@@ -363,7 +363,7 @@
                 .when(mTestIContentProvider).uncanonicalize(any(), eq(CANONICAL_SOUND_URI));
 
         mTestNotificationPolicy = new NotificationManager.Policy(0, 0, 0, 0,
-                NotificationManager.Policy.STATE_CHANNELS_BYPASSING_DND, 0);
+                NotificationManager.Policy.STATE_HAS_PRIORITY_CHANNELS, 0);
         when(mMockZenModeHelper.getNotificationPolicy(any())).thenReturn(mTestNotificationPolicy);
         when(mAppOpsManager.noteOpNoThrow(anyInt(), anyInt(),
                 anyString(), eq(null), anyString())).thenReturn(MODE_DEFAULT);
@@ -2733,7 +2733,7 @@
         NotificationChannel channel = new NotificationChannel("id1", "name1", IMPORTANCE_LOW);
         mHelper.createNotificationChannel(PKG_N_MR1, uid, channel, true, false,
                 uid, false);
-        assertFalse(mHelper.areChannelsBypassingDnd());
+        assertFalse(mHelper.hasPriorityChannels());
         if (android.app.Flags.modesUi()) {
             verify(mMockZenModeHelper, never()).updateHasPriorityChannels(any(), anyBoolean());
         } else {
@@ -2748,7 +2748,7 @@
         channel2.setBypassDnd(true);
         mHelper.createNotificationChannel(PKG_N_MR1, uid, channel2, true, true,
                 uid, false);
-        assertTrue(mHelper.areChannelsBypassingDnd());
+        assertTrue(mHelper.hasPriorityChannels());
         if (android.app.Flags.modesUi()) {
             verify(mMockZenModeHelper, times(1)).updateHasPriorityChannels(eq(UserHandle.CURRENT),
                     eq(true));
@@ -2760,7 +2760,7 @@
 
         // delete channels
         mHelper.deleteNotificationChannel(PKG_N_MR1, uid, channel.getId(), uid, false);
-        assertTrue(mHelper.areChannelsBypassingDnd()); // channel2 can still bypass DND
+        assertTrue(mHelper.hasPriorityChannels()); // channel2 can still bypass DND
         if (android.app.Flags.modesUi()) {
             verify(mMockZenModeHelper, never()).updateHasPriorityChannels(any(), anyBoolean());
         } else {
@@ -2770,7 +2770,7 @@
         resetZenModeHelper();
 
         mHelper.deleteNotificationChannel(PKG_N_MR1, uid, channel2.getId(), uid, false);
-        assertFalse(mHelper.areChannelsBypassingDnd());
+        assertFalse(mHelper.hasPriorityChannels());
         if (android.app.Flags.modesUi()) {
             verify(mMockZenModeHelper, times(1)).updateHasPriorityChannels(eq(UserHandle.CURRENT),
                     eq(false));
@@ -2792,7 +2792,7 @@
         NotificationChannel channel = new NotificationChannel("id1", "name1", IMPORTANCE_LOW);
         mHelper.createNotificationChannel(PKG_N_MR1, uid, channel, true, false,
                 uid, false);
-        assertFalse(mHelper.areChannelsBypassingDnd());
+        assertFalse(mHelper.hasPriorityChannels());
         if (android.app.Flags.modesUi()) {
             verify(mMockZenModeHelper, never()).updateHasPriorityChannels(any(), anyBoolean());
         } else {
@@ -2807,7 +2807,7 @@
         mHelper.createNotificationChannel(PKG_N_MR1, uid, update, true, true,
                 uid, false);
 
-        assertTrue(mHelper.areChannelsBypassingDnd());
+        assertTrue(mHelper.hasPriorityChannels());
         if (android.app.Flags.modesUi()) {
             verify(mMockZenModeHelper, times(1)).updateHasPriorityChannels(eq(UserHandle.CURRENT),
                     eq(true));
@@ -2829,7 +2829,7 @@
         NotificationChannel channel = new NotificationChannel("id1", "name1", IMPORTANCE_LOW);
         mHelper.createNotificationChannel(PKG_N_MR1, uid, channel, true, false,
                 uid, false);
-        assertFalse(mHelper.areChannelsBypassingDnd());
+        assertFalse(mHelper.hasPriorityChannels());
         if (android.app.Flags.modesUi()) {
             verify(mMockZenModeHelper, never()).updateHasPriorityChannels(any(), anyBoolean());
         } else {
@@ -2844,7 +2844,7 @@
         channel2.setBypassDnd(true);
         mHelper.createNotificationChannel(PKG_N_MR1, uid, channel2, true, true,
                 uid, false);
-        assertTrue(mHelper.areChannelsBypassingDnd());
+        assertTrue(mHelper.hasPriorityChannels());
         if (android.app.Flags.modesUi()) {
             verify(mMockZenModeHelper, times(1)).updateHasPriorityChannels(eq(UserHandle.CURRENT),
                     eq(true));
@@ -2856,7 +2856,7 @@
 
         // delete channels
         mHelper.deleteNotificationChannel(PKG_N_MR1, uid, channel.getId(), uid, false);
-        assertTrue(mHelper.areChannelsBypassingDnd()); // channel2 can still bypass DND
+        assertTrue(mHelper.hasPriorityChannels()); // channel2 can still bypass DND
         if (android.app.Flags.modesUi()) {
             verify(mMockZenModeHelper, never()).updateHasPriorityChannels(any(), anyBoolean());
         } else {
@@ -2866,7 +2866,7 @@
         resetZenModeHelper();
 
         mHelper.deleteNotificationChannel(PKG_N_MR1, uid, channel2.getId(), uid, false);
-        assertFalse(mHelper.areChannelsBypassingDnd());
+        assertFalse(mHelper.hasPriorityChannels());
         if (android.app.Flags.modesUi()) {
             verify(mMockZenModeHelper, times(1)).updateHasPriorityChannels(eq(UserHandle.CURRENT),
                     eq(false));
@@ -2884,9 +2884,9 @@
 
         // start in a 'allowed to bypass dnd state'
         mTestNotificationPolicy = new NotificationManager.Policy(0, 0, 0, 0,
-                NotificationManager.Policy.STATE_CHANNELS_BYPASSING_DND, 0);
+                NotificationManager.Policy.STATE_HAS_PRIORITY_CHANNELS, 0);
         when(mMockZenModeHelper.getNotificationPolicy(any())).thenReturn(mTestNotificationPolicy);
-        mHelper.syncChannelsBypassingDnd();
+        mHelper.syncHasPriorityChannels();
 
         // create notification channel that can bypass dnd, but app is blocked
         // expected result: areChannelsBypassingDnd = false
@@ -2899,7 +2899,7 @@
         channel2.setBypassDnd(true);
         mHelper.createNotificationChannel(PKG_N_MR1, uid, channel2, true, true,
                 uid, false);
-        assertFalse(mHelper.areChannelsBypassingDnd());
+        assertFalse(mHelper.hasPriorityChannels());
         if (android.app.Flags.modesUi()) {
             verify(mMockZenModeHelper, times(1)).updateHasPriorityChannels(eq(UserHandle.CURRENT),
                     eq(false));
@@ -2917,9 +2917,9 @@
 
         // start in a 'allowed to bypass dnd state'
         mTestNotificationPolicy = new NotificationManager.Policy(0, 0, 0, 0,
-                NotificationManager.Policy.STATE_CHANNELS_BYPASSING_DND, 0);
+                NotificationManager.Policy.STATE_HAS_PRIORITY_CHANNELS, 0);
         when(mMockZenModeHelper.getNotificationPolicy(any())).thenReturn(mTestNotificationPolicy);
-        mHelper.syncChannelsBypassingDnd();
+        mHelper.syncHasPriorityChannels();
 
         // create notification channel that can bypass dnd, but app is blocked
         // expected result: areChannelsBypassingDnd = false
@@ -2927,7 +2927,7 @@
         channel2.setBypassDnd(true);
         mHelper.createNotificationChannel(PKG_N_MR1, uid, channel2, true, true,
                 uid, false);
-        assertFalse(mHelper.areChannelsBypassingDnd());
+        assertFalse(mHelper.hasPriorityChannels());
         if (android.app.Flags.modesUi()) {
             verify(mMockZenModeHelper, times(1)).updateHasPriorityChannels(eq(UserHandle.CURRENT),
                     eq(false));
@@ -2945,9 +2945,9 @@
 
         // start in a 'allowed to bypass dnd state'
         mTestNotificationPolicy = new NotificationManager.Policy(0, 0, 0, 0,
-                NotificationManager.Policy.STATE_CHANNELS_BYPASSING_DND, 0);
+                NotificationManager.Policy.STATE_HAS_PRIORITY_CHANNELS, 0);
         when(mMockZenModeHelper.getNotificationPolicy(any())).thenReturn(mTestNotificationPolicy);
-        mHelper.syncChannelsBypassingDnd();
+        mHelper.syncHasPriorityChannels();
 
         // create notification channel that can bypass dnd, but app is blocked
         // expected result: areChannelsBypassingDnd = false
@@ -2955,7 +2955,7 @@
         channel2.setBypassDnd(true);
         mHelper.createNotificationChannel(PKG_N_MR1, uid, channel2, true, true,
                 uid, false);
-        assertFalse(mHelper.areChannelsBypassingDnd());
+        assertFalse(mHelper.hasPriorityChannels());
         if (android.app.Flags.modesUi()) {
             verify(mMockZenModeHelper, times(1)).updateHasPriorityChannels(eq(UserHandle.CURRENT),
                     eq(false));
@@ -2977,7 +2977,7 @@
         NotificationChannel channel = new NotificationChannel("id1", "name1", IMPORTANCE_LOW);
         mHelper.createNotificationChannel(PKG_N_MR1, uid, channel, true, false,
                 uid, false);
-        assertFalse(mHelper.areChannelsBypassingDnd());
+        assertFalse(mHelper.hasPriorityChannels());
         if (android.app.Flags.modesUi()) {
             verify(mMockZenModeHelper, never()).updateHasPriorityChannels(any(), anyBoolean());
         } else {
@@ -2990,7 +2990,7 @@
         // expected result: areChannelsBypassingDnd = true
         channel.setBypassDnd(true);
         mHelper.updateNotificationChannel(PKG_N_MR1, uid, channel, true, SYSTEM_UID, true);
-        assertTrue(mHelper.areChannelsBypassingDnd());
+        assertTrue(mHelper.hasPriorityChannels());
         if (android.app.Flags.modesUi()) {
             verify(mMockZenModeHelper, times(1)).updateHasPriorityChannels(eq(UserHandle.CURRENT),
                     eq(true));
@@ -3004,7 +3004,7 @@
         // expected result: areChannelsBypassingDnd = false
         channel.setBypassDnd(false);
         mHelper.updateNotificationChannel(PKG_N_MR1, uid, channel, true, SYSTEM_UID, true);
-        assertFalse(mHelper.areChannelsBypassingDnd());
+        assertFalse(mHelper.hasPriorityChannels());
         if (android.app.Flags.modesUi()) {
             verify(mMockZenModeHelper, times(1)).updateHasPriorityChannels(eq(UserHandle.CURRENT),
                     eq(false));
@@ -3020,10 +3020,10 @@
         // start notification policy off with mAreChannelsBypassingDnd = true, but
         // RankingHelper should change to false
         mTestNotificationPolicy = new NotificationManager.Policy(0, 0, 0, 0,
-                NotificationManager.Policy.STATE_CHANNELS_BYPASSING_DND, 0);
+                NotificationManager.Policy.STATE_HAS_PRIORITY_CHANNELS, 0);
         when(mMockZenModeHelper.getNotificationPolicy(any())).thenReturn(mTestNotificationPolicy);
-        mHelper.syncChannelsBypassingDnd();
-        assertFalse(mHelper.areChannelsBypassingDnd());
+        mHelper.syncHasPriorityChannels();
+        assertFalse(mHelper.hasPriorityChannels());
         if (android.app.Flags.modesUi()) {
             verify(mMockZenModeHelper, times(1)).updateHasPriorityChannels(eq(UserHandle.CURRENT),
                     eq(false));
@@ -3039,7 +3039,7 @@
         // start notification policy off with mAreChannelsBypassingDnd = false
         mTestNotificationPolicy = new NotificationManager.Policy(0, 0, 0, 0, 0, 0);
         when(mMockZenModeHelper.getNotificationPolicy(any())).thenReturn(mTestNotificationPolicy);
-        assertFalse(mHelper.areChannelsBypassingDnd());
+        assertFalse(mHelper.hasPriorityChannels());
         if (android.app.Flags.modesUi()) {
             verify(mMockZenModeHelper, never()).updateHasPriorityChannels(any(), anyBoolean());
         } else {
@@ -3050,7 +3050,7 @@
     }
 
     @Test
-    public void syncChannelsBypassingDnd_includesProfilesOfCurrentUser() throws Exception {
+    public void syncHasPriorityChannels_includesProfilesOfCurrentUser() throws Exception {
         when(mUserProfiles.getCurrentProfileIds()).thenReturn(IntArray.wrap(new int[] {0, 10}));
         when(mPermissionHelper.hasPermission(anyInt())).thenReturn(true);
         ApplicationInfo appInfo = new ApplicationInfo();
@@ -3067,13 +3067,13 @@
         mHelper.createNotificationChannel("com.example", UserHandle.getUid(10, 444), withBypass,
                 false, false, Process.SYSTEM_UID, true);
 
-        mHelper.syncChannelsBypassingDnd();
+        mHelper.syncHasPriorityChannels();
 
-        assertThat(mHelper.areChannelsBypassingDnd()).isTrue();
+        assertThat(mHelper.hasPriorityChannels()).isTrue();
     }
 
     @Test
-    public void syncChannelsBypassingDnd_excludesOtherUsers() throws Exception {
+    public void syncHasPriorityChannels_excludesOtherUsers() throws Exception {
         when(mUserProfiles.getCurrentProfileIds()).thenReturn(IntArray.wrap(new int[] {0}));
         when(mPermissionHelper.hasPermission(anyInt())).thenReturn(true);
         ApplicationInfo appInfo = new ApplicationInfo();
@@ -3090,9 +3090,70 @@
         mHelper.createNotificationChannel("com.example", UserHandle.getUid(10, 444), withBypass,
                 false, false, Process.SYSTEM_UID, true);
 
-        mHelper.syncChannelsBypassingDnd();
+        mHelper.syncHasPriorityChannels();
 
-        assertThat(mHelper.areChannelsBypassingDnd()).isFalse();
+        assertThat(mHelper.hasPriorityChannels()).isFalse();
+    }
+
+    @Test
+    public void getPackagesWithAnyChannels_noChannels() {
+        assertThat(mHelper.getPackagesWithAnyChannels(UserHandle.getUserId(UID_O))).isEmpty();
+    }
+
+    @Test
+    public void getPackagesWithAnyChannels_someChannels() {
+        // 2 channels under PKG_N_MR1, 1 under PKG_O
+        NotificationChannel channel1 = new NotificationChannel("1", "something",
+                IMPORTANCE_DEFAULT);
+        mHelper.createNotificationChannel(PKG_N_MR1, UID_N_MR1, channel1, true, false, UID_N_MR1,
+                false);
+        NotificationChannel channel2 = new NotificationChannel("2", "another", IMPORTANCE_DEFAULT);
+        mHelper.createNotificationChannel(PKG_N_MR1, UID_N_MR1, channel2, true, false, UID_N_MR1,
+                false);
+
+        NotificationChannel other = new NotificationChannel("3", "still another",
+                IMPORTANCE_DEFAULT);
+        mHelper.createNotificationChannel(PKG_O, UID_O, other, true, false, UID_O, false);
+
+        assertThat(mHelper.getPackagesWithAnyChannels(USER.getIdentifier())).containsExactly(
+                PKG_N_MR1, PKG_O);
+    }
+
+    @Test
+    public void getPackagesWithAnyChannels_onlyDeleted() {
+        NotificationChannel channel1 = new NotificationChannel("1", "something",
+                IMPORTANCE_DEFAULT);
+        channel1.setDeleted(true);
+        mHelper.createNotificationChannel(PKG_O, UID_O, channel1, true, false, UID_O,
+                false);
+        NotificationChannel channel2 = new NotificationChannel("2", "another", IMPORTANCE_DEFAULT);
+        channel2.setDeleted(true);
+        mHelper.createNotificationChannel(PKG_O, UID_O, channel2, true, false, UID_O,
+                false);
+
+        assertThat(mHelper.getPackagesWithAnyChannels(UserHandle.getUserId(UID_O))).isEmpty();
+    }
+
+    @Test
+    public void getPackagesWithAnyChannels_distinguishesUsers() throws Exception {
+        // Set a package up for both users 0 and 10
+        String pkgName = "test.package";
+        int uid0 = UserHandle.getUid(0, 1234);
+        int uid10 = UserHandle.getUid(10, 1234);
+        setUpPackageWithUid(pkgName, uid0);
+        setUpPackageWithUid(pkgName, uid10);
+
+        // but only user 10 has channels
+        NotificationChannel channel1 = new NotificationChannel("1", "something",
+                IMPORTANCE_DEFAULT);
+        mHelper.createNotificationChannel(pkgName, uid10, channel1, true, false, uid10,
+                false);
+        NotificationChannel channel2 = new NotificationChannel("2", "another", IMPORTANCE_DEFAULT);
+        mHelper.createNotificationChannel(pkgName, uid10, channel2, true, false, uid10,
+                false);
+
+        assertThat(mHelper.getPackagesWithAnyChannels(0)).isEmpty();
+        assertThat(mHelper.getPackagesWithAnyChannels(10)).containsExactly(pkgName);
     }
 
     @Test
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 f900346..ec428d5 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
@@ -17,9 +17,10 @@
 
 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;
@@ -29,7 +30,6 @@
 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;
@@ -40,7 +40,6 @@
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.Signature;
-import android.media.AudioAttributes;
 import android.net.Uri;
 import android.os.Build;
 import android.os.UserHandle;
@@ -67,7 +66,6 @@
 
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.List;
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
@@ -154,7 +152,7 @@
                 .thenReturn(SOUND_URI);
 
         mTestNotificationPolicy = new NotificationManager.Policy(0, 0, 0, 0,
-                NotificationManager.Policy.STATE_CHANNELS_BYPASSING_DND, 0);
+                NotificationManager.Policy.STATE_HAS_PRIORITY_CHANNELS, 0);
         when(mMockZenModeHelper.getNotificationPolicy(any())).thenReturn(mTestNotificationPolicy);
         mHelper = new RankingHelper(getContext(), mHandler, mConfig, mMockZenModeHelper,
                 mUsageStats, new String[] {ImportanceExtractor.class.getName()},
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ZenAdaptersTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ZenAdaptersTest.java
index 75552bc..f381343 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ZenAdaptersTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ZenAdaptersTest.java
@@ -20,10 +20,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import android.app.Flags;
 import android.app.NotificationManager.Policy;
-import android.platform.test.annotations.DisableFlags;
-import android.platform.test.annotations.EnableFlags;
 import android.platform.test.flag.junit.SetFlagsRule;
 import android.service.notification.ZenPolicy;
 
@@ -137,8 +134,7 @@
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_MODES_API)
-    public void notificationPolicyToZenPolicy_modesApi_priorityChannels() {
+    public void notificationPolicyToZenPolicy_priorityChannels() {
         Policy policy = new Policy(0, 0, 0, 0,
                 Policy.policyState(false, true), 0);
 
@@ -151,20 +147,4 @@
         assertThat(zenPolicyNotAllowed.getPriorityChannelsAllowed()).isEqualTo(
                 ZenPolicy.STATE_DISALLOW);
     }
-
-    @Test
-    @DisableFlags(Flags.FLAG_MODES_API)
-    public void notificationPolicyToZenPolicy_noModesApi_priorityChannelsUnset() {
-        Policy policy = new Policy(0, 0, 0, 0,
-                Policy.policyState(false, true), 0);
-
-        ZenPolicy zenPolicy = notificationPolicyToZenPolicy(policy);
-        assertThat(zenPolicy.getPriorityChannelsAllowed()).isEqualTo(ZenPolicy.STATE_UNSET);
-
-        Policy notAllowed = new Policy(0, 0, 0, 0,
-                Policy.policyState(false, false), 0);
-        ZenPolicy zenPolicyNotAllowed = notificationPolicyToZenPolicy(notAllowed);
-        assertThat(zenPolicyNotAllowed.getPriorityChannelsAllowed()).isEqualTo(
-                ZenPolicy.STATE_UNSET);
-    }
 }
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ZenDeviceEffectsTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ZenDeviceEffectsTest.java
index af911e8..9a2b748 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ZenDeviceEffectsTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ZenDeviceEffectsTest.java
@@ -20,7 +20,6 @@
 
 import static org.junit.Assert.assertThrows;
 
-import android.app.Flags;
 import android.os.Parcel;
 import android.platform.test.flag.junit.SetFlagsRule;
 import android.service.notification.ZenDeviceEffects;
@@ -31,7 +30,6 @@
 
 import com.google.common.collect.ImmutableSet;
 
-import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -42,11 +40,6 @@
     @Rule
     public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
 
-    @Before
-    public final void setUp() {
-        mSetFlagsRule.enableFlags(Flags.FLAG_MODES_API);
-    }
-
     @Test
     public void builder() {
         ZenDeviceEffects deviceEffects =
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeConfigTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeConfigTest.java
index b42a6a5..4c1544f 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeConfigTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeConfigTest.java
@@ -174,7 +174,7 @@
         }
         assertTrue(ZenModeConfig.areAllPriorityOnlyRingerSoundsMuted(config));
 
-        config.areChannelsBypassingDnd = true;
+        config.hasPriorityChannels = true;
         assertTrue(ZenModeConfig.areAllPriorityOnlyRingerSoundsMuted(config));
 
         if (Flags.modesUi()) {
@@ -187,7 +187,7 @@
 
         assertFalse(ZenModeConfig.areAllPriorityOnlyRingerSoundsMuted(config));
 
-        config.areChannelsBypassingDnd = false;
+        config.hasPriorityChannels = false;
         if (Flags.modesUi()) {
             config.manualRule.zenPolicy = new ZenPolicy.Builder(config.manualRule.zenPolicy)
                     .allowPriorityChannels(false)
@@ -417,7 +417,7 @@
         assertTrue(ZenModeConfig.areAllPriorityOnlyRingerSoundsMuted(config));
         assertTrue(ZenModeConfig.areAllZenBehaviorSoundsMuted(config));
 
-        config.areChannelsBypassingDnd = true;
+        config.hasPriorityChannels = true;
         if (Flags.modesUi()) {
             config.manualRule.zenPolicy = new ZenPolicy.Builder(config.manualRule.zenPolicy)
                     .allowPriorityChannels(true)
@@ -429,7 +429,7 @@
         assertFalse(ZenModeConfig.areAllPriorityOnlyRingerSoundsMuted(config));
         assertFalse(ZenModeConfig.areAllZenBehaviorSoundsMuted(config));
 
-        config.areChannelsBypassingDnd = false;
+        config.hasPriorityChannels = false;
         if (Flags.modesUi()) {
             config.manualRule.zenPolicy = new ZenPolicy.Builder(config.manualRule.zenPolicy)
                     .allowPriorityChannels(false)
@@ -548,7 +548,6 @@
         rule.creationTime = 123;
         rule.id = "id";
         rule.zenMode = INTERRUPTION_FILTER;
-        rule.modified = true;
         rule.name = NAME;
         rule.setConditionOverride(OVERRIDE_DEACTIVATE);
         rule.pkg = OWNER.getPackageName();
@@ -585,7 +584,6 @@
         assertEquals(rule.condition, ruleActual.condition);
         assertEquals(rule.enabled, ruleActual.enabled);
         assertEquals(rule.creationTime, ruleActual.creationTime);
-        assertEquals(rule.modified, ruleActual.modified);
         assertEquals(rule.conditionId, ruleActual.conditionId);
         assertEquals(rule.name, ruleActual.name);
         assertEquals(rule.zenMode, ruleActual.zenMode);
@@ -620,7 +618,6 @@
         rule.creationTime = 123;
         rule.id = "id";
         rule.zenMode = INTERRUPTION_FILTER;
-        rule.modified = true;
         rule.name = NAME;
         rule.setConditionOverride(OVERRIDE_DEACTIVATE);
         rule.pkg = OWNER.getPackageName();
@@ -651,7 +648,6 @@
         assertEquals(rule.condition, parceled.condition);
         assertEquals(rule.enabled, parceled.enabled);
         assertEquals(rule.creationTime, parceled.creationTime);
-        assertEquals(rule.modified, parceled.modified);
         assertEquals(rule.conditionId, parceled.conditionId);
         assertEquals(rule.name, parceled.name);
         assertEquals(rule.zenMode, parceled.zenMode);
@@ -685,7 +681,6 @@
         rule.creationTime = 123;
         rule.id = "id";
         rule.zenMode = Settings.Global.ZEN_MODE_ALARMS;
-        rule.modified = true;
         rule.name = "name";
         rule.snoozing = true;
         rule.pkg = "b";
@@ -705,7 +700,6 @@
         assertEquals(rule.condition, fromXml.condition);
         assertEquals(rule.enabled, fromXml.enabled);
         assertEquals(rule.creationTime, fromXml.creationTime);
-        assertEquals(rule.modified, fromXml.modified);
         assertEquals(rule.conditionId, fromXml.conditionId);
         assertEquals(rule.name, fromXml.name);
         assertEquals(rule.zenMode, fromXml.zenMode);
@@ -721,7 +715,6 @@
         rule.enabled = ENABLED;
         rule.id = "id";
         rule.zenMode = INTERRUPTION_FILTER;
-        rule.modified = true;
         rule.name = NAME;
         rule.setConditionOverride(OVERRIDE_DEACTIVATE);
         rule.pkg = OWNER.getPackageName();
@@ -770,7 +763,6 @@
         assertEquals(rule.condition, fromXml.condition);
         assertEquals(rule.enabled, fromXml.enabled);
         assertEquals(rule.creationTime, fromXml.creationTime);
-        assertEquals(rule.modified, fromXml.modified);
         assertEquals(rule.conditionId, fromXml.conditionId);
         assertEquals(rule.name, fromXml.name);
         assertEquals(rule.zenMode, fromXml.zenMode);
@@ -1259,7 +1251,6 @@
         rule.creationTime = 123;
         rule.id = "id";
         rule.zenMode = ZEN_MODE_IMPORTANT_INTERRUPTIONS;
-        rule.modified = true;
         rule.name = "name";
         rule.pkg = "b";
         config.automaticRules.put("key", rule);
@@ -1348,7 +1339,7 @@
             config.setSuppressedVisualEffects(0);
             config.setAllowPriorityChannels(false);
         }
-        config.areChannelsBypassingDnd = false;
+        config.hasPriorityChannels = false;
 
         return config;
     }
@@ -1383,7 +1374,7 @@
             config.setSuppressedVisualEffects(0);
             config.setAllowPriorityChannels(true);
         }
-        config.areChannelsBypassingDnd = false;
+        config.hasPriorityChannels = false;
         return config;
     }
 
@@ -1410,7 +1401,7 @@
             config.setAllowConversationsFrom(CONVERSATION_SENDERS_NONE);
             config.setSuppressedVisualEffects(0);
         }
-        config.areChannelsBypassingDnd = false;
+        config.hasPriorityChannels = false;
         return config;
     }
 
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeDiffTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeDiffTest.java
index b138c72..8a5f80cb3 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeDiffTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeDiffTest.java
@@ -16,7 +16,6 @@
 
 package com.android.server.notification;
 
-import static android.app.Flags.FLAG_MODES_API;
 import static android.app.Flags.FLAG_MODES_UI;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -64,7 +63,6 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Optional;
@@ -78,20 +76,14 @@
     // version is not included in the diff; manual & automatic rules have special handling;
     // deleted rules are not included in the diff.
     public static final Set<String> ZEN_MODE_CONFIG_EXEMPT_FIELDS =
-            android.app.Flags.modesApi()
-                    ? Set.of("version", "manualRule", "automaticRules", "deletedRules")
-                    : Set.of("version", "manualRule", "automaticRules");
-
-    // allowPriorityChannels is flagged by android.app.modes_api
-    public static final Set<String> ZEN_MODE_CONFIG_FLAGGED_FIELDS =
-            Set.of("allowPriorityChannels");
+            Set.of("version", "manualRule", "automaticRules", "deletedRules");
 
     @Rule
     public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
 
     @Parameters(name = "{0}")
     public static List<FlagsParameterization> getParams() {
-        return FlagsParameterization.progressionOf(FLAG_MODES_API, FLAG_MODES_UI);
+        return FlagsParameterization.progressionOf(FLAG_MODES_UI);
     }
 
     public ZenModeDiffTest(FlagsParameterization flags) {
@@ -147,7 +139,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void testRuleDiff_toStringNoChangeAddRemove() throws Exception {
         // Start with two identical rules
         ZenModeConfig.ZenRule r1 = makeRule();
@@ -164,7 +156,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void testRuleDiff_toString() throws Exception {
         // Start with two identical rules
         ZenModeConfig.ZenRule r1 = makeRule();
@@ -218,7 +210,6 @@
                 + "mPriorityCalls:2->1, "
                 + "mConversationSenders:2->1, "
                 + "mAllowChannels:2->1}, "
-                + "modified:true->false, "
                 + "pkg:string1->string2, "
                 + "zenDeviceEffects:ZenDeviceEffectsDiff{"
                 + "mGrayscale:true->false, "
@@ -241,7 +232,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void testRuleDiff_toStringNullStartPolicy() throws Exception {
         // Start with two identical rules
         ZenModeConfig.ZenRule r1 = makeRule();
@@ -278,7 +269,6 @@
                 + "creationTime:200->100, "
                 + "enabler:string1->string2, "
                 + "zenPolicy:ZenPolicyDiff{added}, "
-                + "modified:true->false, "
                 + "pkg:string1->string2, "
                 + "zenDeviceEffects:ZenDeviceEffectsDiff{added}, "
                 + "triggerDescription:string1->string2, "
@@ -487,14 +477,7 @@
                 Set.of("userModifiedFields", "zenPolicyUserModifiedFields",
                         "zenDeviceEffectsUserModifiedFields", "deletionInstant", "disabledOrigin"));
         // Flagged fields are only compared if their flag is on.
-        if (!Flags.modesApi()) {
-            exemptFields.addAll(
-                    Set.of(RuleDiff.FIELD_TYPE, RuleDiff.FIELD_TRIGGER_DESCRIPTION,
-                            RuleDiff.FIELD_ICON_RES, RuleDiff.FIELD_ALLOW_MANUAL,
-                            RuleDiff.FIELD_ZEN_DEVICE_EFFECTS,
-                            RuleDiff.FIELD_LEGACY_SUPPRESSED_EFFECTS));
-        }
-        if (Flags.modesApi() && Flags.modesUi()) {
+        if (Flags.modesUi()) {
             exemptFields.add(RuleDiff.FIELD_SNOOZING); // Obsolete.
         } else {
             exemptFields.add(RuleDiff.FIELD_CONDITION_OVERRIDE);
@@ -530,35 +513,6 @@
         ArrayMap<String, Object> expectedFrom = new ArrayMap<>();
         ArrayMap<String, Object> expectedTo = new ArrayMap<>();
         List<Field> fieldsForDiff = getFieldsForDiffCheck(
-                ZenModeConfig.class, getConfigExemptAndFlaggedFields(), false);
-        generateFieldDiffs(c1, c2, fieldsForDiff, expectedFrom, expectedTo);
-
-        ZenModeDiff.ConfigDiff d = new ZenModeDiff.ConfigDiff(c1, c2);
-        assertTrue(d.hasDiff());
-
-        // Now diff them and check that each of the fields has a diff
-        for (Field f : fieldsForDiff) {
-            String name = f.getName();
-            assertNotNull("diff not found for field: " + name, d.getDiffForField(name));
-            assertTrue(d.getDiffForField(name).hasDiff());
-            assertTrue("unexpected field: " + name, expectedFrom.containsKey(name));
-            assertTrue("unexpected field: " + name, expectedTo.containsKey(name));
-            assertEquals(expectedFrom.get(name), d.getDiffForField(name).from());
-            assertEquals(expectedTo.get(name), d.getDiffForField(name).to());
-        }
-    }
-
-    @Test
-    @EnableFlags(FLAG_MODES_API)
-    public void testConfigDiff_fieldDiffs_flagOn() throws Exception {
-        // these two start the same
-        ZenModeConfig c1 = new ZenModeConfig();
-        ZenModeConfig c2 = new ZenModeConfig();
-
-        // maps mapping field name -> expected output value as we set diffs
-        ArrayMap<String, Object> expectedFrom = new ArrayMap<>();
-        ArrayMap<String, Object> expectedTo = new ArrayMap<>();
-        List<Field> fieldsForDiff = getFieldsForDiffCheck(
                 ZenModeConfig.class, ZEN_MODE_CONFIG_EXEMPT_FIELDS, false);
         generateFieldDiffs(c1, c2, fieldsForDiff, expectedFrom, expectedTo);
 
@@ -656,14 +610,6 @@
         assertEquals("different", automaticDiffs.get("ruleId").getDiffForField("pkg").to());
     }
 
-    // Helper method that merges the base exempt fields with fields that are flagged
-    private Set getConfigExemptAndFlaggedFields() {
-        Set merged = new HashSet();
-        merged.addAll(ZEN_MODE_CONFIG_EXEMPT_FIELDS);
-        merged.addAll(ZEN_MODE_CONFIG_FLAGGED_FIELDS);
-        return merged;
-    }
-
     // Helper methods for working with configs, policies, rules
     // Just makes a zen rule with fields filled in
     private ZenModeConfig.ZenRule makeRule() {
@@ -676,20 +622,17 @@
         rule.creationTime = 123;
         rule.id = "ruleId";
         rule.zenMode = Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS;
-        rule.modified = false;
         rule.name = "name";
         rule.setConditionOverride(ZenModeConfig.ZenRule.OVERRIDE_DEACTIVATE);
         rule.pkg = "a";
-        if (android.app.Flags.modesApi()) {
-            rule.allowManualInvocation = true;
-            rule.type = AutomaticZenRule.TYPE_SCHEDULE_TIME;
-            rule.iconResName = "res";
-            rule.triggerDescription = "At night";
-            rule.zenDeviceEffects = new ZenDeviceEffects.Builder()
-                    .setShouldDimWallpaper(true)
-                    .build();
-            rule.userModifiedFields = AutomaticZenRule.FIELD_NAME;
-        }
+        rule.allowManualInvocation = true;
+        rule.type = AutomaticZenRule.TYPE_SCHEDULE_TIME;
+        rule.iconResName = "res";
+        rule.triggerDescription = "At night";
+        rule.zenDeviceEffects = new ZenDeviceEffects.Builder()
+                .setShouldDimWallpaper(true)
+                .build();
+        rule.userModifiedFields = AutomaticZenRule.FIELD_NAME;
         return rule;
     }
 
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeFilteringTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeFilteringTest.java
index a49f5a8..2f0b3ec 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeFilteringTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeFilteringTest.java
@@ -37,7 +37,6 @@
 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.Policy;
@@ -492,8 +491,6 @@
 
     @Test
     public void testAllowChannels_priorityPackage() {
-        mSetFlagsRule.enableFlags(Flags.FLAG_MODES_API);
-
         // Notification with package priority = PRIORITY_MAX (assigned to indicate canBypassDnd)
         NotificationRecord r = getNotificationRecord();
         r.setPackagePriority(Notification.PRIORITY_MAX);
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 31b9cf72..4d2f105 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java
@@ -23,7 +23,6 @@
 import static android.app.AutomaticZenRule.TYPE_THEATER;
 import static android.app.AutomaticZenRule.TYPE_UNKNOWN;
 import static android.app.Flags.FLAG_BACKUP_RESTORE_LOGGING;
-import static android.app.Flags.FLAG_MODES_API;
 import static android.app.Flags.FLAG_MODES_MULTIUSER;
 import static android.app.Flags.FLAG_MODES_UI;
 import static android.app.NotificationManager.AUTOMATIC_RULE_STATUS_ACTIVATED;
@@ -85,6 +84,7 @@
 import static android.service.notification.ZenPolicy.VISUAL_EFFECT_PEEK;
 
 import static com.android.internal.config.sysui.SystemUiSystemPropertiesFlags.NotificationFlags.LOG_DND_STATE_EVENTS;
+import static com.android.os.dnd.DNDProtoEnums.CONV_IMPORTANT;
 import static com.android.os.dnd.DNDProtoEnums.PEOPLE_STARRED;
 import static com.android.os.dnd.DNDProtoEnums.ROOT_CONFIG;
 import static com.android.os.dnd.DNDProtoEnums.STATE_ALLOW;
@@ -224,6 +224,7 @@
 import java.util.Calendar;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
@@ -713,7 +714,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void testTotalSilence_consolidatedPolicyDisallowsAll() {
         // Start with zen mode off just to make sure global/manual mode isn't doing anything.
         mZenModeHelper.mZenMode = ZEN_MODE_OFF;
@@ -746,7 +746,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void testAlarmsOnly_consolidatedPolicyOnlyAllowsAlarmsAndMedia() {
         // Start with zen mode off just to make sure global/manual mode isn't doing anything.
         mZenModeHelper.mZenMode = ZEN_MODE_OFF;
@@ -1136,8 +1135,7 @@
     @Test
     public void testProto() throws InvalidProtocolBufferException {
         mZenModeHelper.setManualZenMode(UserHandle.CURRENT, ZEN_MODE_IMPORTANT_INTERRUPTIONS, null,
-                Flags.modesApi() ? ORIGIN_USER_IN_SYSTEMUI : ORIGIN_SYSTEM, null,
-                "test", CUSTOM_PKG_UID);
+                ORIGIN_USER_IN_SYSTEMUI, null, "test", CUSTOM_PKG_UID);
 
         mZenModeHelper.mConfig.automaticRules = new ArrayMap<>(); // no automatic rules
 
@@ -1262,7 +1260,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void testProtoWithAutoRuleCustomPolicy() throws Exception {
         setupZenConfig();
         // clear any automatic rules just to make sure
@@ -1304,7 +1301,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void testProtoWithAutoRuleWithModifiedFields() throws Exception {
         setupZenConfig();
         mZenModeHelper.mConfig.automaticRules = new ArrayMap<>();
@@ -2005,7 +2001,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void testReadXml_onModesApi_noUpgrade() throws Exception {
         // When reading XML for something that is already on the modes API system, make sure no
         // rules' policies get changed.
@@ -2053,7 +2048,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void testReadXml_upgradeToModesApi_makesCustomPolicies() throws Exception {
         // When reading in an XML file written from a pre-modes-API version, confirm that we create
         // a custom policy matching the global config for any automatic rule with no specified
@@ -2105,7 +2099,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void testReadXml_upgradeToModesApi_fillsInCustomPolicies() throws Exception {
         // When reading in an XML file written from a pre-modes-API version, confirm that for an
         // underspecified ZenPolicy, we fill in all of the gaps with things from the global config
@@ -2165,7 +2158,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void testReadXml_upgradeToModesApi_existingDefaultRulesGetCustomPolicy()
             throws Exception {
         setupZenConfig();
@@ -2227,7 +2219,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void testReadXml_upgradeToModesUi_resetsImplicitRuleIcon() throws Exception {
         setupZenConfig();
         mZenModeHelper.mConfig.automaticRules.clear();
@@ -2247,7 +2239,7 @@
         anotherRule.type = TYPE_IMMERSIVE;
         mZenModeHelper.mConfig.automaticRules.put(anotherRule.id, anotherRule);
 
-        // Write with pre-modes-ui = (modes_api) version, then re-read.
+        // Write with pre-modes-ui version, then re-read.
         ByteArrayOutputStream baos = writeXmlAndPurge(ZenModeConfig.XML_VERSION_MODES_API);
         TypedXmlPullParser parser = Xml.newFastPullParser();
         parser.setInput(new BufferedInputStream(
@@ -2265,7 +2257,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void testReadXml_onModesUi_implicitRulesUntouched() throws Exception {
         setupZenConfig();
         mZenModeHelper.mConfig.automaticRules.clear();
@@ -2342,7 +2334,7 @@
 
         // shouldn't update rule that's been modified
         ZenModeConfig.ZenRule updatedDefaultRule = new ZenModeConfig.ZenRule();
-        updatedDefaultRule.modified = true;
+        updatedDefaultRule.userModifiedFields = AutomaticZenRule.FIELD_NAME;
         updatedDefaultRule.enabled = false;
         updatedDefaultRule.creationTime = 0;
         updatedDefaultRule.id = SCHEDULE_DEFAULT_RULE_ID;
@@ -2370,8 +2362,8 @@
         // will update rule that is not enabled and modified
         ZenModeConfig.ZenRule customDefaultRule = new ZenModeConfig.ZenRule();
         customDefaultRule.pkg = SystemZenRules.PACKAGE_ANDROID;
+        customDefaultRule.userModifiedFields = AutomaticZenRule.FIELD_NAME;
         customDefaultRule.enabled = false;
-        customDefaultRule.modified = false;
         customDefaultRule.creationTime = 0;
         customDefaultRule.id = SCHEDULE_DEFAULT_RULE_ID;
         customDefaultRule.name = "Schedule Default Rule";
@@ -2391,7 +2383,7 @@
         ZenModeConfig.ZenRule ruleAfterUpdating =
                 mZenModeHelper.mConfig.automaticRules.get(SCHEDULE_DEFAULT_RULE_ID);
         assertEquals(customDefaultRule.enabled, ruleAfterUpdating.enabled);
-        assertEquals(customDefaultRule.modified, ruleAfterUpdating.modified);
+        assertEquals(customDefaultRule.userModifiedFields, ruleAfterUpdating.userModifiedFields);
         assertEquals(customDefaultRule.id, ruleAfterUpdating.id);
         assertEquals(customDefaultRule.conditionId, ruleAfterUpdating.conditionId);
         assertNotEquals(defaultRuleName, ruleAfterUpdating.name); // update name
@@ -2401,8 +2393,7 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
-    public void testDefaultRulesFromConfig_modesApi_getPolicies() {
+    public void testDefaultRulesFromConfig_getPolicies() {
         // After mZenModeHelper was created, set some things in the policy so it's changed from
         // default.
         setupZenConfig();
@@ -2530,7 +2521,6 @@
         ZenModeConfig.ZenRule ruleInConfig = mZenModeHelper.mConfig.automaticRules.get(id);
         assertTrue(ruleInConfig != null);
         assertEquals(zenRule.isEnabled(), ruleInConfig.enabled);
-        assertEquals(zenRule.isModified(), ruleInConfig.modified);
         assertEquals(zenRule.getConditionId(), ruleInConfig.conditionId);
         assertEquals(NotificationManager.zenModeFromInterruptionFilter(
                 zenRule.getInterruptionFilter(), -1), ruleInConfig.zenMode);
@@ -2551,7 +2541,6 @@
         ZenModeConfig.ZenRule ruleInConfig = mZenModeHelper.mConfig.automaticRules.get(id);
         assertTrue(ruleInConfig != null);
         assertEquals(zenRule.isEnabled(), ruleInConfig.enabled);
-        assertEquals(zenRule.isModified(), ruleInConfig.modified);
         assertEquals(zenRule.getConditionId(), ruleInConfig.conditionId);
         assertEquals(NotificationManager.zenModeFromInterruptionFilter(
                 zenRule.getInterruptionFilter(), -1), ruleInConfig.zenMode);
@@ -2560,8 +2549,7 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
-    public void testAddAutomaticZenRule_modesApi_fillsInDefaultValues() {
+    public void testAddAutomaticZenRule_fillsInDefaultValues() {
         // When a new automatic zen rule is added with only some fields filled in, ensure that
         // all unset fields are filled in with device defaults.
 
@@ -2762,7 +2750,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void addAutomaticZenRule_fromApp_ignoresHiddenEffects() {
         ZenDeviceEffects zde =
                 new ZenDeviceEffects.Builder()
@@ -2799,7 +2786,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void addAutomaticZenRule_fromSystem_respectsHiddenEffects() {
         ZenDeviceEffects zde = new ZenDeviceEffects.Builder()
                 .setShouldDisplayGrayscale(true)
@@ -2828,7 +2814,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void addAutomaticZenRule_fromUser_respectsHiddenEffects() throws Exception {
         ZenDeviceEffects zde = new ZenDeviceEffects.Builder()
                 .setShouldDisplayGrayscale(true)
@@ -2859,7 +2844,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void updateAutomaticZenRule_fromApp_preservesPreviousHiddenEffects() {
         ZenDeviceEffects original = new ZenDeviceEffects.Builder()
                 .setShouldDisableTapToWake(true)
@@ -2896,7 +2880,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void updateAutomaticZenRule_fromSystem_updatesHiddenEffects() {
         ZenDeviceEffects original = new ZenDeviceEffects.Builder()
                 .setShouldDisableTapToWake(true)
@@ -2925,7 +2908,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void updateAutomaticZenRule_fromUser_updatesHiddenEffects() {
         ZenDeviceEffects original = new ZenDeviceEffects.Builder()
                 .setShouldDisableTapToWake(true)
@@ -2958,7 +2940,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void updateAutomaticZenRule_nullPolicy_doesNothing() {
         // Test that when updateAutomaticZenRule is called with a null policy, nothing changes
         // about the existing policy.
@@ -2985,7 +2966,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void updateAutomaticZenRule_overwritesExistingPolicy() {
         // Test that when updating an automatic zen rule with an existing policy, the newly set
         // fields overwrite those from the previous policy, but unset fields in the new policy
@@ -3024,7 +3004,6 @@
 
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void addAutomaticZenRule_withTypeBedtime_replacesDisabledSleeping() {
         ZenRule sleepingRule = createCustomAutomaticRule(ZEN_MODE_IMPORTANT_INTERRUPTIONS,
                 ZenModeConfig.EVERY_NIGHT_DEFAULT_RULE_ID);
@@ -3044,7 +3023,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void addAutomaticZenRule_withTypeBedtime_keepsEnabledSleeping() {
         ZenRule sleepingRule = createCustomAutomaticRule(ZEN_MODE_IMPORTANT_INTERRUPTIONS,
                 ZenModeConfig.EVERY_NIGHT_DEFAULT_RULE_ID);
@@ -3065,7 +3043,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void addAutomaticZenRule_withTypeBedtime_keepsCustomizedSleeping() {
         ZenRule sleepingRule = createCustomAutomaticRule(ZEN_MODE_IMPORTANT_INTERRUPTIONS,
                 ZenModeConfig.EVERY_NIGHT_DEFAULT_RULE_ID);
@@ -3086,7 +3063,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void updateAutomaticZenRule_withTypeBedtime_replacesDisabledSleeping() {
         ZenRule sleepingRule = createCustomAutomaticRule(ZEN_MODE_IMPORTANT_INTERRUPTIONS,
                 ZenModeConfig.EVERY_NIGHT_DEFAULT_RULE_ID);
@@ -3113,7 +3090,34 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
+    public void getAutomaticZenRules_returnsOwnedRules() {
+        AutomaticZenRule myRule1 = new AutomaticZenRule.Builder("My Rule 1", Uri.parse("1"))
+                .setPackage(mPkg)
+                .setConfigurationActivity(new ComponentName(mPkg, "myActivity"))
+                .build();
+        AutomaticZenRule myRule2 = new AutomaticZenRule.Builder("My Rule 2", Uri.parse("2"))
+                .setPackage(mPkg)
+                .setConfigurationActivity(new ComponentName(mPkg, "myActivity"))
+                .build();
+        AutomaticZenRule otherPkgRule = new AutomaticZenRule.Builder("Other", Uri.parse("3"))
+                .setPackage("com.other.package")
+                .setConfigurationActivity(new ComponentName("com.other.package", "theirActivity"))
+                .build();
+
+        String rule1Id = mZenModeHelper.addAutomaticZenRule(UserHandle.CURRENT, mPkg, myRule1,
+                ORIGIN_APP, "reason", CUSTOM_PKG_UID);
+        String rule2Id = mZenModeHelper.addAutomaticZenRule(UserHandle.CURRENT, mPkg, myRule2,
+                ORIGIN_APP, "reason", CUSTOM_PKG_UID);
+        String otherRuleId = mZenModeHelper.addAutomaticZenRule(UserHandle.CURRENT,
+                "com.other.package", otherPkgRule, ORIGIN_APP, "reason", CUSTOM_PKG_UID);
+
+        Map<String, AutomaticZenRule> rules = mZenModeHelper.getAutomaticZenRules(
+                UserHandle.CURRENT, CUSTOM_PKG_UID);
+
+        assertThat(rules.keySet()).containsExactly(rule1Id, rule2Id);
+    }
+
+    @Test
     public void testSetManualZenMode() {
         setupZenConfig();
 
@@ -3133,7 +3137,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     @DisableFlags(FLAG_MODES_UI)
     public void setManualZenMode_off_snoozesActiveRules() {
         for (ZenChangeOrigin origin : ZenChangeOrigin.values()) {
@@ -3172,7 +3175,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void setManualZenMode_off_doesNotSnoozeRulesIfFromUserInSystemUi() {
         for (ZenChangeOrigin origin : ZenChangeOrigin.values()) {
             // Start with an active rule and an inactive rule
@@ -3246,7 +3249,7 @@
         // Turn zen mode on (to important_interruptions)
         // Need to additionally call the looper in order to finish the post-apply-config process
         mZenModeHelper.setManualZenMode(UserHandle.CURRENT, ZEN_MODE_IMPORTANT_INTERRUPTIONS, null,
-                Flags.modesApi() ? ORIGIN_USER_IN_SYSTEMUI : ORIGIN_SYSTEM, "", null, SYSTEM_UID);
+                ORIGIN_USER_IN_SYSTEMUI, "", null, SYSTEM_UID);
 
         // Now turn zen mode off, but via a different package UID -- this should get registered as
         // "not an action by the user" because some other app is changing zen mode
@@ -3273,14 +3276,13 @@
         assertEquals(ZEN_MODE_IMPORTANT_INTERRUPTIONS, mZenModeEventLogger.getNewZenMode(0));
         assertEquals(DNDProtoEnums.MANUAL_RULE, mZenModeEventLogger.getChangedRuleType(0));
         assertEquals(1, mZenModeEventLogger.getNumRulesActive(0));
-        assertThat(mZenModeEventLogger.getFromSystemOrSystemUi(0)).isEqualTo(
-                !(Flags.modesUi() || Flags.modesApi()));
+        assertThat(mZenModeEventLogger.getFromSystemOrSystemUi(0)).isFalse();
         assertTrue(mZenModeEventLogger.getIsUserAction(0));
         assertEquals(SYSTEM_UID, mZenModeEventLogger.getPackageUid(0));
         checkDndProtoMatchesSetupZenConfig(mZenModeEventLogger.getPolicyProto(0));
         // change origin should be populated only under modes_ui
         assertThat(mZenModeEventLogger.getChangeOrigin(0)).isEqualTo(
-                (Flags.modesApi() && Flags.modesUi()) ? ORIGIN_USER_IN_SYSTEMUI : 0);
+                (Flags.modesUi()) ? ORIGIN_USER_IN_SYSTEMUI : 0);
 
         // and from turning zen mode off:
         //   - event ID: DND_TURNED_OFF
@@ -3298,11 +3300,7 @@
         assertEquals(0, mZenModeEventLogger.getNumRulesActive(1));
         assertFalse(mZenModeEventLogger.getIsUserAction(1));
         assertEquals(CUSTOM_PKG_UID, mZenModeEventLogger.getPackageUid(1));
-        if (Flags.modesApi()) {
-            assertThat(mZenModeEventLogger.getPolicyProto(1)).isNull();
-        } else {
-            checkDndProtoMatchesSetupZenConfig(mZenModeEventLogger.getPolicyProto(1));
-        }
+        assertThat(mZenModeEventLogger.getPolicyProto(1)).isNull();
         assertThat(mZenModeEventLogger.getChangeOrigin(1)).isEqualTo(
                 Flags.modesUi() ? ORIGIN_APP : 0);
     }
@@ -3334,8 +3332,7 @@
         // Event 2: "User" turns off the automatic rule (sets it to not enabled)
         zenRule.setEnabled(false);
         mZenModeHelper.updateAutomaticZenRule(UserHandle.CURRENT, id, zenRule,
-                Flags.modesApi() ? ORIGIN_USER_IN_SYSTEMUI : ORIGIN_SYSTEM, "",
-                SYSTEM_UID);
+                ORIGIN_USER_IN_SYSTEMUI, "", SYSTEM_UID);
 
         AutomaticZenRule systemRule = new AutomaticZenRule("systemRule",
                 null,
@@ -3345,8 +3342,7 @@
                 NotificationManager.INTERRUPTION_FILTER_PRIORITY, true);
         String systemId = mZenModeHelper.addAutomaticZenRule(UserHandle.CURRENT,
                 mContext.getPackageName(), systemRule,
-                Flags.modesApi() ? ORIGIN_USER_IN_SYSTEMUI : ORIGIN_SYSTEM, "test",
-                SYSTEM_UID);
+                ORIGIN_USER_IN_SYSTEMUI, "test", SYSTEM_UID);
 
         // Event 3: turn on the system rule
         mZenModeHelper.setAutomaticZenRuleState(UserHandle.CURRENT, systemId,
@@ -3355,8 +3351,7 @@
 
         // Event 4: "User" deletes the rule
         mZenModeHelper.removeAutomaticZenRule(UserHandle.CURRENT, systemId,
-                Flags.modesApi() ? ORIGIN_USER_IN_SYSTEMUI : ORIGIN_SYSTEM, "",
-                SYSTEM_UID);
+                ORIGIN_USER_IN_SYSTEMUI, "", SYSTEM_UID);
         // In total, this represents 4 events
         assertEquals(4, mZenModeEventLogger.numLoggedChanges());
 
@@ -3394,11 +3389,7 @@
         assertTrue(mZenModeEventLogger.getIsUserAction(1));
         assertThat(mZenModeEventLogger.getPackageUid(1)).isEqualTo(
                 Flags.modesUi() ? CUSTOM_PKG_UID : SYSTEM_UID);
-        if (Flags.modesApi()) {
-            assertThat(mZenModeEventLogger.getPolicyProto(1)).isNull();
-        } else {
-            checkDndProtoMatchesSetupZenConfig(mZenModeEventLogger.getPolicyProto(1));
-        }
+        assertThat(mZenModeEventLogger.getPolicyProto(1)).isNull();
         assertThat(mZenModeEventLogger.getChangeOrigin(1)).isEqualTo(
                 Flags.modesUi() ? ORIGIN_USER_IN_SYSTEMUI : 0);
 
@@ -3426,7 +3417,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void testZenModeEventLog_automaticRuleActivatedFromAppByAppAndUser()
             throws IllegalArgumentException {
         mTestFlagResolver.setFlagOverride(LOG_DND_STATE_EVENTS, true);
@@ -3816,13 +3806,13 @@
 
         // Now change apps bypassing to true
         ZenModeConfig newConfig = mZenModeHelper.mConfig.copy();
-        newConfig.areChannelsBypassingDnd = true;
+        newConfig.hasPriorityChannels = true;
         mZenModeHelper.setNotificationPolicy(UserHandle.CURRENT, newConfig.toNotificationPolicy(),
                 ORIGIN_SYSTEM, SYSTEM_UID);
         assertEquals(2, mZenModeEventLogger.numLoggedChanges());
 
         // and then back to false, all without changing anything else
-        newConfig.areChannelsBypassingDnd = false;
+        newConfig.hasPriorityChannels = false;
         mZenModeHelper.setNotificationPolicy(UserHandle.CURRENT, newConfig.toNotificationPolicy(),
                 ORIGIN_SYSTEM, SYSTEM_UID);
         assertEquals(3, mZenModeEventLogger.numLoggedChanges());
@@ -3869,10 +3859,9 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void testZenModeEventLog_policyAllowChannels() {
-        // when modes_api flag is on, ensure that any change in allow_channels gets logged,
-        // even when there are no other changes.
+        // Ensure that any change in allow_channels gets logged, even when there are no other
+        // changes.
         mTestFlagResolver.setFlagOverride(LOG_DND_STATE_EVENTS, true);
 
         // Default zen config has allow channels = priority (aka on)
@@ -3919,7 +3908,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void testZenModeEventLog_ruleWithInterruptionFilterAll_notLoggedAsDndChange() {
         mTestFlagResolver.setFlagOverride(LOG_DND_STATE_EVENTS, true);
         setupZenConfig();
@@ -3961,7 +3949,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void testZenModeEventLog_activeRuleTypes() {
         mTestFlagResolver.setFlagOverride(LOG_DND_STATE_EVENTS, true);
         setupZenConfig();
@@ -4050,43 +4037,7 @@
     }
 
     @Test
-    @DisableFlags(FLAG_MODES_API)
-    public void testUpdateConsolidatedPolicy_preModesApiDefaultRulesOnly_takesGlobalDefault() {
-        setupZenConfig();
-        // When there's one automatic rule active and it doesn't specify a policy, test that the
-        // resulting consolidated policy is one that matches the default rule settings.
-        AutomaticZenRule zenRule = new AutomaticZenRule("name",
-                null,
-                new ComponentName(CUSTOM_PKG_NAME, "ScheduleConditionProvider"),
-                ZenModeConfig.toScheduleConditionId(new ScheduleInfo()),
-                null,
-                NotificationManager.INTERRUPTION_FILTER_PRIORITY, true);
-        String id = mZenModeHelper.addAutomaticZenRule(UserHandle.CURRENT,
-                mContext.getPackageName(), zenRule, ORIGIN_SYSTEM, "test", SYSTEM_UID);
-
-        // enable the rule
-        mZenModeHelper.setAutomaticZenRuleState(UserHandle.CURRENT, id,
-                new Condition(zenRule.getConditionId(), "", STATE_TRUE),
-                ORIGIN_SYSTEM, SYSTEM_UID);
-
-        assertEquals(mZenModeHelper.getNotificationPolicy(UserHandle.CURRENT),
-                mZenModeHelper.getConsolidatedNotificationPolicy());
-
-        // inspect the consolidated policy. Based on setupZenConfig() values.
-        assertFalse(mZenModeHelper.mConsolidatedPolicy.allowAlarms());
-        assertFalse(mZenModeHelper.mConsolidatedPolicy.allowMedia());
-        assertFalse(mZenModeHelper.mConsolidatedPolicy.allowSystem());
-        assertTrue(mZenModeHelper.mConsolidatedPolicy.allowReminders());
-        assertTrue(mZenModeHelper.mConsolidatedPolicy.allowCalls());
-        assertEquals(PRIORITY_SENDERS_STARRED, mZenModeHelper.mConsolidatedPolicy.allowCallsFrom());
-        assertTrue(mZenModeHelper.mConsolidatedPolicy.allowMessages());
-        assertTrue(mZenModeHelper.mConsolidatedPolicy.allowConversations());
-        assertTrue(mZenModeHelper.mConsolidatedPolicy.allowRepeatCallers());
-        assertFalse(mZenModeHelper.mConsolidatedPolicy.showBadges());
-    }
-
-    @Test
-    public void testUpdateConsolidatedPolicy_modesApiDefaultRulesOnly_takesDefault() {
+    public void testUpdateConsolidatedPolicy_defaultRulesOnly_takesDefault() {
         setupZenConfig();
 
         // When there's one automatic rule active and it doesn't specify a policy, test that the
@@ -4113,53 +4064,7 @@
     }
 
     @Test
-    @DisableFlags(FLAG_MODES_API)
-    public void testUpdateConsolidatedPolicy_preModesApiCustomPolicyOnly_fillInWithGlobal() {
-        setupZenConfig();
-
-        // when there's only one automatic rule active and it has a custom policy, make sure that's
-        // what the consolidated policy reflects whether or not it's stricter than what the global
-        // config would specify.
-        ZenPolicy customPolicy = new ZenPolicy.Builder()
-                .allowAlarms(true)  // more lenient than default
-                .allowMedia(true)  // more lenient than default
-                .allowRepeatCallers(false)  // more restrictive than default
-                .allowCalls(ZenPolicy.PEOPLE_TYPE_NONE)  // more restrictive than default
-                .showBadges(true)  // more lenient
-                .showPeeking(false)  // more restrictive
-                .build();
-
-        AutomaticZenRule zenRule = new AutomaticZenRule("name",
-                null,
-                new ComponentName(CUSTOM_PKG_NAME, "ScheduleConditionProvider"),
-                ZenModeConfig.toScheduleConditionId(new ScheduleInfo()),
-                customPolicy,
-                NotificationManager.INTERRUPTION_FILTER_PRIORITY, true);
-        String id = mZenModeHelper.addAutomaticZenRule(UserHandle.CURRENT,
-                mContext.getPackageName(), zenRule, ORIGIN_SYSTEM, "test", SYSTEM_UID);
-
-        // enable the rule; this will update the consolidated policy
-        mZenModeHelper.setAutomaticZenRuleState(UserHandle.CURRENT, id,
-                new Condition(zenRule.getConditionId(), "", STATE_TRUE), ORIGIN_SYSTEM, SYSTEM_UID);
-
-        // since this is the only active rule, the consolidated policy should match the custom
-        // policy for every field specified, and take default values (from device default or
-        // manual policy) for unspecified things
-        assertTrue(mZenModeHelper.mConsolidatedPolicy.allowAlarms());  // custom
-        assertTrue(mZenModeHelper.mConsolidatedPolicy.allowMedia());  // custom
-        assertFalse(mZenModeHelper.mConsolidatedPolicy.allowSystem());  // default
-        assertTrue(mZenModeHelper.mConsolidatedPolicy.allowReminders());  // default
-        assertFalse(mZenModeHelper.mConsolidatedPolicy.allowCalls());  // custom
-        assertTrue(mZenModeHelper.mConsolidatedPolicy.allowMessages()); // default
-        assertTrue(mZenModeHelper.mConsolidatedPolicy.allowConversations());  // default
-        assertFalse(mZenModeHelper.mConsolidatedPolicy.allowRepeatCallers());  // custom
-        assertTrue(mZenModeHelper.mConsolidatedPolicy.showBadges());  // custom
-        assertFalse(mZenModeHelper.mConsolidatedPolicy.showPeeking());  // custom
-    }
-
-    @Test
-    @EnableFlags(FLAG_MODES_API)
-    public void testUpdateConsolidatedPolicy_modesApiCustomPolicyOnly_fillInWithDefault() {
+    public void testUpdateConsolidatedPolicy_customPolicyOnly_fillInWithDefault() {
         setupZenConfig();
 
         // when there's only one automatic rule active and it has a custom policy, make sure that's
@@ -4204,68 +4109,7 @@
     }
 
     @Test
-    @DisableFlags(FLAG_MODES_API)
-    public void testUpdateConsolidatedPolicy_preModesApiDefaultAndCustomActive_mergesWithGlobal() {
-        setupZenConfig();
-
-        // when there are two rules active, one inheriting the default policy and one setting its
-        // own custom policy, they should be merged to form the most restrictive combination.
-
-        // rule 1: no custom policy
-        AutomaticZenRule zenRule = new AutomaticZenRule("name",
-                null,
-                new ComponentName(CUSTOM_PKG_NAME, "ScheduleConditionProvider"),
-                ZenModeConfig.toScheduleConditionId(new ScheduleInfo()),
-                null,
-                NotificationManager.INTERRUPTION_FILTER_PRIORITY, true);
-        String id = mZenModeHelper.addAutomaticZenRule(UserHandle.CURRENT,
-                mContext.getPackageName(), zenRule, ORIGIN_SYSTEM, "test", SYSTEM_UID);
-
-        // enable rule 1
-        mZenModeHelper.setAutomaticZenRuleState(UserHandle.CURRENT, id,
-                new Condition(zenRule.getConditionId(), "", STATE_TRUE), ORIGIN_SYSTEM, SYSTEM_UID);
-
-        // custom policy for rule 2
-        ZenPolicy customPolicy = new ZenPolicy.Builder()
-                .allowAlarms(true)  // more lenient than default
-                .allowMedia(true)  // more lenient than default
-                .allowRepeatCallers(false)  // more restrictive than default
-                .allowCalls(ZenPolicy.PEOPLE_TYPE_NONE)  // more restrictive than default
-                .showBadges(true)  // more lenient
-                .showPeeking(false)  // more restrictive
-                .build();
-
-        AutomaticZenRule zenRule2 = new AutomaticZenRule("name2",
-                null,
-                new ComponentName(CUSTOM_PKG_NAME, "ScheduleConditionProvider"),
-                ZenModeConfig.toScheduleConditionId(new ScheduleInfo()),
-                customPolicy,
-                NotificationManager.INTERRUPTION_FILTER_PRIORITY, true);
-        String id2 = mZenModeHelper.addAutomaticZenRule(UserHandle.CURRENT,
-                mContext.getPackageName(), zenRule2, ORIGIN_SYSTEM, "test", SYSTEM_UID);
-
-        // enable rule 2; this will update the consolidated policy
-        mZenModeHelper.setAutomaticZenRuleState(UserHandle.CURRENT, id2,
-                new Condition(zenRule2.getConditionId(), "", STATE_TRUE),
-                ORIGIN_SYSTEM, SYSTEM_UID);
-
-        // now both rules should be on, and the consolidated policy should reflect the most
-        // restrictive option of each of the two
-        assertFalse(mZenModeHelper.mConsolidatedPolicy.allowAlarms());  // default stricter
-        assertFalse(mZenModeHelper.mConsolidatedPolicy.allowMedia());  // default stricter
-        assertFalse(mZenModeHelper.mConsolidatedPolicy.allowSystem());  // default, unset in custom
-        assertTrue(mZenModeHelper.mConsolidatedPolicy.allowReminders());  // default
-        assertFalse(mZenModeHelper.mConsolidatedPolicy.allowCalls());  // custom stricter
-        assertTrue(mZenModeHelper.mConsolidatedPolicy.allowMessages()); // default, unset in custom
-        assertTrue(mZenModeHelper.mConsolidatedPolicy.allowConversations());  // default
-        assertFalse(mZenModeHelper.mConsolidatedPolicy.allowRepeatCallers());  // custom stricter
-        assertFalse(mZenModeHelper.mConsolidatedPolicy.showBadges());  // default stricter
-        assertFalse(mZenModeHelper.mConsolidatedPolicy.showPeeking());  // custom stricter
-    }
-
-    @Test
-    @EnableFlags(FLAG_MODES_API)
-    public void testUpdateConsolidatedPolicy_modesApiDefaultAndCustomActive_mergesWithDefault() {
+    public void testUpdateConsolidatedPolicy_defaultAndCustomActive_mergesWithDefault() {
         setupZenConfig();
 
         // when there are two rules active, one inheriting the default policy and one setting its
@@ -4328,7 +4172,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void testUpdateConsolidatedPolicy_allowChannels() {
         setupZenConfig();
 
@@ -4377,7 +4220,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void testUpdateConsolidatedPolicy_ignoresActiveRulesWithInterruptionFilterAll() {
         setupZenConfig();
 
@@ -4428,7 +4270,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void zenRuleToAutomaticZenRule_allFields() {
         when(mPackageManager.getPackagesForUid(anyInt())).thenReturn(
                 new String[]{OWNER.getPackageName()});
@@ -4442,7 +4283,6 @@
         rule.creationTime = 123;
         rule.id = "id";
         rule.zenMode = INTERRUPTION_FILTER_ZR;
-        rule.modified = true;
         rule.name = NAME;
         rule.setConditionOverride(OVERRIDE_DEACTIVATE);
         rule.pkg = OWNER.getPackageName();
@@ -4473,7 +4313,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void automaticZenRuleToZenRule_allFields() {
         when(mPackageManager.getPackagesForUid(anyInt())).thenReturn(
                 new String[]{OWNER.getPackageName()});
@@ -4515,7 +4354,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void updateAutomaticZenRule_fromApp_updatesNameUnlessUserModified() {
         // Add a starting rule with the name OriginalName.
         AutomaticZenRule azrBase = new AutomaticZenRule.Builder("OriginalName", CONDITION_ID)
@@ -4573,7 +4411,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void updateAutomaticZenRule_fromUser_updatesBitmaskAndValue() {
         // Adds a starting rule with empty zen policies and device effects
         AutomaticZenRule azrBase = new AutomaticZenRule.Builder(NAME, CONDITION_ID)
@@ -4627,7 +4464,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void updateAutomaticZenRule_fromSystemUi_updatesValues() {
         // Adds a starting rule with empty zen policies and device effects
         AutomaticZenRule azrBase = new AutomaticZenRule.Builder(NAME, CONDITION_ID)
@@ -4678,7 +4514,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void updateAutomaticZenRule_fromApp_updatesValuesIfRuleNotUserModified() {
         // Adds a starting rule with empty zen policies and device effects
         AutomaticZenRule azrBase = new AutomaticZenRule.Builder(NAME, CONDITION_ID)
@@ -4754,7 +4589,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void addAutomaticZenRule_updatesValues() {
         // Adds a starting rule with empty zen policies and device effects
         AutomaticZenRule azrBase = new AutomaticZenRule.Builder(NAME, CONDITION_ID)
@@ -4781,7 +4615,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void updateAutomaticZenRule_nullDeviceEffectsUpdate() {
         // Adds a starting rule with empty zen policies and device effects
         ZenDeviceEffects zde = new ZenDeviceEffects.Builder().setShouldUseNightMode(true).build();
@@ -4809,7 +4642,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void updateAutomaticZenRule_nullPolicyUpdate() {
         // Adds a starting rule with set zen policy and empty device effects
         AutomaticZenRule azrBase = new AutomaticZenRule.Builder(NAME, CONDITION_ID)
@@ -4838,7 +4670,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void automaticZenRuleToZenRule_nullToNonNullPolicyUpdate() {
         when(mContext.checkCallingPermission(anyString()))
                 .thenReturn(PackageManager.PERMISSION_GRANTED);
@@ -4902,7 +4733,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void automaticZenRuleToZenRule_nullToNonNullDeviceEffectsUpdate() {
         // Adds a starting rule with empty zen policies and device effects
         AutomaticZenRule azrBase = new AutomaticZenRule.Builder(NAME, CONDITION_ID)
@@ -5007,7 +4837,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void testUpdateAutomaticRule_activated_triggersBroadcast() throws Exception {
         setupZenConfig();
 
@@ -5047,7 +4876,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void testUpdateAutomaticRule_deactivatedByUser_triggersBroadcast() throws Exception {
         setupZenConfig();
 
@@ -5091,7 +4919,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void testUpdateAutomaticRule_deactivatedByApp_triggersBroadcast() throws Exception {
         setupZenConfig();
 
@@ -5167,7 +4994,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void updateAutomaticZenRule_ruleChanged_deactivatesRule() {
         assertThat(mZenModeHelper.getZenMode()).isEqualTo(ZEN_MODE_OFF);
         AutomaticZenRule rule = new AutomaticZenRule.Builder("rule", CONDITION_ID)
@@ -5191,7 +5017,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void updateAutomaticZenRule_ruleNotChanged_doesNotDeactivateRule() {
         assertThat(mZenModeHelper.getZenMode()).isEqualTo(ZEN_MODE_OFF);
         AutomaticZenRule rule = new AutomaticZenRule.Builder("rule", CONDITION_ID)
@@ -5214,7 +5039,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void updateAutomaticZenRule_ruleChangedByUser_doesNotDeactivateRule() {
         assertThat(mZenModeHelper.getZenMode()).isEqualTo(ZEN_MODE_OFF);
         AutomaticZenRule rule = new AutomaticZenRule.Builder("rule", CONDITION_ID)
@@ -5239,7 +5064,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void updateAutomaticZenRule_ruleChangedByUser_doesNotDeactivateRule_forWatch() {
         when(mContext.getPackageManager()).thenReturn(mPackageManager);
         when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_WATCH)).thenReturn(true);
@@ -5266,7 +5090,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void updateAutomaticZenRule_ruleDisabledByUser_doesNotReactivateOnReenable() {
         assertThat(mZenModeHelper.getZenMode()).isEqualTo(ZEN_MODE_OFF);
         AutomaticZenRule rule = new AutomaticZenRule.Builder("rule", CONDITION_ID)
@@ -5291,7 +5115,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void updateAutomaticZenRule_changeOwnerForSystemRule_allowed() {
         when(mContext.checkCallingPermission(anyString()))
                 .thenReturn(PackageManager.PERMISSION_GRANTED);
@@ -5314,7 +5138,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void updateAutomaticZenRule_changeOwnerForAppOwnedRule_ignored() {
         AutomaticZenRule original = new AutomaticZenRule.Builder("Rule", Uri.EMPTY)
                 .setOwner(new ComponentName(mContext.getPackageName(), "old.third.party.cps"))
@@ -5335,7 +5159,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void removeAutomaticZenRule_propagatesOriginToEffectsApplier() {
         mZenModeHelper.setDeviceEffectsApplier(mDeviceEffectsApplier);
         reset(mDeviceEffectsApplier);
@@ -5358,7 +5181,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void testDeviceEffects_applied() {
         mZenModeHelper.setDeviceEffectsApplier(mDeviceEffectsApplier);
         verify(mDeviceEffectsApplier).apply(eq(NO_EFFECTS), eq(ORIGIN_INIT));
@@ -5384,7 +5206,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void testSettingDeviceEffects_throwsExceptionIfAlreadySet() {
         mZenModeHelper.setDeviceEffectsApplier(mDeviceEffectsApplier);
 
@@ -5394,7 +5215,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void testDeviceEffects_onDeactivateRule_applied() {
         mZenModeHelper.setDeviceEffectsApplier(mDeviceEffectsApplier);
 
@@ -5413,7 +5233,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void testDeviceEffects_changeToConsolidatedEffects_applied() {
         mZenModeHelper.setDeviceEffectsApplier(mDeviceEffectsApplier);
         verify(mDeviceEffectsApplier).apply(eq(NO_EFFECTS), eq(ORIGIN_INIT));
@@ -5453,7 +5272,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void testDeviceEffects_noChangeToConsolidatedEffects_notApplied() {
         mZenModeHelper.setDeviceEffectsApplier(mDeviceEffectsApplier);
         verify(mDeviceEffectsApplier).apply(eq(NO_EFFECTS), eq(ORIGIN_INIT));
@@ -5478,7 +5296,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void testDeviceEffects_activeBeforeApplierProvided_appliedWhenProvided() {
         ZenDeviceEffects zde = new ZenDeviceEffects.Builder().setShouldUseNightMode(true).build();
         String ruleId = addRuleWithEffects(zde);
@@ -5494,7 +5311,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void testDeviceEffects_onUserSwitch_appliedImmediately() {
         mZenModeHelper.setDeviceEffectsApplier(mDeviceEffectsApplier);
         verify(mDeviceEffectsApplier).apply(eq(NO_EFFECTS), eq(ORIGIN_INIT));
@@ -5522,7 +5338,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI, FLAG_PREVENT_ZEN_DEVICE_EFFECTS_WHILE_DRIVING})
+    @EnableFlags({FLAG_MODES_UI, FLAG_PREVENT_ZEN_DEVICE_EFFECTS_WHILE_DRIVING})
     public void testDeviceEffects_allowsGrayscale() {
         mZenModeHelper.setDeviceEffectsApplier(mDeviceEffectsApplier);
         reset(mDeviceEffectsApplier);
@@ -5539,7 +5355,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI, FLAG_PREVENT_ZEN_DEVICE_EFFECTS_WHILE_DRIVING})
+    @EnableFlags({FLAG_MODES_UI, FLAG_PREVENT_ZEN_DEVICE_EFFECTS_WHILE_DRIVING})
     public void testDeviceEffects_whileDriving_avoidsGrayscale() {
         mZenModeHelper.setDeviceEffectsApplier(mDeviceEffectsApplier);
         reset(mDeviceEffectsApplier);
@@ -5563,7 +5379,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI, FLAG_PREVENT_ZEN_DEVICE_EFFECTS_WHILE_DRIVING})
+    @EnableFlags({FLAG_MODES_UI, FLAG_PREVENT_ZEN_DEVICE_EFFECTS_WHILE_DRIVING})
     public void testDeviceEffects_whileDrivingWithGrayscale_allowsGrayscale() {
         mZenModeHelper.setDeviceEffectsApplier(mDeviceEffectsApplier);
         reset(mDeviceEffectsApplier);
@@ -5594,7 +5410,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void removeAndAddAutomaticZenRule_wasCustomized_isRestored() {
         // Start with a rule.
         mZenModeHelper.mConfig.automaticRules.clear();
@@ -5651,7 +5466,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void removeAndAddAutomaticZenRule_wasNotCustomized_isNotRestored() {
         // Start with a single rule.
         mZenModeHelper.mConfig.automaticRules.clear();
@@ -5685,7 +5499,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void removeAndAddAutomaticZenRule_recreatedButNotByApp_isNotRestored() {
         // Start with a single rule.
         mZenModeHelper.mConfig.automaticRules.clear();
@@ -5736,7 +5549,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void removeAndAddAutomaticZenRule_removedByUser_isNotRestored() {
         // Start with a single rule.
         mZenModeHelper.mConfig.automaticRules.clear();
@@ -5779,7 +5591,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void removeAndAddAutomaticZenRule_ifChangingComponent_isAllowedAndDoesNotRestore() {
         // Start with a rule.
         mZenModeHelper.mConfig.automaticRules.clear();
@@ -5824,7 +5636,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void removeAutomaticZenRule_preservedForRestoringByPackageAndConditionId() {
         mContext.getTestablePermissions().setPermission(Manifest.permission.MANAGE_NOTIFICATIONS,
                 PERMISSION_GRANTED); // So that canManageAZR passes although packages don't match.
@@ -5874,7 +5685,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void removeAllZenRules_preservedForRestoring() {
         mZenModeHelper.mConfig.automaticRules.clear();
 
@@ -5898,7 +5708,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void removeAllZenRules_fromSystem_deletesPreservedRulesToo() {
         mZenModeHelper.mConfig.automaticRules.clear();
 
@@ -5918,7 +5727,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void removeAndAddAutomaticZenRule_wasActive_isRestoredAsInactive() {
         // Start with a rule.
         mZenModeHelper.mConfig.automaticRules.clear();
@@ -5968,7 +5776,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void removeAndAddAutomaticZenRule_wasSnoozed_isRestoredAsInactive() {
         // Start with a rule.
         mZenModeHelper.mConfig.automaticRules.clear();
@@ -6023,7 +5830,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void testRuleCleanup() throws Exception {
         Instant now = Instant.ofEpochMilli(1701796461000L);
         Instant yesterday = now.minus(1, ChronoUnit.DAYS);
@@ -6081,7 +5887,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void getAutomaticZenRuleState_ownedRule_returnsRuleState() {
         String id = mZenModeHelper.addAutomaticZenRule(UserHandle.CURRENT,
                 mContext.getPackageName(),
@@ -6112,7 +5917,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void getAutomaticZenRuleState_notOwnedRule_returnsStateUnknown() {
         // Assume existence of a system-owned rule that is currently ACTIVE.
         ZenRule systemRule = newZenRule("android", Instant.now(), null);
@@ -6128,7 +5932,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void setAutomaticZenRuleState_idForNotOwnedRule_ignored() {
         // Assume existence of an other-package-owned rule that is currently ACTIVE.
         assertThat(mZenModeHelper.getZenMode()).isEqualTo(ZEN_MODE_OFF);
@@ -6149,7 +5952,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void setAutomaticZenRuleStateFromConditionProvider_conditionForNotOwnedRule_ignored() {
         // Assume existence of an other-package-owned rule that is currently ACTIVE.
         assertThat(mZenModeHelper.getZenMode()).isEqualTo(ZEN_MODE_OFF);
@@ -6171,7 +5973,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void testCallbacks_policy() throws Exception {
         setupZenConfig();
         assertThat(mZenModeHelper.getNotificationPolicy(UserHandle.CURRENT).allowReminders())
@@ -6193,7 +5994,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void testCallbacks_consolidatedPolicy() throws Exception {
         assertThat(mZenModeHelper.getConsolidatedNotificationPolicy().allowMedia()).isTrue();
         SettableFuture<Policy> futureConsolidatedPolicy = SettableFuture.create();
@@ -6219,7 +6019,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void applyGlobalZenModeAsImplicitZenRule_createsImplicitRuleAndActivatesIt() {
         mZenModeHelper.mConfig.automaticRules.clear();
 
@@ -6235,7 +6034,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void applyGlobalZenModeAsImplicitZenRule_updatesImplicitRuleAndActivatesIt() {
         mZenModeHelper.mConfig.automaticRules.clear();
 
@@ -6257,7 +6055,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void applyGlobalZenModeAsImplicitZenRule_ruleCustomized_doesNotUpdateRule() {
         mZenModeHelper.mConfig.automaticRules.clear();
         String pkg = mContext.getPackageName();
@@ -6290,7 +6087,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void applyGlobalZenModeAsImplicitZenRule_ruleCustomizedButNotFilter_updatesRule() {
         mZenModeHelper.mConfig.automaticRules.clear();
         String pkg = mContext.getPackageName();
@@ -6322,7 +6118,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void applyGlobalZenModeAsImplicitZenRule_modeOff_deactivatesImplicitRule() {
         mZenModeHelper.mConfig.automaticRules.clear();
         mZenModeHelper.applyGlobalZenModeAsImplicitZenRule(UserHandle.CURRENT, mPkg, CUSTOM_PKG_UID,
@@ -6339,7 +6134,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void applyGlobalZenModeAsImplicitZenRule_modeOffButNoPreviousRule_ignored() {
         mZenModeHelper.mConfig.automaticRules.clear();
 
@@ -6350,7 +6144,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void applyGlobalZenModeAsImplicitZenRule_update_unsnoozesRule() {
         mZenModeHelper.mConfig.automaticRules.clear();
 
@@ -6375,7 +6168,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void applyGlobalZenModeAsImplicitZenRule_again_refreshesRuleName() {
         mZenModeHelper.mConfig.automaticRules.clear();
         mZenModeHelper.applyGlobalZenModeAsImplicitZenRule(UserHandle.CURRENT,
@@ -6394,7 +6187,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void applyGlobalZenModeAsImplicitZenRule_again_doesNotChangeCustomizedRuleName() {
         mZenModeHelper.mConfig.automaticRules.clear();
         mZenModeHelper.applyGlobalZenModeAsImplicitZenRule(UserHandle.CURRENT,
@@ -6420,19 +6213,6 @@
     }
 
     @Test
-    @DisableFlags(FLAG_MODES_API)
-    public void applyGlobalZenModeAsImplicitZenRule_flagOff_ignored() {
-        mZenModeHelper.mConfig.automaticRules.clear();
-
-        withoutWtfCrash(
-                () -> mZenModeHelper.applyGlobalZenModeAsImplicitZenRule(UserHandle.CURRENT,
-                        CUSTOM_PKG_NAME, CUSTOM_PKG_UID, ZEN_MODE_IMPORTANT_INTERRUPTIONS));
-
-        assertThat(mZenModeHelper.mConfig.automaticRules).isEmpty();
-    }
-
-    @Test
-    @EnableFlags(FLAG_MODES_API)
     public void applyGlobalPolicyAsImplicitZenRule_createsImplicitRule() {
         mZenModeHelper.mConfig.automaticRules.clear();
 
@@ -6457,7 +6237,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void applyGlobalPolicyAsImplicitZenRule_updatesImplicitRule() {
         mZenModeHelper.mConfig.automaticRules.clear();
 
@@ -6489,7 +6268,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void applyGlobalPolicyAsImplicitZenRule_ruleCustomized_doesNotUpdateRule() {
         mZenModeHelper.mConfig.automaticRules.clear();
         String pkg = mContext.getPackageName();
@@ -6532,7 +6310,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void applyGlobalPolicyAsImplicitZenRule_ruleCustomizedButNotZenPolicy_updatesRule() {
         mZenModeHelper.mConfig.automaticRules.clear();
         String pkg = mContext.getPackageName();
@@ -6572,7 +6349,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void applyGlobalPolicyAsImplicitZenRule_again_refreshesRuleName() {
         mZenModeHelper.mConfig.automaticRules.clear();
         mZenModeHelper.applyGlobalPolicyAsImplicitZenRule(UserHandle.CURRENT,
@@ -6591,7 +6368,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void applyGlobalPolicyAsImplicitZenRule_again_doesNotChangeCustomizedRuleName() {
         mZenModeHelper.mConfig.automaticRules.clear();
         mZenModeHelper.applyGlobalPolicyAsImplicitZenRule(UserHandle.CURRENT,
@@ -6617,19 +6394,6 @@
     }
 
     @Test
-    @DisableFlags(FLAG_MODES_API)
-    public void applyGlobalPolicyAsImplicitZenRule_flagOff_ignored() {
-        mZenModeHelper.mConfig.automaticRules.clear();
-
-        withoutWtfCrash(
-                () -> mZenModeHelper.applyGlobalPolicyAsImplicitZenRule(UserHandle.CURRENT,
-                        CUSTOM_PKG_NAME, CUSTOM_PKG_UID, new Policy(0, 0, 0)));
-
-        assertThat(mZenModeHelper.mConfig.automaticRules).isEmpty();
-    }
-
-    @Test
-    @EnableFlags(FLAG_MODES_API)
     public void getNotificationPolicyFromImplicitZenRule_returnsSetPolicy() {
         Policy writtenPolicy = new Policy(PRIORITY_CATEGORY_CALLS | PRIORITY_CATEGORY_CONVERSATIONS,
                 PRIORITY_SENDERS_CONTACTS, PRIORITY_SENDERS_STARRED,
@@ -6645,7 +6409,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     @DisableFlags(FLAG_MODES_UI)
     public void getNotificationPolicyFromImplicitZenRule_ruleWithoutPolicy_copiesGlobalPolicy() {
         // Implicit rule will get the global policy at the time of rule creation.
@@ -6665,7 +6428,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void getNotificationPolicyFromImplicitZenRule_noImplicitRule_returnsGlobalPolicy() {
         Policy policy = new Policy(PRIORITY_CATEGORY_CALLS, PRIORITY_SENDERS_STARRED, 0);
         mZenModeHelper.setNotificationPolicy(UserHandle.CURRENT, policy, ORIGIN_APP,
@@ -6680,7 +6442,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     @DisableFlags(FLAG_MODES_UI)
     public void setNotificationPolicy_updatesRulePolicies_ifRulePolicyIsDefaultOrGlobalPolicy() {
         ZenPolicy defaultZenPolicy = mZenModeHelper.getDefaultZenPolicy();
@@ -6726,7 +6487,6 @@
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_MODES_API)
     public void addRule_iconIdWithResourceNameTooLong_ignoresIcon() {
         int resourceId = 999;
         String veryLongResourceName = "com.android.server.notification:drawable/"
@@ -6745,7 +6505,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void setManualZenRuleDeviceEffects_noPreexistingMode() {
         ZenDeviceEffects effects = new ZenDeviceEffects.Builder()
                 .setShouldDimWallpaper(true)
@@ -6759,7 +6519,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void setManualZenRuleDeviceEffects_preexistingMode() {
         mZenModeHelper.setManualZenMode(UserHandle.CURRENT, ZEN_MODE_OFF, Uri.EMPTY,
                 ORIGIN_USER_IN_SYSTEMUI, "create manual rule", "settings", SYSTEM_UID);
@@ -6776,7 +6536,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void addAutomaticZenRule_startsDisabled_recordsDisabledOrigin() {
         AutomaticZenRule startsDisabled = new AutomaticZenRule.Builder("Rule", Uri.EMPTY)
                 .setOwner(new ComponentName(mPkg, "SomeProvider"))
@@ -6792,7 +6552,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void updateAutomaticZenRule_disabling_recordsDisabledOrigin() {
         AutomaticZenRule startsEnabled = new AutomaticZenRule.Builder("Rule", Uri.EMPTY)
                 .setOwner(new ComponentName(mPkg, "SomeProvider"))
@@ -6815,7 +6575,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void updateAutomaticZenRule_keepingDisabled_preservesPreviousDisabledOrigin() {
         AutomaticZenRule startsEnabled = new AutomaticZenRule.Builder("Rule", Uri.EMPTY)
                 .setOwner(new ComponentName(mPkg, "SomeProvider"))
@@ -6845,7 +6605,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void updateAutomaticZenRule_enabling_clearsDisabledOrigin() {
         AutomaticZenRule startsEnabled = new AutomaticZenRule.Builder("Rule", Uri.EMPTY)
                 .setOwner(new ComponentName(mPkg, "SomeProvider"))
@@ -6875,7 +6635,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void setAutomaticZenRuleState_manualActivation_appliesOverride() {
         AutomaticZenRule rule = new AutomaticZenRule.Builder("Rule", Uri.parse("cond"))
                 .setPackage(mPkg)
@@ -6893,7 +6653,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void setAutomaticZenRuleState_manualActivationAndThenDeactivation_removesOverride() {
         AutomaticZenRule rule = new AutomaticZenRule.Builder("Rule", Uri.parse("cond"))
                 .setPackage(mPkg)
@@ -6930,7 +6690,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void setAutomaticZenRuleState_manualDeactivationAndThenReactivation_removesOverride() {
         AutomaticZenRule rule = new AutomaticZenRule.Builder("Rule", Uri.parse("cond"))
                 .setPackage(mPkg)
@@ -6976,7 +6736,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void setAutomaticZenRuleState_manualDeactivation_appliesOverride() {
         AutomaticZenRule rule = new AutomaticZenRule.Builder("Rule", Uri.parse("cond"))
                 .setPackage(mPkg)
@@ -7002,7 +6762,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void setAutomaticZenRuleState_ifManualActive_appCannotDeactivateBeforeActivating() {
         AutomaticZenRule rule = new AutomaticZenRule.Builder("Rule", Uri.parse("cond"))
                 .setPackage(mPkg)
@@ -7039,7 +6799,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void setAutomaticZenRuleState_ifManualInactive_appCannotReactivateBeforeDeactivating() {
         AutomaticZenRule rule = new AutomaticZenRule.Builder("Rule", Uri.parse("cond"))
                 .setPackage(mPkg)
@@ -7085,7 +6845,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void setAutomaticZenRuleState_withActivationOverride_userActionFromAppCanDeactivate() {
         AutomaticZenRule rule = new AutomaticZenRule.Builder("Rule", Uri.parse("cond"))
                 .setPackage(mPkg)
@@ -7109,7 +6869,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void setAutomaticZenRuleState_withDeactivationOverride_userActionFromAppCanActivate() {
         AutomaticZenRule rule = new AutomaticZenRule.Builder("Rule", Uri.parse("cond"))
                 .setPackage(mPkg)
@@ -7140,7 +6900,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void setAutomaticZenRuleState_manualActionFromApp_isNotOverride() {
         AutomaticZenRule rule = new AutomaticZenRule.Builder("Rule", Uri.parse("cond"))
                 .setPackage(mPkg)
@@ -7165,7 +6925,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void setAutomaticZenRuleState_implicitRuleManualActivation_doesNotUseOverride() {
         mContext.getTestablePermissions().setPermission(Manifest.permission.MANAGE_NOTIFICATIONS,
                 PERMISSION_GRANTED); // So that canManageAZR succeeds.
@@ -7188,7 +6948,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void setAutomaticZenRuleState_implicitRuleManualDeactivation_doesNotUseOverride() {
         mContext.getTestablePermissions().setPermission(Manifest.permission.MANAGE_NOTIFICATIONS,
                 PERMISSION_GRANTED); // So that canManageAZR succeeds.
@@ -7214,24 +6974,8 @@
     }
 
     @Test
-    @DisableFlags({FLAG_MODES_API, FLAG_MODES_UI})
-    public void testDefaultConfig_preModesApi_rulesAreBare() {
-        // Create a new user, which should get a copy of the default policy.
-        mZenModeHelper.onUserSwitched(101);
-
-        ZenRule eventsRule = mZenModeHelper.mConfig.automaticRules.get(
-                ZenModeConfig.EVENTS_OBSOLETE_RULE_ID);
-
-        assertThat(eventsRule).isNotNull();
-        assertThat(eventsRule.zenPolicy).isNull();
-        assertThat(eventsRule.type).isEqualTo(TYPE_UNKNOWN);
-        assertThat(eventsRule.triggerDescription).isNull();
-    }
-
-    @Test
-    @EnableFlags(FLAG_MODES_API)
     @DisableFlags(FLAG_MODES_UI)
-    public void testDefaultConfig_modesApi_rulesHaveFullPolicy() {
+    public void testDefaultConfig_rulesHaveFullPolicy() {
         // Create a new user, which should get a copy of the default policy.
         mZenModeHelper.onUserSwitched(201);
 
@@ -7245,7 +6989,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void testDefaultConfig_modesUi_rulesHaveFullPolicy() {
         // Create a new user, which should get a copy of the default policy.
         mZenModeHelper.onUserSwitched(301);
@@ -7260,7 +7004,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void setAutomaticZenRuleState_withManualActivation_activeOnReboot()
             throws Exception {
         AutomaticZenRule rule = new AutomaticZenRule.Builder("Rule", Uri.parse("cond"))
@@ -7298,7 +7042,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void setAutomaticZenRuleState_withManualDeactivation_clearedOnReboot()
             throws Exception {
         AutomaticZenRule rule = new AutomaticZenRule.Builder("Rule", Uri.parse("cond"))
@@ -7336,7 +7080,6 @@
     }
 
     @Test
-    @EnableFlags(FLAG_MODES_API)
     public void addAutomaticZenRule_withoutPolicy_getsItsOwnInstanceOfDefaultPolicy() {
         // Add a rule without policy -> uses default config
         AutomaticZenRule azr = new AutomaticZenRule.Builder("Rule", Uri.parse("cond"))
@@ -7352,7 +7095,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void readXml_withDisabledEventsRule_deletesIt() throws Exception {
         ZenRule rule = new ZenRule();
         rule.id = ZenModeConfig.EVENTS_OBSOLETE_RULE_ID;
@@ -7372,7 +7115,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void readXml_withEnabledEventsRule_keepsIt() throws Exception {
         ZenRule rule = new ZenRule();
         rule.id = ZenModeConfig.EVENTS_OBSOLETE_RULE_ID;
@@ -7392,7 +7135,7 @@
     }
 
     @Test
-    @EnableFlags({FLAG_MODES_API, FLAG_MODES_UI})
+    @EnableFlags(FLAG_MODES_UI)
     public void updateHasPriorityChannels_keepsChannelSettings() {
         setupZenConfig();
 
@@ -7574,7 +7317,6 @@
         return rule;
     }
 
-    // TODO: b/310620812 - Update setup methods to include allowChannels() when MODES_API is inlined
     private void setupZenConfig() {
         Policy customPolicy = new Policy(PRIORITY_CATEGORY_REMINDERS
                 | PRIORITY_CATEGORY_CALLS | PRIORITY_CATEGORY_MESSAGES
@@ -7583,7 +7325,7 @@
                 PRIORITY_SENDERS_STARRED,
                 PRIORITY_SENDERS_STARRED,
                 SUPPRESSED_EFFECT_BADGE,
-                0,
+                0, // allows priority channels.
                 CONVERSATION_SENDERS_IMPORTANT);
         mZenModeHelper.setNotificationPolicy(UserHandle.CURRENT, customPolicy, ORIGIN_UNKNOWN, 1);
         if (!Flags.modesUi()) {
@@ -7599,8 +7341,11 @@
         assertEquals(STATE_ALLOW, dndProto.getCalls().getNumber());
         assertEquals(PEOPLE_STARRED, dndProto.getAllowCallsFrom().getNumber());
         assertEquals(STATE_ALLOW, dndProto.getMessages().getNumber());
+        assertEquals(PEOPLE_STARRED, dndProto.getAllowMessagesFrom().getNumber());
         assertEquals(STATE_ALLOW, dndProto.getEvents().getNumber());
         assertEquals(STATE_ALLOW, dndProto.getRepeatCallers().getNumber());
+        assertEquals(STATE_ALLOW, dndProto.getConversations().getNumber());
+        assertEquals(CONV_IMPORTANT, dndProto.getAllowConversationsFrom().getNumber());
         assertEquals(STATE_ALLOW, dndProto.getFullscreen().getNumber());
         assertEquals(STATE_ALLOW, dndProto.getLights().getNumber());
         assertEquals(STATE_ALLOW, dndProto.getPeek().getNumber());
@@ -7616,7 +7361,7 @@
             return;
         }
 
-        // When modes_api flag is on, the default zen config is the device defaults.
+        // The default zen config is the device defaults.
         assertThat(dndProto.getAlarms().getNumber()).isEqualTo(STATE_ALLOW);
         assertThat(dndProto.getMedia().getNumber()).isEqualTo(STATE_ALLOW);
         assertThat(dndProto.getSystem().getNumber()).isEqualTo(STATE_DISALLOW);
@@ -7627,6 +7372,8 @@
         assertThat(dndProto.getAllowMessagesFrom().getNumber()).isEqualTo(PEOPLE_STARRED);
         assertThat(dndProto.getEvents().getNumber()).isEqualTo(STATE_DISALLOW);
         assertThat(dndProto.getRepeatCallers().getNumber()).isEqualTo(STATE_ALLOW);
+        assertThat(dndProto.getConversations().getNumber()).isEqualTo(STATE_ALLOW);
+        assertThat(dndProto.getAllowConversationsFrom().getNumber()).isEqualTo(CONV_IMPORTANT);
         assertThat(dndProto.getFullscreen().getNumber()).isEqualTo(STATE_DISALLOW);
         assertThat(dndProto.getLights().getNumber()).isEqualTo(STATE_DISALLOW);
         assertThat(dndProto.getPeek().getNumber()).isEqualTo(STATE_DISALLOW);
@@ -7634,6 +7381,8 @@
         assertThat(dndProto.getBadge().getNumber()).isEqualTo(STATE_ALLOW);
         assertThat(dndProto.getAmbient().getNumber()).isEqualTo(STATE_DISALLOW);
         assertThat(dndProto.getNotificationList().getNumber()).isEqualTo(STATE_ALLOW);
+        assertThat(dndProto.getAllowChannels().getNumber()).isEqualTo(
+                DNDProtoEnums.CHANNEL_POLICY_PRIORITY);
     }
 
     private static String getZenLog() {
@@ -7642,16 +7391,6 @@
         return zenLogWriter.toString();
     }
 
-    private static void withoutWtfCrash(Runnable test) {
-        Log.TerribleFailureHandler oldHandler = Log.setWtfHandler((tag, what, system) -> {
-        });
-        try {
-            test.run();
-        } finally {
-            Log.setWtfHandler(oldHandler);
-        }
-    }
-
     /**
      * Wrapper to use TypedXmlPullParser as XmlResourceParser for Resources.getXml()
      */
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ZenPolicyTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ZenPolicyTest.java
index 6433b76..8b93764 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ZenPolicyTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ZenPolicyTest.java
@@ -21,7 +21,6 @@
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.fail;
 
-import android.app.Flags;
 import android.os.Parcel;
 import android.platform.test.flag.junit.SetFlagsRule;
 import android.service.notification.ZenPolicy;
@@ -34,7 +33,6 @@
 
 import com.google.protobuf.nano.InvalidProtocolBufferNanoException;
 
-import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -50,11 +48,6 @@
     @Rule
     public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
 
-    @Before
-    public final void setUp() {
-        mSetFlagsRule.enableFlags(Flags.FLAG_MODES_API);
-    }
-
     @Test
     public void testZenPolicyApplyAllowedToDisallowed() {
         ZenPolicy.Builder builder = new ZenPolicy.Builder();
@@ -207,8 +200,6 @@
 
     @Test
     public void testZenPolicyApplyChannels_applyUnset() {
-        mSetFlagsRule.enableFlags(Flags.FLAG_MODES_API);
-
         ZenPolicy.Builder builder = new ZenPolicy.Builder();
         ZenPolicy unset = builder.build();
 
@@ -223,8 +214,6 @@
 
     @Test
     public void testZenPolicyApplyChannels_applyStricter() {
-        mSetFlagsRule.enableFlags(Flags.FLAG_MODES_API);
-
         ZenPolicy.Builder builder = new ZenPolicy.Builder();
         builder.allowPriorityChannels(false);
         ZenPolicy none = builder.build();
@@ -239,8 +228,6 @@
 
     @Test
     public void testZenPolicyApplyChannels_applyLooser() {
-        mSetFlagsRule.enableFlags(Flags.FLAG_MODES_API);
-
         ZenPolicy.Builder builder = new ZenPolicy.Builder();
         builder.allowPriorityChannels(false);
         ZenPolicy none = builder.build();
@@ -255,8 +242,6 @@
 
     @Test
     public void testZenPolicyApplyChannels_applySet() {
-        mSetFlagsRule.enableFlags(Flags.FLAG_MODES_API);
-
         ZenPolicy.Builder builder = new ZenPolicy.Builder();
         ZenPolicy unset = builder.build();
 
@@ -270,8 +255,6 @@
 
     @Test
     public void testZenPolicyOverwrite_allUnsetPolicies() {
-        mSetFlagsRule.enableFlags(Flags.FLAG_MODES_API);
-
         ZenPolicy.Builder builder = new ZenPolicy.Builder();
         ZenPolicy unset = builder.build();
 
@@ -292,8 +275,6 @@
 
     @Test
     public void testZenPolicyOverwrite_someOverlappingFields_takeNewPolicy() {
-        mSetFlagsRule.enableFlags(Flags.FLAG_MODES_API);
-
         ZenPolicy p1 = new ZenPolicy.Builder()
                 .allowCalls(ZenPolicy.PEOPLE_TYPE_CONTACTS)
                 .allowMessages(ZenPolicy.PEOPLE_TYPE_STARRED)
@@ -375,7 +356,6 @@
 
     @Test
     public void testEmptyZenPolicy_emptyChannels() {
-        mSetFlagsRule.enableFlags(Flags.FLAG_MODES_API);
         ZenPolicy.Builder builder = new ZenPolicy.Builder();
 
         ZenPolicy policy = builder.build();
@@ -688,22 +668,7 @@
     }
 
     @Test
-    public void testAllowChannels_noFlag() {
-        mSetFlagsRule.disableFlags(Flags.FLAG_MODES_API);
-
-        // allowChannels should be unset, not be modifiable, and not show up in any output
-        ZenPolicy.Builder builder = new ZenPolicy.Builder();
-        builder.allowPriorityChannels(true);
-        ZenPolicy policy = builder.build();
-
-        assertThat(policy.getPriorityChannelsAllowed()).isEqualTo(ZenPolicy.STATE_UNSET);
-        assertThat(policy.toString().contains("allowChannels")).isFalse();
-    }
-
-    @Test
     public void testAllowChannels() {
-        mSetFlagsRule.enableFlags(Flags.FLAG_MODES_API);
-
         // allow priority channels
         ZenPolicy.Builder builder = new ZenPolicy.Builder();
         builder.allowPriorityChannels(true);
diff --git a/services/tests/wmtests/src/com/android/server/policy/KeyGestureEventTests.java b/services/tests/wmtests/src/com/android/server/policy/KeyGestureEventTests.java
index c6b431c..8e2cea7 100644
--- a/services/tests/wmtests/src/com/android/server/policy/KeyGestureEventTests.java
+++ b/services/tests/wmtests/src/com/android/server/policy/KeyGestureEventTests.java
@@ -402,9 +402,6 @@
 
     @Test
     @EnableFlags({com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_SHORTCUT_CONTROL,
-            com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_BOUNCE_KEYS_FLAG,
-            com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_SLOW_KEYS_FLAG,
-            com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_STICKY_KEYS_FLAG,
             com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_MOUSE_KEYS})
     @DisableFlags(com.android.hardware.input.Flags.FLAG_USE_KEY_GESTURE_EVENT_HANDLER)
     public void testKeyboardAccessibilityToggleShortcutPress() {
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 440f43e..bb29614 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
@@ -2881,7 +2881,6 @@
         activity2.addStartingWindow(mPackageName, android.R.style.Theme, activity1, true, true,
                 false, true, false, false, false);
         waitUntilHandlersIdle();
-        assertFalse(mDisplayContent.mSkipAppTransitionAnimation);
         assertNoStartingWindow(activity1);
         assertHasStartingWindow(activity2);
     }
@@ -2965,7 +2964,6 @@
                 false /* newTask */, false /* isTaskSwitch */, null /* options */,
                 null /* sourceRecord */);
 
-        assertTrue(mDisplayContent.mSkipAppTransitionAnimation);
         assertNull(middle.mStartingWindow);
         assertHasStartingWindow(top);
         assertTrue(top.isVisible());
@@ -3265,26 +3263,6 @@
                 > activity.getConfiguration().windowConfiguration.getAppBounds().height());
     }
 
-    @Test
-    public void testSetVisibility_visibleToVisible() {
-        final ActivityRecord activity = new ActivityBuilder(mAtm)
-                .setCreateTask(true).build();
-        // By default, activity is visible.
-        assertTrue(activity.isVisible());
-        assertTrue(activity.isVisibleRequested());
-        assertFalse(activity.mDisplayContent.mClosingApps.contains(activity));
-
-        // Request the activity to be visible. Although the activity is already visible, app
-        // transition animation should be applied on this activity. This might be unnecessary, but
-        // until we verify no logic relies on this behavior, we'll keep this as is.
-        mDisplayContent.prepareAppTransition(0);
-        activity.setVisibility(true);
-        assertTrue(activity.isVisible());
-        assertTrue(activity.isVisibleRequested());
-        assertTrue(activity.mDisplayContent.mOpeningApps.contains(activity));
-        assertFalse(activity.mDisplayContent.mClosingApps.contains(activity));
-    }
-
     @SetupWindows(addWindows = W_ACTIVITY)
     @Test
     public void testSetVisibility_visibleToInvisible() {
@@ -3316,50 +3294,30 @@
     public void testSetVisibility_invisibleToVisible() {
         final ActivityRecord activity = new ActivityBuilder(mAtm)
                 .setCreateTask(true).setVisible(false).build();
-        // Activiby is invisible. However ATMS requests it to become visible, since this is a top
-        // activity.
         assertFalse(activity.isVisible());
-        assertTrue(activity.isVisibleRequested());
-        assertFalse(activity.mDisplayContent.mClosingApps.contains(activity));
+        assertFalse(activity.isVisibleRequested());
 
         // Request the activity to be visible. Since the visibility changes, app transition
         // animation should be applied on this activity.
-        activity.setVisibility(true);
+        requestTransition(activity, WindowManager.TRANSIT_OPEN);
+        mWm.mRoot.resumeFocusedTasksTopActivities();
         assertFalse(activity.isVisible());
         assertTrue(activity.isVisibleRequested());
-        assertTrue(activity.mDisplayContent.mOpeningApps.contains(activity));
-        assertFalse(activity.mDisplayContent.mClosingApps.contains(activity));
-
-        // There should still be animation (add to opening) if keyguard is going away while the
-        // screen is off because it will be visible after screen is turned on by unlocking.
-        mDisplayContent.mOpeningApps.remove(activity);
-        mDisplayContent.mClosingApps.remove(activity);
-        activity.commitVisibility(false /* visible */, false /* performLayout */);
-        mDisplayContent.getDisplayPolicy().screenTurnedOff(false /* acquireSleepToken */);
-        final KeyguardController controller = mSupervisor.getKeyguardController();
-        doReturn(true).when(controller).isKeyguardGoingAway(anyInt());
-        activity.setVisibility(true);
-        assertTrue(mDisplayContent.mOpeningApps.contains(activity));
+        assertTrue(activity.inTransition());
     }
 
     @Test
     public void testSetVisibility_invisibleToInvisible() {
         final ActivityRecord activity = new ActivityBuilder(mAtm)
                 .setCreateTask(true).setVisible(false).build();
-        // Activiby is invisible. However ATMS requests it to become visible, since this is a top
-        // activity.
-        assertFalse(activity.isVisible());
-        assertTrue(activity.isVisibleRequested());
-        assertTrue(activity.mDisplayContent.mOpeningApps.contains(activity));
-        assertFalse(activity.mDisplayContent.mClosingApps.contains(activity));
+        requestTransition(activity, WindowManager.TRANSIT_CLOSE);
 
         // Request the activity to be invisible. Since the activity is already invisible, no app
         // transition should be applied on this activity.
         activity.setVisibility(false);
         assertFalse(activity.isVisible());
         assertFalse(activity.isVisibleRequested());
-        assertFalse(activity.mDisplayContent.mOpeningApps.contains(activity));
-        assertFalse(activity.mDisplayContent.mClosingApps.contains(activity));
+        assertFalse(activity.inTransition());
     }
 
     @Test
diff --git a/services/tests/wmtests/src/com/android/server/wm/AnimatingActivityRegistryTest.java b/services/tests/wmtests/src/com/android/server/wm/AnimatingActivityRegistryTest.java
deleted file mode 100644
index 8871056..0000000
--- a/services/tests/wmtests/src/com/android/server/wm/AnimatingActivityRegistryTest.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.wm;
-
-import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
-
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.verifyZeroInteractions;
-import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_APP_TRANSITION;
-import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import android.platform.test.annotations.Presubmit;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-/**
- * Tests for the {@link ActivityStack} class.
- *
- * Build/Install/Run:
- *  atest WmTests:AnimatingActivityRegistryTest
- */
-@SmallTest
-@Presubmit
-@RunWith(WindowTestRunner.class)
-public class AnimatingActivityRegistryTest extends WindowTestsBase {
-
-    @Mock
-    AnimationAdapter mAdapter;
-
-    @Mock
-    Runnable mMockEndDeferFinishCallback1;
-    @Mock
-    Runnable mMockEndDeferFinishCallback2;
-
-    @Before
-    public void setUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
-    }
-
-    @Test
-    public void testDeferring() {
-        final ActivityRecord activity1 = createActivityRecord(mDisplayContent);
-        final ActivityRecord activity2 = createAppWindow(activity1.getTask(), ACTIVITY_TYPE_STANDARD,
-                "activity2").mActivityRecord;
-        final AnimatingActivityRegistry registry =
-                activity1.getRootTask().getAnimatingActivityRegistry();
-
-        activity1.startAnimation(activity1.getPendingTransaction(), mAdapter, false /* hidden */,
-                ANIMATION_TYPE_APP_TRANSITION);
-        activity2.startAnimation(activity1.getPendingTransaction(), mAdapter, false /* hidden */,
-                ANIMATION_TYPE_APP_TRANSITION);
-        assertTrue(activity1.isAnimating(TRANSITION));
-        assertTrue(activity2.isAnimating(TRANSITION));
-
-        // Make sure that first animation finish is deferred, second one is not deferred, and first
-        // one gets cancelled.
-        assertTrue(registry.notifyAboutToFinish(activity1, mMockEndDeferFinishCallback1));
-        assertFalse(registry.notifyAboutToFinish(activity2, mMockEndDeferFinishCallback2));
-        verify(mMockEndDeferFinishCallback1).run();
-        verifyZeroInteractions(mMockEndDeferFinishCallback2);
-    }
-
-    @Test
-    public void testContainerRemoved() {
-        final ActivityRecord window1 = createActivityRecord(mDisplayContent);
-        final ActivityRecord window2 = createAppWindow(window1.getTask(), ACTIVITY_TYPE_STANDARD,
-                "window2").mActivityRecord;
-        final AnimatingActivityRegistry registry =
-                window1.getRootTask().getAnimatingActivityRegistry();
-
-        window1.startAnimation(window1.getPendingTransaction(), mAdapter, false /* hidden */,
-                ANIMATION_TYPE_APP_TRANSITION);
-        window2.startAnimation(window1.getPendingTransaction(), mAdapter, false /* hidden */,
-                ANIMATION_TYPE_APP_TRANSITION);
-        assertTrue(window1.isAnimating(TRANSITION));
-        assertTrue(window2.isAnimating(TRANSITION));
-
-        // Make sure that first animation finish is deferred, and removing the second window stops
-        // finishes all pending deferred finishings.
-        registry.notifyAboutToFinish(window1, mMockEndDeferFinishCallback1);
-        window2.setParent(null);
-        verify(mMockEndDeferFinishCallback1).run();
-    }
-}
diff --git a/services/tests/wmtests/src/com/android/server/wm/AppTransitionControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/AppTransitionControllerTest.java
deleted file mode 100644
index c294bc6..0000000
--- a/services/tests/wmtests/src/com/android/server/wm/AppTransitionControllerTest.java
+++ /dev/null
@@ -1,1306 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.wm;
-
-import static android.app.WindowConfiguration.ACTIVITY_TYPE_DREAM;
-import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
-import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
-import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
-import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
-import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
-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_ACTIVITY_CLOSE;
-import static android.view.WindowManager.TRANSIT_OLD_ACTIVITY_OPEN;
-import static android.view.WindowManager.TRANSIT_OLD_DREAM_ACTIVITY_CLOSE;
-import static android.view.WindowManager.TRANSIT_OLD_DREAM_ACTIVITY_OPEN;
-import static android.view.WindowManager.TRANSIT_OLD_KEYGUARD_UNOCCLUDE;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_CHANGE_WINDOWING_MODE;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_FRAGMENT_CHANGE;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_FRAGMENT_CLOSE;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_FRAGMENT_OPEN;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_OPEN;
-import static android.view.WindowManager.TRANSIT_OPEN;
-import static android.view.WindowManager.TRANSIT_TO_FRONT;
-
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
-import static com.android.server.wm.WindowContainer.POSITION_BOTTOM;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.junit.Assume.assumeFalse;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.clearInvocations;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.verify;
-
-import android.annotation.Nullable;
-import android.graphics.Rect;
-import android.gui.DropInputMode;
-import android.os.Binder;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.platform.test.annotations.Presubmit;
-import android.util.ArraySet;
-import android.view.IRemoteAnimationFinishedCallback;
-import android.view.IRemoteAnimationRunner;
-import android.view.RemoteAnimationAdapter;
-import android.view.RemoteAnimationDefinition;
-import android.view.RemoteAnimationTarget;
-import android.view.WindowManager;
-import android.window.ITaskFragmentOrganizer;
-import android.window.TaskFragmentOrganizer;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-/**
- * Build/Install/Run:
- *  atest WmTests:AppTransitionControllerTest
- */
-@SmallTest
-@Presubmit
-@RunWith(WindowTestRunner.class)
-public class AppTransitionControllerTest extends WindowTestsBase {
-
-    private AppTransitionController mAppTransitionController;
-
-    @Before
-    public void setUp() throws Exception {
-        assumeFalse(WindowManagerService.sEnableShellTransitions);
-        mAppTransitionController = new AppTransitionController(mWm, mDisplayContent);
-        mWm.mAnimator.ready();
-    }
-
-    @Test
-    public void testSkipOccludedActivityCloseTransition() {
-        final ActivityRecord behind = createActivityRecord(mDisplayContent,
-                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
-        final ActivityRecord topOpening = createActivityRecord(behind.getTask());
-        topOpening.setOccludesParent(true);
-        topOpening.setVisible(true);
-
-        mDisplayContent.prepareAppTransition(TRANSIT_OPEN);
-        mDisplayContent.prepareAppTransition(TRANSIT_CLOSE);
-        mDisplayContent.mClosingApps.add(behind);
-
-        assertEquals(WindowManager.TRANSIT_OLD_UNSET,
-                AppTransitionController.getTransitCompatType(mDisplayContent.mAppTransition,
-                        mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
-                        mDisplayContent.mChangingContainers, null, null, false));
-    }
-
-    @Test
-    public void testClearTaskSkipAppExecuteTransition() {
-        final ActivityRecord behind = createActivityRecord(mDisplayContent,
-                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
-        final Task task = behind.getTask();
-        final ActivityRecord top = createActivityRecord(task);
-        top.setState(ActivityRecord.State.RESUMED, "test");
-        behind.setState(ActivityRecord.State.STARTED, "test");
-        behind.setVisibleRequested(true);
-
-        task.removeActivities("test", false /* excludingTaskOverlay */);
-        assertFalse(mDisplayContent.mAppTransition.isReady());
-    }
-
-    @Test
-    public void testTranslucentOpen() {
-        final ActivityRecord behind = createActivityRecord(mDisplayContent,
-                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
-        final ActivityRecord translucentOpening = createActivityRecord(mDisplayContent,
-                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
-        doReturn(false).when(translucentOpening).fillsParent();
-        translucentOpening.setVisible(false);
-        mDisplayContent.prepareAppTransition(TRANSIT_OPEN);
-        mDisplayContent.mOpeningApps.add(behind);
-        mDisplayContent.mOpeningApps.add(translucentOpening);
-
-        assertEquals(WindowManager.TRANSIT_OLD_TRANSLUCENT_ACTIVITY_OPEN,
-                AppTransitionController.getTransitCompatType(mDisplayContent.mAppTransition,
-                        mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
-                        mDisplayContent.mChangingContainers, null, null, false));
-    }
-
-    @Test
-    public void testTranslucentClose() {
-        final ActivityRecord behind = createActivityRecord(mDisplayContent,
-                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
-        final ActivityRecord translucentClosing = createActivityRecord(mDisplayContent,
-                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
-        doReturn(false).when(translucentClosing).fillsParent();
-        mDisplayContent.prepareAppTransition(TRANSIT_CLOSE);
-        mDisplayContent.mClosingApps.add(translucentClosing);
-        assertEquals(WindowManager.TRANSIT_OLD_TRANSLUCENT_ACTIVITY_CLOSE,
-                AppTransitionController.getTransitCompatType(mDisplayContent.mAppTransition,
-                        mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
-                        mDisplayContent.mChangingContainers, null, null, false));
-    }
-
-    @Test
-    public void testDreamActivityOpenTransition() {
-        final ActivityRecord dreamActivity = createActivityRecord(mDisplayContent,
-                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_DREAM);
-        mDisplayContent.prepareAppTransition(TRANSIT_OPEN);
-        mDisplayContent.mOpeningApps.add(dreamActivity);
-
-        assertEquals(TRANSIT_OLD_DREAM_ACTIVITY_OPEN,
-                AppTransitionController.getTransitCompatType(mDisplayContent.mAppTransition,
-                        mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
-                        mDisplayContent.mChangingContainers, null, null, false));
-    }
-
-    @Test
-    public void testDreamActivityCloseTransition() {
-        final ActivityRecord dreamActivity = createActivityRecord(mDisplayContent,
-                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_DREAM);
-        mDisplayContent.prepareAppTransition(TRANSIT_CLOSE);
-        mDisplayContent.mClosingApps.add(dreamActivity);
-
-        assertEquals(TRANSIT_OLD_DREAM_ACTIVITY_CLOSE,
-                AppTransitionController.getTransitCompatType(mDisplayContent.mAppTransition,
-                        mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
-                        mDisplayContent.mChangingContainers, null, null, false));
-    }
-
-    @Test
-    public void testChangeIsNotOverwritten() {
-        final ActivityRecord behind = createActivityRecord(mDisplayContent,
-                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
-        final ActivityRecord translucentOpening = createActivityRecord(mDisplayContent,
-                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
-        translucentOpening.setOccludesParent(false);
-        translucentOpening.setVisible(false);
-        mDisplayContent.prepareAppTransition(TRANSIT_CHANGE);
-        mDisplayContent.mOpeningApps.add(behind);
-        mDisplayContent.mOpeningApps.add(translucentOpening);
-        mDisplayContent.mChangingContainers.add(translucentOpening.getTask());
-        assertEquals(TRANSIT_OLD_TASK_CHANGE_WINDOWING_MODE,
-                AppTransitionController.getTransitCompatType(mDisplayContent.mAppTransition,
-                        mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
-                        mDisplayContent.mChangingContainers, null, null, false));
-    }
-
-    @Test
-    public void testTransitWithinTask() {
-        final ActivityRecord opening = createActivityRecord(mDisplayContent,
-                WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD);
-        opening.setOccludesParent(false);
-        final ActivityRecord closing = createActivityRecord(mDisplayContent,
-                WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD);
-        closing.setOccludesParent(false);
-        final Task task = opening.getTask();
-        mDisplayContent.mOpeningApps.add(opening);
-        mDisplayContent.mClosingApps.add(closing);
-        assertFalse(mAppTransitionController.isTransitWithinTask(TRANSIT_OLD_ACTIVITY_OPEN, task));
-        closing.getTask().removeChild(closing);
-        task.addChild(closing, 0);
-        assertTrue(mAppTransitionController.isTransitWithinTask(TRANSIT_OLD_ACTIVITY_OPEN, task));
-        assertFalse(mAppTransitionController.isTransitWithinTask(TRANSIT_OLD_TASK_OPEN, task));
-    }
-
-
-    @Test
-    public void testIntraWallpaper_open() {
-        final ActivityRecord opening = createActivityRecord(mDisplayContent,
-                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
-        opening.setVisible(false);
-        final WindowManager.LayoutParams attrOpening = new WindowManager.LayoutParams(
-                TYPE_BASE_APPLICATION);
-        attrOpening.setTitle("WallpaperOpening");
-        attrOpening.flags |= FLAG_SHOW_WALLPAPER;
-        final TestWindowState appWindowOpening = createWindowState(attrOpening, opening);
-        opening.addWindow(appWindowOpening);
-
-        final ActivityRecord closing = createActivityRecord(mDisplayContent,
-                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
-        final WindowManager.LayoutParams attrClosing = new WindowManager.LayoutParams(
-                TYPE_BASE_APPLICATION);
-        attrOpening.setTitle("WallpaperClosing");
-        attrClosing.flags |= FLAG_SHOW_WALLPAPER;
-        final TestWindowState appWindowClosing = createWindowState(attrClosing, closing);
-        closing.addWindow(appWindowClosing);
-
-        mDisplayContent.prepareAppTransition(TRANSIT_OPEN);
-        mDisplayContent.mOpeningApps.add(opening);
-        mDisplayContent.mClosingApps.add(closing);
-
-        assertEquals(WindowManager.TRANSIT_OLD_WALLPAPER_INTRA_OPEN,
-                AppTransitionController.getTransitCompatType(mDisplayContent.mAppTransition,
-                        mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
-                        mDisplayContent.mChangingContainers, appWindowClosing, null, false));
-    }
-
-    @Test
-    public void testIntraWallpaper_toFront() {
-        final ActivityRecord opening = createActivityRecord(mDisplayContent,
-                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
-        opening.setVisible(false);
-        final WindowManager.LayoutParams attrOpening = new WindowManager.LayoutParams(
-                TYPE_BASE_APPLICATION);
-        attrOpening.setTitle("WallpaperOpening");
-        attrOpening.flags |= FLAG_SHOW_WALLPAPER;
-        final TestWindowState appWindowOpening = createWindowState(attrOpening, opening);
-        opening.addWindow(appWindowOpening);
-
-        final ActivityRecord closing = createActivityRecord(mDisplayContent,
-                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
-        final WindowManager.LayoutParams attrClosing = new WindowManager.LayoutParams(
-                TYPE_BASE_APPLICATION);
-        attrOpening.setTitle("WallpaperClosing");
-        attrClosing.flags |= FLAG_SHOW_WALLPAPER;
-        final TestWindowState appWindowClosing = createWindowState(attrClosing, closing);
-        closing.addWindow(appWindowClosing);
-
-        mDisplayContent.prepareAppTransition(TRANSIT_TO_FRONT);
-        mDisplayContent.mOpeningApps.add(opening);
-        mDisplayContent.mClosingApps.add(closing);
-
-        assertEquals(WindowManager.TRANSIT_OLD_WALLPAPER_INTRA_OPEN,
-                AppTransitionController.getTransitCompatType(mDisplayContent.mAppTransition,
-                        mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
-                        mDisplayContent.mChangingContainers, appWindowClosing, null, false));
-    }
-
-    @Test
-    public void testGetAnimationTargets_visibilityAlreadyUpdated() {
-        // [DisplayContent] -+- [Task1] - [ActivityRecord1] (opening, visible)
-        //                   +- [Task2] - [ActivityRecord2] (closing, invisible)
-        final ActivityRecord activity1 = createActivityRecord(mDisplayContent);
-
-        final ActivityRecord activity2 = createActivityRecord(mDisplayContent);
-        activity2.setVisible(false);
-        activity2.setVisibleRequested(false);
-
-        final ArraySet<ActivityRecord> opening = new ArraySet<>();
-        opening.add(activity1);
-        final ArraySet<ActivityRecord> closing = new ArraySet<>();
-        closing.add(activity2);
-
-        // No animation, since visibility of the opening and closing apps are already updated
-        // outside of AppTransition framework.
-        assertEquals(
-                new ArraySet<>(),
-                AppTransitionController.getAnimationTargets(
-                        opening, closing, true /* visible */));
-        assertEquals(
-                new ArraySet<>(),
-                AppTransitionController.getAnimationTargets(
-                        opening, closing, false /* visible */));
-    }
-
-    @Test
-    public void testGetAnimationTargets_visibilityAlreadyUpdated_butForcedTransitionRequested() {
-        // [DisplayContent] -+- [Task1] - [ActivityRecord1] (closing, invisible)
-        //                   +- [Task2] - [ActivityRecord2] (opening, visible)
-        final ActivityRecord activity1 = createActivityRecord(mDisplayContent);
-        activity1.setVisible(true);
-        activity1.setVisibleRequested(true);
-        activity1.mRequestForceTransition = true;
-
-        final ActivityRecord activity2 = createActivityRecord(mDisplayContent);
-        activity2.setVisible(false);
-        activity2.setVisibleRequested(false);
-        activity2.mRequestForceTransition = true;
-
-        final ArraySet<ActivityRecord> opening = new ArraySet<>();
-        opening.add(activity1);
-        final ArraySet<ActivityRecord> closing = new ArraySet<>();
-        closing.add(activity2);
-
-        // The visibility are already updated, but since forced transition is requested, it will
-        // be included.
-        assertEquals(
-                new ArraySet<>(new WindowContainer[]{activity1.getRootTask()}),
-                AppTransitionController.getAnimationTargets(
-                        opening, closing, true /* visible */));
-        assertEquals(
-                new ArraySet<>(new WindowContainer[]{activity2.getRootTask()}),
-                AppTransitionController.getAnimationTargets(
-                        opening, closing, false /* visible */));
-    }
-
-    @Test
-    public void testGetAnimationTargets_exitingBeforeTransition() {
-        // Create another non-empty task so the animation target won't promote to task display area.
-        createActivityRecord(mDisplayContent);
-        final ActivityRecord activity = createActivityRecord(mDisplayContent);
-        activity.setVisible(false);
-        activity.mIsExiting = true;
-
-        final ArraySet<ActivityRecord> closing = new ArraySet<>();
-        closing.add(activity);
-
-        // Animate closing apps even if it's not visible when it is exiting before we had a chance
-        // to play the transition animation.
-        assertEquals(
-                new ArraySet<>(new WindowContainer[]{activity.getRootTask()}),
-                AppTransitionController.getAnimationTargets(
-                        new ArraySet<>(), closing, false /* visible */));
-    }
-
-    @Test
-    public void testExitAnimationDone_beforeAppTransition() {
-        final Task task = createTask(mDisplayContent);
-        final WindowState win = createAppWindow(task, ACTIVITY_TYPE_STANDARD, "Win");
-        spyOn(win);
-        win.mAnimatingExit = true;
-        mDisplayContent.mAppTransition.setTimeout();
-        mDisplayContent.mAppTransitionController.handleAppTransitionReady();
-
-        verify(win).onExitAnimationDone();
-    }
-
-    @Test
-    public void testGetAnimationTargets_openingClosingInDifferentTask() {
-        // [DisplayContent] -+- [Task1] -+- [ActivityRecord1] (opening, invisible)
-        //                   |           +- [ActivityRecord2] (invisible)
-        //                   |
-        //                   +- [Task2] -+- [ActivityRecord3] (closing, visible)
-        //                               +- [ActivityRecord4] (invisible)
-        final ActivityRecord activity1 = createActivityRecord(mDisplayContent);
-        activity1.setVisible(false);
-        activity1.setVisibleRequested(true);
-        final ActivityRecord activity2 = createActivityRecord(mDisplayContent,
-                activity1.getTask());
-        activity2.setVisible(false);
-        activity2.setVisibleRequested(false);
-
-        final ActivityRecord activity3 = createActivityRecord(mDisplayContent);
-        final ActivityRecord activity4 = createActivityRecord(mDisplayContent,
-                activity3.getTask());
-        activity4.setVisible(false);
-        activity4.setVisibleRequested(false);
-
-        final ArraySet<ActivityRecord> opening = new ArraySet<>();
-        opening.add(activity1);
-        final ArraySet<ActivityRecord> closing = new ArraySet<>();
-        closing.add(activity3);
-
-        // Promote animation targets to root Task level. Invisible ActivityRecords don't affect
-        // promotion decision.
-        assertEquals(
-                new ArraySet<>(new WindowContainer[]{activity1.getRootTask()}),
-                AppTransitionController.getAnimationTargets(
-                        opening, closing, true /* visible */));
-        assertEquals(
-                new ArraySet<>(new WindowContainer[]{activity3.getRootTask()}),
-                AppTransitionController.getAnimationTargets(
-                        opening, closing, false /* visible */));
-    }
-
-    @Test
-    public void testGetAnimationTargets_openingClosingInSameTask() {
-        // [DisplayContent] - [Task] -+- [ActivityRecord1] (opening, invisible)
-        //                            +- [ActivityRecord2] (closing, visible)
-        final ActivityRecord activity1 = createActivityRecord(mDisplayContent);
-        activity1.setVisible(false);
-        activity1.setVisibleRequested(true);
-        final ActivityRecord activity2 = createActivityRecord(mDisplayContent,
-                activity1.getTask());
-
-        final ArraySet<ActivityRecord> opening = new ArraySet<>();
-        opening.add(activity1);
-        final ArraySet<ActivityRecord> closing = new ArraySet<>();
-        closing.add(activity2);
-
-        // Don't promote an animation target to Task level, since the same task contains both
-        // opening and closing app.
-        assertEquals(
-                new ArraySet<>(new WindowContainer[]{activity1}),
-                AppTransitionController.getAnimationTargets(
-                        opening, closing, true /* visible */));
-        assertEquals(
-                new ArraySet<>(new WindowContainer[]{activity2}),
-                AppTransitionController.getAnimationTargets(
-                        opening, closing, false /* visible */));
-    }
-
-    @Test
-    public void testGetAnimationTargets_animateOnlyTranslucentApp() {
-        // [DisplayContent] -+- [Task1] -+- [ActivityRecord1] (opening, invisible)
-        //                   |           +- [ActivityRecord2] (visible)
-        //                   |
-        //                   +- [Task2] -+- [ActivityRecord3] (closing, visible)
-        //                               +- [ActivityRecord4] (visible)
-
-        final ActivityRecord activity1 = createActivityRecord(mDisplayContent);
-        activity1.setVisible(false);
-        activity1.setVisibleRequested(true);
-        activity1.setOccludesParent(false);
-
-        final ActivityRecord activity2 = createActivityRecord(mDisplayContent,
-                activity1.getTask());
-
-        final ActivityRecord activity3 = createActivityRecord(mDisplayContent);
-        activity3.setOccludesParent(false);
-        final ActivityRecord activity4 = createActivityRecord(mDisplayContent,
-                activity3.getTask());
-
-        final ArraySet<ActivityRecord> opening = new ArraySet<>();
-        opening.add(activity1);
-        final ArraySet<ActivityRecord> closing = new ArraySet<>();
-        closing.add(activity3);
-
-        // Don't promote an animation target to Task level, since opening (closing) app is
-        // translucent and is displayed over other non-animating app.
-        assertEquals(
-                new ArraySet<>(new WindowContainer[]{activity1}),
-                AppTransitionController.getAnimationTargets(
-                        opening, closing, true /* visible */));
-        assertEquals(
-                new ArraySet<>(new WindowContainer[]{activity3}),
-                AppTransitionController.getAnimationTargets(
-                        opening, closing, false /* visible */));
-    }
-
-    @Test
-    public void testGetAnimationTargets_animateTranslucentAndOpaqueApps() {
-        // [DisplayContent] -+- [Task1] -+- [ActivityRecord1] (opening, invisible)
-        //                   |           +- [ActivityRecord2] (opening, invisible)
-        //                   |
-        //                   +- [Task2] -+- [ActivityRecord3] (closing, visible)
-        //                               +- [ActivityRecord4] (closing, visible)
-
-        final ActivityRecord activity1 = createActivityRecord(mDisplayContent);
-        activity1.setVisible(false);
-        activity1.setVisibleRequested(true);
-        activity1.setOccludesParent(false);
-
-        final ActivityRecord activity2 = createActivityRecord(mDisplayContent,
-                activity1.getTask());
-        activity2.setVisible(false);
-        activity2.setVisibleRequested(true);
-
-        final ActivityRecord activity3 = createActivityRecord(mDisplayContent);
-        activity3.setOccludesParent(false);
-        final ActivityRecord activity4 = createActivityRecord(mDisplayContent,
-                activity3.getTask());
-
-        final ArraySet<ActivityRecord> opening = new ArraySet<>();
-        opening.add(activity1);
-        opening.add(activity2);
-        final ArraySet<ActivityRecord> closing = new ArraySet<>();
-        closing.add(activity3);
-        closing.add(activity4);
-
-        // Promote animation targets to TaskStack level even though opening (closing) app is
-        // translucent as long as all visible siblings animate at the same time.
-        assertEquals(
-                new ArraySet<>(new WindowContainer[]{activity1.getRootTask()}),
-                AppTransitionController.getAnimationTargets(
-                        opening, closing, true /* visible */));
-        assertEquals(
-                new ArraySet<>(new WindowContainer[]{activity3.getRootTask()}),
-                AppTransitionController.getAnimationTargets(
-                        opening, closing, false /* visible */));
-    }
-
-    @Test
-    public void testGetAnimationTargets_taskContainsMultipleTasks() {
-        // [DisplayContent] - [Task] -+- [Task1] - [ActivityRecord1] (opening, invisible)
-        //                            +- [Task2] - [ActivityRecord2] (closing, visible)
-        final Task parentTask = createTask(mDisplayContent);
-        final ActivityRecord activity1 = createActivityRecordWithParentTask(parentTask);
-        activity1.setVisible(false);
-        activity1.setVisibleRequested(true);
-        final ActivityRecord activity2 = createActivityRecordWithParentTask(parentTask);
-
-        final ArraySet<ActivityRecord> opening = new ArraySet<>();
-        opening.add(activity1);
-        final ArraySet<ActivityRecord> closing = new ArraySet<>();
-        closing.add(activity2);
-
-        // Promote animation targets up to Task level, not beyond.
-        assertEquals(
-                new ArraySet<>(new WindowContainer[]{activity1.getTask()}),
-                AppTransitionController.getAnimationTargets(
-                        opening, closing, true /* visible */));
-        assertEquals(
-                new ArraySet<>(new WindowContainer[]{activity2.getTask()}),
-                AppTransitionController.getAnimationTargets(
-                        opening, closing, false /* visible */));
-    }
-
-    @Test
-    public void testGetAnimationTargets_splitScreenOpening() {
-        // [DisplayContent] - [Task] -+- [split task 1] -+- [Task1] - [AR1] (opening, invisible)
-        //                            +- [split task 2] -+- [Task2] - [AR2] (opening, invisible)
-        final Task singleTopRoot = createTask(mDisplayContent);
-        final TaskBuilder builder = new TaskBuilder(mSupervisor)
-                .setWindowingMode(WINDOWING_MODE_MULTI_WINDOW)
-                .setParentTask(singleTopRoot)
-                .setCreatedByOrganizer(true);
-        final Task splitRoot1 = builder.build();
-        final Task splitRoot2 = builder.build();
-        splitRoot1.setAdjacentTaskFragment(splitRoot2);
-        final ActivityRecord activity1 = createActivityRecordWithParentTask(splitRoot1);
-        activity1.setVisible(false);
-        activity1.setVisibleRequested(true);
-        final ActivityRecord activity2 = createActivityRecordWithParentTask(splitRoot2);
-        activity2.setVisible(false);
-        activity2.setVisibleRequested(true);
-
-        final ArraySet<ActivityRecord> opening = new ArraySet<>();
-        opening.add(activity1);
-        opening.add(activity2);
-        final ArraySet<ActivityRecord> closing = new ArraySet<>();
-
-        // Promote animation targets up to Task level, not beyond.
-        assertEquals(
-                new ArraySet<>(new WindowContainer[]{splitRoot1, splitRoot2}),
-                AppTransitionController.getAnimationTargets(
-                        opening, closing, true /* visible */));
-    }
-
-    @Test
-    public void testGetAnimationTargets_openingClosingTaskFragment() {
-        // [DefaultTDA] - [Task] -+- [TaskFragment1] - [ActivityRecord1] (opening, invisible)
-        //                        +- [TaskFragment2] - [ActivityRecord2] (closing, visible)
-        final Task parentTask = createTask(mDisplayContent);
-        final TaskFragment taskFragment1 = createTaskFragmentWithActivity(parentTask);
-        final ActivityRecord activity1 = taskFragment1.getTopMostActivity();
-        activity1.setVisible(false);
-        activity1.setVisibleRequested(true);
-
-        final TaskFragment taskFragment2 = createTaskFragmentWithActivity(parentTask);
-        final ActivityRecord activity2 = taskFragment2.getTopMostActivity();
-        activity2.setVisible(true);
-        activity2.setVisibleRequested(false);
-
-        final ArraySet<ActivityRecord> opening = new ArraySet<>();
-        opening.add(activity1);
-        final ArraySet<ActivityRecord> closing = new ArraySet<>();
-        closing.add(activity2);
-
-        // Promote animation targets up to TaskFragment level, not beyond.
-        assertEquals(new ArraySet<>(new WindowContainer[]{taskFragment1}),
-                AppTransitionController.getAnimationTargets(
-                        opening, closing, true /* visible */));
-        assertEquals(new ArraySet<>(new WindowContainer[]{taskFragment2}),
-                AppTransitionController.getAnimationTargets(
-                        opening, closing, false /* visible */));
-    }
-
-    @Test
-    public void testGetAnimationTargets_openingTheOnlyTaskFragmentInTask() {
-        // [DefaultTDA] -+- [Task1] - [TaskFragment1] - [ActivityRecord1] (opening, invisible)
-        //               +- [Task2] - [ActivityRecord2] (closing, visible)
-        final Task task1 = createTask(mDisplayContent);
-        final TaskFragment taskFragment1 = createTaskFragmentWithActivity(task1);
-        final ActivityRecord activity1 = taskFragment1.getTopMostActivity();
-        activity1.setVisible(false);
-        activity1.setVisibleRequested(true);
-
-        final ActivityRecord activity2 = createActivityRecord(mDisplayContent);
-        activity2.setVisible(true);
-        activity2.setVisibleRequested(false);
-
-        final ArraySet<ActivityRecord> opening = new ArraySet<>();
-        opening.add(activity1);
-        final ArraySet<ActivityRecord> closing = new ArraySet<>();
-        closing.add(activity2);
-
-        // Promote animation targets up to leaf Task level because there's only one TaskFragment in
-        // the Task.
-        assertEquals(new ArraySet<>(new WindowContainer[]{task1}),
-                AppTransitionController.getAnimationTargets(
-                        opening, closing, true /* visible */));
-        assertEquals(new ArraySet<>(new WindowContainer[]{activity2.getTask()}),
-                AppTransitionController.getAnimationTargets(
-                        opening, closing, false /* visible */));
-    }
-
-    @Test
-    public void testGetAnimationTargets_closingTheOnlyTaskFragmentInTask() {
-        // [DefaultTDA] -+- [Task1] - [TaskFragment1] - [ActivityRecord1] (closing, visible)
-        //               +- [Task2] - [ActivityRecord2] (opening, invisible)
-        final Task task1 = createTask(mDisplayContent);
-        final TaskFragment taskFragment1 = createTaskFragmentWithActivity(task1);
-        final ActivityRecord activity1 = taskFragment1.getTopMostActivity();
-        activity1.setVisible(true);
-        activity1.setVisibleRequested(false);
-
-        final ActivityRecord activity2 = createActivityRecord(mDisplayContent);
-        activity2.setVisible(false);
-        activity2.setVisibleRequested(true);
-
-        final ArraySet<ActivityRecord> opening = new ArraySet<>();
-        opening.add(activity2);
-        final ArraySet<ActivityRecord> closing = new ArraySet<>();
-        closing.add(activity1);
-
-        // Promote animation targets up to leaf Task level because there's only one TaskFragment in
-        // the Task.
-        assertEquals(new ArraySet<>(new WindowContainer[]{activity2.getTask()}),
-                AppTransitionController.getAnimationTargets(
-                        opening, closing, true /* visible */));
-        assertEquals(new ArraySet<>(new WindowContainer[]{task1}),
-                AppTransitionController.getAnimationTargets(
-                        opening, closing, false /* visible */));
-    }
-
-    @Test
-    public void testGetAnimationTargets_embeddedTask() {
-        // [DisplayContent] -+- [Task1] -            [ActivityRecord1] (opening, invisible)
-        //                   +- [Task2] (embedded) - [ActivityRecord2] (opening, invisible)
-        final ActivityRecord activity1 = createActivityRecord(mDisplayContent);
-        activity1.setVisible(false);
-        activity1.setVisibleRequested(true);
-
-        final Task task2 = createTask(mDisplayContent);
-        task2.mRemoveWithTaskOrganizer = true;
-        final ActivityRecord activity2 = createActivityRecord(task2);
-        activity2.setVisible(false);
-        activity2.setVisibleRequested(true);
-
-        final ArraySet<ActivityRecord> opening = new ArraySet<>();
-        opening.add(activity1);
-        opening.add(activity2);
-        final ArraySet<ActivityRecord> closing = new ArraySet<>();
-
-        // No animation on the embedded task.
-        assertEquals(
-                new ArraySet<>(new WindowContainer[]{activity1.getTask()}),
-                AppTransitionController.getAnimationTargets(
-                        opening, closing, true /* visible */));
-        assertEquals(
-                new ArraySet<>(),
-                AppTransitionController.getAnimationTargets(
-                        opening, closing, false /* visible */));
-    }
-
-
-    @Test
-    public void testGetAnimationTargets_activityInEmbeddedTask() {
-        // [DisplayContent] - [Task] (embedded)-+- [ActivityRecord1] (opening, invisible)
-        //                                      +- [ActivityRecord2] (closing, visible)
-        final Task task = createTask(mDisplayContent);
-        task.mRemoveWithTaskOrganizer = true;
-
-        final ActivityRecord activity1 = createActivityRecord(task);
-        activity1.setVisible(false);
-        activity1.setVisibleRequested(true);
-        final ActivityRecord activity2 = createActivityRecord(task);
-
-        final ArraySet<ActivityRecord> opening = new ArraySet<>();
-        opening.add(activity1);
-        final ArraySet<ActivityRecord> closing = new ArraySet<>();
-        closing.add(activity2);
-
-        // Even though embedded task itself doesn't animate, activities in an embedded task
-        // animate.
-        assertEquals(
-                new ArraySet<>(new WindowContainer[]{activity1}),
-                AppTransitionController.getAnimationTargets(
-                        opening, closing, true /* visible */));
-        assertEquals(
-                new ArraySet<>(new WindowContainer[]{activity2}),
-                AppTransitionController.getAnimationTargets(
-                        opening, closing, false /* visible */));
-    }
-
-    static class TestRemoteAnimationRunner implements IRemoteAnimationRunner {
-        private IRemoteAnimationFinishedCallback mFinishedCallback;
-
-        @Override
-        public void onAnimationStart(int transit, RemoteAnimationTarget[] apps,
-                RemoteAnimationTarget[] wallpapers, RemoteAnimationTarget[] nonApps,
-                IRemoteAnimationFinishedCallback finishedCallback) throws RemoteException {
-            mFinishedCallback = finishedCallback;
-        }
-
-        @Override
-        public void onAnimationCancelled() throws RemoteException {
-            mFinishedCallback = null;
-        }
-
-        @Override
-        public IBinder asBinder() {
-            return new Binder();
-        }
-
-        boolean isAnimationStarted() {
-            return mFinishedCallback != null;
-        }
-
-        void finishAnimation() {
-            try {
-                mFinishedCallback.onAnimationFinished();
-            } catch (RemoteException e) {
-                fail();
-            }
-        }
-    }
-
-    @Test
-    public void testGetRemoteAnimationOverrideEmpty() {
-        final ActivityRecord activity = createActivityRecord(mDisplayContent);
-        assertNull(mAppTransitionController.getRemoteAnimationOverride(activity,
-                TRANSIT_OLD_ACTIVITY_OPEN, new ArraySet<Integer>()));
-    }
-
-    @Test
-    public void testGetRemoteAnimationOverrideWindowContainer() {
-        final ActivityRecord activity = createActivityRecord(mDisplayContent);
-        final RemoteAnimationDefinition definition = new RemoteAnimationDefinition();
-        final RemoteAnimationAdapter adapter = new RemoteAnimationAdapter(
-                new TestRemoteAnimationRunner(), 10, 1);
-        definition.addRemoteAnimation(TRANSIT_OLD_ACTIVITY_OPEN, adapter);
-        activity.registerRemoteAnimations(definition);
-
-        assertEquals(adapter,
-                mAppTransitionController.getRemoteAnimationOverride(
-                        activity, TRANSIT_OLD_ACTIVITY_OPEN, new ArraySet<Integer>()));
-        assertNull(mAppTransitionController.getRemoteAnimationOverride(
-                        null, TRANSIT_OLD_ACTIVITY_OPEN, new ArraySet<Integer>()));
-    }
-
-    @Test
-    public void testGetRemoteAnimationOverrideTransitionController() {
-        final ActivityRecord activity = createActivityRecord(mDisplayContent);
-        final RemoteAnimationDefinition definition = new RemoteAnimationDefinition();
-        final RemoteAnimationAdapter adapter = new RemoteAnimationAdapter(
-                new TestRemoteAnimationRunner(), 10, 1);
-        definition.addRemoteAnimation(TRANSIT_OLD_ACTIVITY_OPEN, adapter);
-        mAppTransitionController.registerRemoteAnimations(definition);
-
-        assertEquals(adapter,
-                mAppTransitionController.getRemoteAnimationOverride(
-                        activity, TRANSIT_OLD_ACTIVITY_OPEN, new ArraySet<Integer>()));
-        assertEquals(adapter,
-                mAppTransitionController.getRemoteAnimationOverride(
-                        null, TRANSIT_OLD_ACTIVITY_OPEN, new ArraySet<Integer>()));
-    }
-
-    @Test
-    public void testGetRemoteAnimationOverrideBoth() {
-        final ActivityRecord activity = createActivityRecord(mDisplayContent);
-        final RemoteAnimationDefinition definition1 = new RemoteAnimationDefinition();
-        final RemoteAnimationAdapter adapter1 = new RemoteAnimationAdapter(
-                new TestRemoteAnimationRunner(), 10, 1);
-        definition1.addRemoteAnimation(TRANSIT_OLD_ACTIVITY_OPEN, adapter1);
-        activity.registerRemoteAnimations(definition1);
-
-        final RemoteAnimationDefinition definition2 = new RemoteAnimationDefinition();
-        final RemoteAnimationAdapter adapter2 = new RemoteAnimationAdapter(
-                new TestRemoteAnimationRunner(), 10, 1);
-        definition2.addRemoteAnimation(TRANSIT_OLD_KEYGUARD_UNOCCLUDE, adapter2);
-        mAppTransitionController.registerRemoteAnimations(definition2);
-
-        assertEquals(adapter2,
-                mAppTransitionController.getRemoteAnimationOverride(
-                        activity, TRANSIT_OLD_KEYGUARD_UNOCCLUDE, new ArraySet<Integer>()));
-        assertEquals(adapter2,
-                mAppTransitionController.getRemoteAnimationOverride(
-                        null, TRANSIT_OLD_KEYGUARD_UNOCCLUDE, new ArraySet<Integer>()));
-    }
-
-    @Test
-    public void testGetRemoteAnimationOverrideWindowContainerHasPriority() {
-        final ActivityRecord activity = createActivityRecord(mDisplayContent);
-        final RemoteAnimationDefinition definition1 = new RemoteAnimationDefinition();
-        final RemoteAnimationAdapter adapter1 = new RemoteAnimationAdapter(
-                new TestRemoteAnimationRunner(), 10, 1);
-        definition1.addRemoteAnimation(TRANSIT_OLD_ACTIVITY_OPEN, adapter1);
-        activity.registerRemoteAnimations(definition1);
-
-        final RemoteAnimationDefinition definition2 = new RemoteAnimationDefinition();
-        final RemoteAnimationAdapter adapter2 = new RemoteAnimationAdapter(
-                new TestRemoteAnimationRunner(), 10, 1);
-        definition2.addRemoteAnimation(TRANSIT_OLD_ACTIVITY_OPEN, adapter2);
-        mAppTransitionController.registerRemoteAnimations(definition2);
-
-        assertEquals(adapter1,
-                mAppTransitionController.getRemoteAnimationOverride(
-                        activity, TRANSIT_OLD_ACTIVITY_OPEN, new ArraySet<Integer>()));
-    }
-
-    @Test
-    public void testOverrideTaskFragmentAdapter_overrideWithEmbeddedActivity() {
-        final Task task = createTask(mDisplayContent);
-        final TaskFragmentOrganizer organizer = new TaskFragmentOrganizer(Runnable::run);
-        final TestRemoteAnimationRunner remoteAnimationRunner = new TestRemoteAnimationRunner();
-        setupTaskFragmentRemoteAnimation(organizer, remoteAnimationRunner);
-
-        // Create a TaskFragment with embedded activity.
-        final TaskFragment taskFragment = createTaskFragmentWithEmbeddedActivity(task, organizer);
-        final ActivityRecord activity = taskFragment.getTopMostActivity();
-        prepareActivityForAppTransition(activity);
-        spyOn(mDisplayContent.mAppTransition);
-
-        // Prepare and start transition.
-        prepareAndTriggerAppTransition(activity, null /* closingActivity */, taskFragment);
-        waitUntilWindowAnimatorIdle();
-
-        // Animation run by the remote handler.
-        assertTrue(remoteAnimationRunner.isAnimationStarted());
-    }
-
-    @Test
-    public void testOverrideTaskFragmentAdapter_noOverrideWithOnlyTaskFragmentFillingTask() {
-        final Task task = createTask(mDisplayContent);
-        final ActivityRecord closingActivity = createActivityRecord(task);
-        final TaskFragmentOrganizer organizer = new TaskFragmentOrganizer(Runnable::run);
-        final TestRemoteAnimationRunner remoteAnimationRunner = new TestRemoteAnimationRunner();
-        setupTaskFragmentRemoteAnimation(organizer, remoteAnimationRunner);
-
-        // Create a TaskFragment with embedded activity.
-        final TaskFragment taskFragment = createTaskFragmentWithEmbeddedActivity(task, organizer);
-
-        // Make sure the TaskFragment is not embedded.
-        assertFalse(taskFragment.isEmbeddedWithBoundsOverride());
-        final ActivityRecord openingActivity = taskFragment.getTopMostActivity();
-        prepareActivityForAppTransition(closingActivity);
-        prepareActivityForAppTransition(openingActivity);
-        final int uid = 12345;
-        closingActivity.info.applicationInfo.uid = uid;
-        openingActivity.info.applicationInfo.uid = uid;
-        task.effectiveUid = uid;
-        spyOn(mDisplayContent.mAppTransition);
-
-        // Prepare and start transition.
-        prepareAndTriggerAppTransition(openingActivity, closingActivity,
-                null /* changingTaskFragment */);
-        waitUntilWindowAnimatorIdle();
-
-        // Animation is not run by the remote handler because the activity is filling the Task.
-        assertFalse(remoteAnimationRunner.isAnimationStarted());
-    }
-
-    @Test
-    public void testOverrideTaskFragmentAdapter_overrideWithTaskFragmentNotFillingTask() {
-        final Task task = createTask(mDisplayContent);
-        final ActivityRecord closingActivity = createActivityRecord(task);
-        final TaskFragmentOrganizer organizer = new TaskFragmentOrganizer(Runnable::run);
-        final TestRemoteAnimationRunner remoteAnimationRunner = new TestRemoteAnimationRunner();
-        setupTaskFragmentRemoteAnimation(organizer, remoteAnimationRunner);
-
-        // Create a TaskFragment with embedded activity.
-        final TaskFragment taskFragment = createTaskFragmentWithEmbeddedActivity(task, organizer);
-
-        // Make sure the TaskFragment is embedded.
-        taskFragment.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
-        final Rect embeddedBounds = new Rect(task.getBounds());
-        embeddedBounds.right = embeddedBounds.left + embeddedBounds.width() / 2;
-        taskFragment.setBounds(embeddedBounds);
-        assertTrue(taskFragment.isEmbeddedWithBoundsOverride());
-        final ActivityRecord openingActivity = taskFragment.getTopMostActivity();
-        prepareActivityForAppTransition(closingActivity);
-        prepareActivityForAppTransition(openingActivity);
-        final int uid = 12345;
-        closingActivity.info.applicationInfo.uid = uid;
-        openingActivity.info.applicationInfo.uid = uid;
-        task.effectiveUid = uid;
-        spyOn(mDisplayContent.mAppTransition);
-
-        // Prepare and start transition.
-        prepareAndTriggerAppTransition(openingActivity, closingActivity,
-                null /* changingTaskFragment */);
-        waitUntilWindowAnimatorIdle();
-
-        // Animation run by the remote handler.
-        assertTrue(remoteAnimationRunner.isAnimationStarted());
-    }
-
-    @Test
-    public void testOverrideTaskFragmentAdapter_overrideWithNonEmbeddedActivity() {
-        final Task task = createTask(mDisplayContent);
-        final TaskFragmentOrganizer organizer = new TaskFragmentOrganizer(Runnable::run);
-        final TestRemoteAnimationRunner remoteAnimationRunner = new TestRemoteAnimationRunner();
-        setupTaskFragmentRemoteAnimation(organizer, remoteAnimationRunner);
-
-        // Closing non-embedded activity.
-        final ActivityRecord closingActivity = createActivityRecord(task);
-        prepareActivityForAppTransition(closingActivity);
-        // Opening TaskFragment with embedded activity.
-        final TaskFragment taskFragment = createTaskFragmentWithEmbeddedActivity(task, organizer);
-        final ActivityRecord openingActivity = taskFragment.getTopMostActivity();
-        prepareActivityForAppTransition(openingActivity);
-        task.effectiveUid = openingActivity.getUid();
-        spyOn(mDisplayContent.mAppTransition);
-
-        // Prepare and start transition.
-        prepareAndTriggerAppTransition(openingActivity, closingActivity, taskFragment);
-        waitUntilWindowAnimatorIdle();
-
-        // Animation run by the remote handler.
-        assertTrue(remoteAnimationRunner.isAnimationStarted());
-    }
-
-    @Test
-    public void testOverrideTaskFragmentAdapter_overrideEmbeddedActivityWithDiffUid() {
-        final Task task = createTask(mDisplayContent);
-        final TaskFragmentOrganizer organizer = new TaskFragmentOrganizer(Runnable::run);
-        final TestRemoteAnimationRunner remoteAnimationRunner = new TestRemoteAnimationRunner();
-        setupTaskFragmentRemoteAnimation(organizer, remoteAnimationRunner);
-
-        // Closing TaskFragment with embedded activity.
-        final TaskFragment taskFragment1 = createTaskFragmentWithEmbeddedActivity(task, organizer);
-        final ActivityRecord closingActivity = taskFragment1.getTopMostActivity();
-        prepareActivityForAppTransition(closingActivity);
-        closingActivity.info.applicationInfo.uid = 12345;
-        // Opening TaskFragment with embedded activity with different UID.
-        final TaskFragment taskFragment2 = createTaskFragmentWithEmbeddedActivity(task, organizer);
-        final ActivityRecord openingActivity = taskFragment2.getTopMostActivity();
-        prepareActivityForAppTransition(openingActivity);
-        openingActivity.info.applicationInfo.uid = 54321;
-        spyOn(mDisplayContent.mAppTransition);
-
-        // Prepare and start transition.
-        prepareAndTriggerAppTransition(openingActivity, closingActivity, taskFragment1);
-        waitUntilWindowAnimatorIdle();
-
-        // Animation run by the remote handler.
-        assertTrue(remoteAnimationRunner.isAnimationStarted());
-    }
-
-    @Test
-    public void testOverrideTaskFragmentAdapter_noOverrideWithTwoApps() {
-        final Task task = createTask(mDisplayContent);
-        final TaskFragmentOrganizer organizer = new TaskFragmentOrganizer(Runnable::run);
-        final TestRemoteAnimationRunner remoteAnimationRunner = new TestRemoteAnimationRunner();
-        setupTaskFragmentRemoteAnimation(organizer, remoteAnimationRunner);
-
-        // Closing activity in Task1.
-        final ActivityRecord closingActivity = createActivityRecord(mDisplayContent);
-        prepareActivityForAppTransition(closingActivity);
-        // Opening TaskFragment with embedded activity in Task2.
-        final TaskFragment taskFragment = createTaskFragmentWithEmbeddedActivity(task, organizer);
-        final ActivityRecord openingActivity = taskFragment.getTopMostActivity();
-        prepareActivityForAppTransition(openingActivity);
-        spyOn(mDisplayContent.mAppTransition);
-
-        // Prepare and start transition.
-        prepareAndTriggerAppTransition(openingActivity, closingActivity, taskFragment);
-        waitUntilWindowAnimatorIdle();
-
-        // Animation not run by the remote handler.
-        assertFalse(remoteAnimationRunner.isAnimationStarted());
-    }
-
-    @Test
-    public void testOverrideTaskFragmentAdapter_noOverrideNonEmbeddedActivityWithDiffUid() {
-        final Task task = createTask(mDisplayContent);
-        final TaskFragmentOrganizer organizer = new TaskFragmentOrganizer(Runnable::run);
-        final TestRemoteAnimationRunner remoteAnimationRunner = new TestRemoteAnimationRunner();
-        setupTaskFragmentRemoteAnimation(organizer, remoteAnimationRunner);
-
-        // Closing TaskFragment with embedded activity.
-        final TaskFragment taskFragment = createTaskFragmentWithEmbeddedActivity(task, organizer);
-        final ActivityRecord closingActivity = taskFragment.getTopMostActivity();
-        prepareActivityForAppTransition(closingActivity);
-        closingActivity.info.applicationInfo.uid = 12345;
-        task.effectiveUid = closingActivity.getUid();
-        // Opening non-embedded activity with different UID.
-        final ActivityRecord openingActivity = createActivityRecord(task);
-        prepareActivityForAppTransition(openingActivity);
-        openingActivity.info.applicationInfo.uid = 54321;
-        spyOn(mDisplayContent.mAppTransition);
-
-        // Prepare and start transition.
-        prepareAndTriggerAppTransition(openingActivity, closingActivity, taskFragment);
-        waitUntilWindowAnimatorIdle();
-
-        // Animation should not run by the remote handler when there are non-embedded activities of
-        // different UID.
-        assertFalse(remoteAnimationRunner.isAnimationStarted());
-    }
-
-    @Test
-    public void testOverrideTaskFragmentAdapter_noOverrideWithWallpaper() {
-        final Task task = createTask(mDisplayContent);
-        final TaskFragmentOrganizer organizer = new TaskFragmentOrganizer(Runnable::run);
-        final TestRemoteAnimationRunner remoteAnimationRunner = new TestRemoteAnimationRunner();
-        setupTaskFragmentRemoteAnimation(organizer, remoteAnimationRunner);
-
-        // Create a TaskFragment with embedded activity.
-        final TaskFragment taskFragment = createTaskFragmentWithEmbeddedActivity(task, organizer);
-        final ActivityRecord activity = taskFragment.getTopMostActivity();
-        prepareActivityForAppTransition(activity);
-        // Set wallpaper as visible.
-        final WallpaperWindowToken wallpaperWindowToken = new WallpaperWindowToken(mWm,
-                mock(IBinder.class), true, mDisplayContent, true /* ownerCanManageAppTokens */);
-        spyOn(mDisplayContent.mWallpaperController);
-        doReturn(true).when(mDisplayContent.mWallpaperController).isWallpaperVisible();
-        spyOn(mDisplayContent.mAppTransition);
-
-        // Prepare and start transition.
-        prepareAndTriggerAppTransition(activity, null /* closingActivity */, taskFragment);
-        waitUntilWindowAnimatorIdle();
-
-        // Animation should not run by the remote handler when there is wallpaper in the transition.
-        assertFalse(remoteAnimationRunner.isAnimationStarted());
-    }
-
-    @Test
-    public void testOverrideTaskFragmentAdapter_inputProtectedForUntrustedAnimation() {
-        final Task task = createTask(mDisplayContent);
-        final TaskFragmentOrganizer organizer = new TaskFragmentOrganizer(Runnable::run);
-        final TestRemoteAnimationRunner remoteAnimationRunner = new TestRemoteAnimationRunner();
-        setupTaskFragmentRemoteAnimation(organizer, remoteAnimationRunner);
-
-        // Create a TaskFragment with embedded activities, one is trusted embedded, and the other
-        // one is untrusted embedded.
-        final TaskFragment taskFragment = new TaskFragmentBuilder(mAtm)
-                .setParentTask(task)
-                .createActivityCount(2)
-                .setOrganizer(organizer)
-                .build();
-        final ActivityRecord activity0 = taskFragment.getChildAt(0).asActivityRecord();
-        final ActivityRecord activity1 = taskFragment.getChildAt(1).asActivityRecord();
-        // Also create a non-embedded activity in the Task.
-        final ActivityRecord activity2 = new ActivityBuilder(mAtm).build();
-        task.addChild(activity2, POSITION_BOTTOM);
-        prepareActivityForAppTransition(activity0);
-        prepareActivityForAppTransition(activity1);
-        prepareActivityForAppTransition(activity2);
-        doReturn(false).when(taskFragment).isAllowedToEmbedActivityInTrustedMode(activity0);
-        doReturn(true).when(taskFragment).isAllowedToEmbedActivityInTrustedMode(activity1);
-        spyOn(mDisplayContent.mAppTransition);
-
-        // Prepare and start transition.
-        prepareAndTriggerAppTransition(activity1, null /* closingActivity */, taskFragment);
-        waitUntilWindowAnimatorIdle();
-
-        // The animation will be animated remotely by client and all activities are input disabled
-        // for untrusted animation.
-        assertTrue(remoteAnimationRunner.isAnimationStarted());
-        verify(activity0).setDropInputForAnimation(true);
-        verify(activity1).setDropInputForAnimation(true);
-        verify(activity2).setDropInputForAnimation(true);
-        verify(activity0).setDropInputMode(DropInputMode.ALL);
-        verify(activity1).setDropInputMode(DropInputMode.ALL);
-        verify(activity2).setDropInputMode(DropInputMode.ALL);
-
-        // Reset input after animation is finished.
-        clearInvocations(activity0);
-        clearInvocations(activity1);
-        clearInvocations(activity2);
-        remoteAnimationRunner.finishAnimation();
-
-        verify(activity0).setDropInputForAnimation(false);
-        verify(activity1).setDropInputForAnimation(false);
-        verify(activity2).setDropInputForAnimation(false);
-        verify(activity0).setDropInputMode(DropInputMode.OBSCURED);
-        verify(activity1).setDropInputMode(DropInputMode.NONE);
-        verify(activity2).setDropInputMode(DropInputMode.NONE);
-    }
-
-    /**
-     * Since we don't have any use case to rely on handling input during animation, disable it even
-     * if it is trusted embedding so that it could cover some edge-cases when a previously trusted
-     * host starts doing something bad.
-     */
-    @Test
-    public void testOverrideTaskFragmentAdapter_inputProtectedForTrustedAnimation() {
-        final Task task = createTask(mDisplayContent);
-        final TaskFragmentOrganizer organizer = new TaskFragmentOrganizer(Runnable::run);
-        final TestRemoteAnimationRunner remoteAnimationRunner = new TestRemoteAnimationRunner();
-        setupTaskFragmentRemoteAnimation(organizer, remoteAnimationRunner);
-
-        // Create a TaskFragment with only trusted embedded activity
-        final TaskFragment taskFragment = new TaskFragmentBuilder(mAtm)
-                .setParentTask(task)
-                .createActivityCount(1)
-                .setOrganizer(organizer)
-                .build();
-        final ActivityRecord activity = taskFragment.getChildAt(0).asActivityRecord();
-        prepareActivityForAppTransition(activity);
-        doReturn(true).when(taskFragment).isAllowedToEmbedActivityInTrustedMode(activity);
-        spyOn(mDisplayContent.mAppTransition);
-
-        // Prepare and start transition.
-        prepareAndTriggerAppTransition(activity, null /* closingActivity */, taskFragment);
-        waitUntilWindowAnimatorIdle();
-
-        // The animation will be animated remotely by client and all activities are input disabled
-        // for untrusted animation.
-        assertTrue(remoteAnimationRunner.isAnimationStarted());
-        verify(activity).setDropInputForAnimation(true);
-        verify(activity).setDropInputMode(DropInputMode.ALL);
-
-        // Reset input after animation is finished.
-        clearInvocations(activity);
-        remoteAnimationRunner.finishAnimation();
-
-        verify(activity).setDropInputForAnimation(false);
-        verify(activity).setDropInputMode(DropInputMode.NONE);
-    }
-
-    /**
-     * We don't need to drop input for fully trusted embedding (system app, and embedding in the
-     * same app). This will allow users to do fast tapping.
-     */
-    @Test
-    public void testOverrideTaskFragmentAdapter_noInputProtectedForFullyTrustedAnimation() {
-        final Task task = createTask(mDisplayContent);
-        final TaskFragmentOrganizer organizer = new TaskFragmentOrganizer(Runnable::run);
-        final TestRemoteAnimationRunner remoteAnimationRunner = new TestRemoteAnimationRunner();
-        setupTaskFragmentRemoteAnimation(organizer, remoteAnimationRunner);
-
-        // Create a TaskFragment with only trusted embedded activity
-        final TaskFragment taskFragment = new TaskFragmentBuilder(mAtm)
-                .setParentTask(task)
-                .createActivityCount(1)
-                .setOrganizer(organizer)
-                .build();
-        final ActivityRecord activity = taskFragment.getChildAt(0).asActivityRecord();
-        prepareActivityForAppTransition(activity);
-        final int uid = mAtm.mTaskFragmentOrganizerController.getTaskFragmentOrganizerUid(
-                getITaskFragmentOrganizer(organizer));
-        doReturn(true).when(task).isFullyTrustedEmbedding(uid);
-        spyOn(mDisplayContent.mAppTransition);
-
-        // Prepare and start transition.
-        prepareAndTriggerAppTransition(activity, null /* closingActivity */, taskFragment);
-        waitUntilWindowAnimatorIdle();
-
-        // The animation will be animated remotely by client, but input should not be dropped for
-        // fully trusted.
-        assertTrue(remoteAnimationRunner.isAnimationStarted());
-        verify(activity, never()).setDropInputForAnimation(true);
-        verify(activity, never()).setDropInputMode(DropInputMode.ALL);
-    }
-
-    @Test
-    public void testTransitionGoodToGoForTaskFragments() {
-        final TaskFragmentOrganizer organizer = new TaskFragmentOrganizer(Runnable::run);
-        final Task task = createTask(mDisplayContent);
-        final TaskFragment changeTaskFragment =
-                createTaskFragmentWithEmbeddedActivity(task, organizer);
-        final TaskFragment emptyTaskFragment = new TaskFragmentBuilder(mAtm)
-                .setParentTask(task)
-                .setOrganizer(organizer)
-                .build();
-        prepareActivityForAppTransition(changeTaskFragment.getTopMostActivity());
-        spyOn(mDisplayContent.mAppTransition);
-        spyOn(emptyTaskFragment);
-
-        prepareAndTriggerAppTransition(
-                null /* openingActivity */, null /* closingActivity*/, changeTaskFragment);
-
-        // Transition not ready because there is an empty non-finishing TaskFragment.
-        verify(mDisplayContent.mAppTransition, never()).goodToGo(anyInt(), any());
-
-        doReturn(true).when(emptyTaskFragment).hasChild();
-        emptyTaskFragment.remove(false /* withTransition */, "test");
-
-        mDisplayContent.mAppTransitionController.handleAppTransitionReady();
-
-        // Transition ready because the empty (no running activity) TaskFragment is requested to be
-        // removed.
-        verify(mDisplayContent.mAppTransition).goodToGo(anyInt(), any());
-    }
-
-    @Test
-    public void testTransitionGoodToGoForTaskFragments_detachedApp() {
-        final TaskFragmentOrganizer organizer = new TaskFragmentOrganizer(Runnable::run);
-        final ITaskFragmentOrganizer iOrganizer = getITaskFragmentOrganizer(organizer);
-        registerTaskFragmentOrganizer(iOrganizer);
-        final Task task = createTask(mDisplayContent);
-        final TaskFragment changeTaskFragment =
-                createTaskFragmentWithEmbeddedActivity(task, organizer);
-        final TaskFragment emptyTaskFragment = new TaskFragmentBuilder(mAtm)
-                .setParentTask(task)
-                .setOrganizer(organizer)
-                .build();
-        prepareActivityForAppTransition(changeTaskFragment.getTopMostActivity());
-        // To make sure that having a detached activity won't cause any issue.
-        final ActivityRecord detachedActivity = createActivityRecord(task);
-        detachedActivity.removeImmediately();
-        assertNull(detachedActivity.getRootTask());
-        spyOn(mDisplayContent.mAppTransition);
-        spyOn(emptyTaskFragment);
-
-        prepareAndTriggerAppTransition(
-                null /* openingActivity */, detachedActivity, changeTaskFragment);
-
-        // Transition not ready because there is an empty non-finishing TaskFragment.
-        verify(mDisplayContent.mAppTransition, never()).goodToGo(anyInt(), any());
-
-        doReturn(true).when(emptyTaskFragment).hasChild();
-        emptyTaskFragment.remove(false /* withTransition */, "test");
-
-        mDisplayContent.mAppTransitionController.handleAppTransitionReady();
-
-        // Transition ready because the empty (no running activity) TaskFragment is requested to be
-        // removed.
-        verify(mDisplayContent.mAppTransition).goodToGo(anyInt(), any());
-    }
-
-    /** Registers remote animation for the organizer. */
-    private void setupTaskFragmentRemoteAnimation(TaskFragmentOrganizer organizer,
-            TestRemoteAnimationRunner remoteAnimationRunner) {
-        final RemoteAnimationAdapter adapter = new RemoteAnimationAdapter(
-                remoteAnimationRunner, 10, 1);
-        final ITaskFragmentOrganizer iOrganizer = getITaskFragmentOrganizer(organizer);
-        final RemoteAnimationDefinition definition = new RemoteAnimationDefinition();
-        definition.addRemoteAnimation(TRANSIT_OLD_TASK_FRAGMENT_CHANGE, adapter);
-        definition.addRemoteAnimation(TRANSIT_OLD_TASK_FRAGMENT_OPEN, adapter);
-        definition.addRemoteAnimation(TRANSIT_OLD_TASK_FRAGMENT_CLOSE, adapter);
-        definition.addRemoteAnimation(TRANSIT_OLD_ACTIVITY_OPEN, adapter);
-        definition.addRemoteAnimation(TRANSIT_OLD_ACTIVITY_CLOSE, adapter);
-        registerTaskFragmentOrganizer(iOrganizer);
-        mAtm.mTaskFragmentOrganizerController.registerRemoteAnimations(iOrganizer, definition);
-    }
-
-    private static ITaskFragmentOrganizer getITaskFragmentOrganizer(
-            TaskFragmentOrganizer organizer) {
-        return ITaskFragmentOrganizer.Stub.asInterface(organizer.getOrganizerToken().asBinder());
-    }
-
-    private void prepareAndTriggerAppTransition(@Nullable ActivityRecord openingActivity,
-            @Nullable ActivityRecord closingActivity, @Nullable TaskFragment changingTaskFragment) {
-        if (openingActivity != null) {
-            mDisplayContent.mAppTransition.prepareAppTransition(TRANSIT_OPEN, 0);
-            mDisplayContent.mOpeningApps.add(openingActivity);
-        }
-        if (closingActivity != null) {
-            mDisplayContent.mAppTransition.prepareAppTransition(TRANSIT_CLOSE, 0);
-            mDisplayContent.mClosingApps.add(closingActivity);
-        }
-        if (changingTaskFragment != null) {
-            mDisplayContent.mAppTransition.prepareAppTransition(TRANSIT_CHANGE, 0);
-            mDisplayContent.mChangingContainers.add(changingTaskFragment);
-        }
-        mDisplayContent.mAppTransitionController.handleAppTransitionReady();
-    }
-
-    private static void prepareActivityForAppTransition(ActivityRecord activity) {
-        // Transition will wait until all participated activities to be drawn.
-        activity.allDrawn = true;
-        // Skip manipulate the SurfaceControl.
-        doNothing().when(activity).setDropInputMode(anyInt());
-        // Assume the activity contains a window.
-        doReturn(true).when(activity).hasChild();
-        // Make sure activity can create remote animation target.
-        doReturn(mock(RemoteAnimationTarget.class)).when(activity).createRemoteAnimationTarget(
-                any());
-    }
-}
diff --git a/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java
deleted file mode 100644
index 8553fbd..0000000
--- a/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java
+++ /dev/null
@@ -1,520 +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.wm;
-
-import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
-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_FLAG_APP_CRASHED;
-import static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY;
-import static android.view.WindowManager.TRANSIT_KEYGUARD_OCCLUDE;
-import static android.view.WindowManager.TRANSIT_KEYGUARD_UNOCCLUDE;
-import static android.view.WindowManager.TRANSIT_NONE;
-import static android.view.WindowManager.TRANSIT_OLD_CRASHING_ACTIVITY_CLOSE;
-import static android.view.WindowManager.TRANSIT_OLD_KEYGUARD_GOING_AWAY;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_CHANGE_WINDOWING_MODE;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_FRAGMENT_CHANGE;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_FRAGMENT_CLOSE;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_FRAGMENT_OPEN;
-import static android.view.WindowManager.TRANSIT_OLD_UNSET;
-import static android.view.WindowManager.TRANSIT_OPEN;
-
-import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
-
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyInt;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
-import static com.android.server.wm.WindowContainer.POSITION_TOP;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-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.Mockito.mock;
-
-import android.graphics.Rect;
-import android.os.Binder;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.platform.test.annotations.Presubmit;
-import android.util.ArraySet;
-import android.view.Display;
-import android.view.IRemoteAnimationFinishedCallback;
-import android.view.IRemoteAnimationRunner;
-import android.view.RemoteAnimationAdapter;
-import android.view.RemoteAnimationTarget;
-import android.view.SurfaceControl;
-import android.view.WindowManager;
-import android.view.animation.Animation;
-import android.window.ITaskFragmentOrganizer;
-import android.window.TaskFragmentOrganizer;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.internal.policy.TransitionAnimation;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-/**
- * Test class for {@link AppTransition}.
- *
- * Build/Install/Run:
- *  atest WmTests:AppTransitionTests
- */
-@SmallTest
-@Presubmit
-@RunWith(WindowTestRunner.class)
-public class AppTransitionTests extends WindowTestsBase {
-    private DisplayContent mDc;
-
-    @Before
-    public void setUp() throws Exception {
-        doNothing().when(mWm.mRoot).performSurfacePlacement();
-        mDc = mWm.getDefaultDisplayContentLocked();
-    }
-
-    @Test
-    public void testKeyguardOverride() {
-        final DisplayContent dc = createNewDisplay(Display.STATE_ON);
-        final ActivityRecord activity = createActivityRecord(dc);
-
-        mDc.prepareAppTransition(TRANSIT_OPEN);
-        mDc.prepareAppTransition(TRANSIT_KEYGUARD_OCCLUDE);
-        mDc.prepareAppTransition(TRANSIT_KEYGUARD_GOING_AWAY);
-        mDc.mOpeningApps.add(activity);
-        assertEquals(TRANSIT_OLD_KEYGUARD_GOING_AWAY,
-                AppTransitionController.getTransitCompatType(mDc.mAppTransition,
-                        mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
-                        mDisplayContent.mChangingContainers, null /* wallpaperTarget */,
-                        null /* oldWallpaper */, false /*skipAppTransitionAnimation*/));
-    }
-
-    @Test
-    public void testKeyguardUnoccludeOcclude() {
-        final DisplayContent dc = createNewDisplay(Display.STATE_ON);
-        final ActivityRecord activity = createActivityRecord(dc);
-
-        mDc.prepareAppTransition(TRANSIT_KEYGUARD_UNOCCLUDE);
-        mDc.prepareAppTransition(TRANSIT_KEYGUARD_OCCLUDE);
-        mDc.mOpeningApps.add(activity);
-        assertEquals(TRANSIT_NONE,
-                AppTransitionController.getTransitCompatType(mDc.mAppTransition,
-                        mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
-                        mDisplayContent.mChangingContainers, null /* wallpaperTarget */,
-                        null /* oldWallpaper */, false /*skipAppTransitionAnimation*/));
-
-    }
-
-    @Test
-    public void testKeyguardKeep() {
-        final DisplayContent dc = createNewDisplay(Display.STATE_ON);
-        final ActivityRecord activity = createActivityRecord(dc);
-
-        mDc.prepareAppTransition(TRANSIT_KEYGUARD_GOING_AWAY);
-        mDc.prepareAppTransition(TRANSIT_OPEN);
-        mDc.mOpeningApps.add(activity);
-        assertEquals(TRANSIT_OLD_KEYGUARD_GOING_AWAY,
-                AppTransitionController.getTransitCompatType(mDc.mAppTransition,
-                        mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
-                        mDisplayContent.mChangingContainers, null /* wallpaperTarget */,
-                        null /* oldWallpaper */, false /*skipAppTransitionAnimation*/));
-    }
-
-    @Test
-    public void testCrashing() {
-        final DisplayContent dc = createNewDisplay(Display.STATE_ON);
-        final ActivityRecord activity = createActivityRecord(dc);
-
-        mDc.prepareAppTransition(TRANSIT_OPEN);
-        mDc.prepareAppTransition(TRANSIT_CLOSE, TRANSIT_FLAG_APP_CRASHED);
-        mDc.mClosingApps.add(activity);
-        assertEquals(TRANSIT_OLD_CRASHING_ACTIVITY_CLOSE,
-                AppTransitionController.getTransitCompatType(mDc.mAppTransition,
-                        mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
-                        mDisplayContent.mChangingContainers, null /* wallpaperTarget */,
-                        null /* oldWallpaper */, false /*skipAppTransitionAnimation*/));
-    }
-
-    @Test
-    public void testKeepKeyguard_withCrashing() {
-        final DisplayContent dc = createNewDisplay(Display.STATE_ON);
-        final ActivityRecord activity = createActivityRecord(dc);
-
-        mDc.prepareAppTransition(TRANSIT_KEYGUARD_GOING_AWAY);
-        mDc.prepareAppTransition(TRANSIT_CLOSE, TRANSIT_FLAG_APP_CRASHED);
-        mDc.mClosingApps.add(activity);
-        assertEquals(TRANSIT_OLD_KEYGUARD_GOING_AWAY,
-                AppTransitionController.getTransitCompatType(mDc.mAppTransition,
-                        mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
-                        mDisplayContent.mChangingContainers, null /* wallpaperTarget */,
-                        null /* oldWallpaper */, false /*skipAppTransitionAnimation*/));
-    }
-
-    @Test
-    public void testSkipTransitionAnimation() {
-        final DisplayContent dc = createNewDisplay(Display.STATE_ON);
-        final ActivityRecord activity = createActivityRecord(dc);
-
-        mDc.prepareAppTransition(TRANSIT_OPEN);
-        mDc.prepareAppTransition(TRANSIT_CLOSE);
-        mDc.mClosingApps.add(activity);
-        assertEquals(TRANSIT_OLD_UNSET,
-                AppTransitionController.getTransitCompatType(mDc.mAppTransition,
-                        mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
-                        mDisplayContent.mChangingContainers, null /* wallpaperTarget */,
-                        null /* oldWallpaper */, true /*skipAppTransitionAnimation*/));
-    }
-
-    @Test
-    public void testTaskChangeWindowingMode() {
-        final ActivityRecord activity = createActivityRecord(mDc);
-
-        mDc.prepareAppTransition(TRANSIT_OPEN);
-        mDc.prepareAppTransition(TRANSIT_CHANGE);
-        mDc.mOpeningApps.add(activity); // Make sure TRANSIT_CHANGE has the priority
-        mDc.mChangingContainers.add(activity.getTask());
-
-        assertEquals(TRANSIT_OLD_TASK_CHANGE_WINDOWING_MODE,
-                AppTransitionController.getTransitCompatType(mDc.mAppTransition,
-                        mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
-                        mDisplayContent.mChangingContainers, null /* wallpaperTarget */,
-                        null /* oldWallpaper */, false /*skipAppTransitionAnimation*/));
-    }
-
-    @Test
-    public void testTaskFragmentChange() {
-        final ActivityRecord activity = createActivityRecord(mDc);
-        final TaskFragment taskFragment = new TaskFragment(mAtm, new Binder(),
-                true /* createdByOrganizer */, true /* isEmbedded */);
-        activity.getTask().addChild(taskFragment, POSITION_TOP);
-        activity.reparent(taskFragment, POSITION_TOP);
-
-        mDc.prepareAppTransition(TRANSIT_OPEN);
-        mDc.prepareAppTransition(TRANSIT_CHANGE);
-        mDc.mOpeningApps.add(activity); // Make sure TRANSIT_CHANGE has the priority
-        mDc.mChangingContainers.add(taskFragment);
-
-        assertEquals(TRANSIT_OLD_TASK_FRAGMENT_CHANGE,
-                AppTransitionController.getTransitCompatType(mDc.mAppTransition,
-                        mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
-                        mDisplayContent.mChangingContainers, null /* wallpaperTarget */,
-                        null /* oldWallpaper */, false /*skipAppTransitionAnimation*/));
-    }
-
-    @Test
-    public void testTaskFragmentOpeningTransition() {
-        final ActivityRecord activity = createHierarchyForTaskFragmentTest();
-        activity.setVisible(false);
-
-        mDisplayContent.prepareAppTransition(TRANSIT_OPEN);
-        mDisplayContent.mOpeningApps.add(activity);
-        assertEquals(TRANSIT_OLD_TASK_FRAGMENT_OPEN,
-                AppTransitionController.getTransitCompatType(mDisplayContent.mAppTransition,
-                        mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
-                        mDisplayContent.mChangingContainers, null /* wallpaperTarget */,
-                        null /* oldWallpaper */, false /* skipAppTransitionAnimation */));
-    }
-
-    @Test
-    public void testTaskFragmentClosingTransition() {
-        final ActivityRecord activity = createHierarchyForTaskFragmentTest();
-        activity.setVisible(true);
-
-        mDisplayContent.prepareAppTransition(TRANSIT_CLOSE);
-        mDisplayContent.mClosingApps.add(activity);
-        assertEquals(TRANSIT_OLD_TASK_FRAGMENT_CLOSE,
-                AppTransitionController.getTransitCompatType(mDisplayContent.mAppTransition,
-                        mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
-                        mDisplayContent.mChangingContainers, null /* wallpaperTarget */,
-                        null /* oldWallpaper */, false /* skipAppTransitionAnimation */));
-    }
-
-    /**
-     * Creates a {@link Task} with two {@link TaskFragment TaskFragments}.
-     * The bottom TaskFragment is to prevent
-     * {@link AppTransitionController#getAnimationTargets(ArraySet, ArraySet, boolean) the animation
-     * target} to promote to Task or above.
-     *
-     * @return The Activity to be put in either opening or closing Activity
-     */
-    private ActivityRecord createHierarchyForTaskFragmentTest() {
-        final Task parentTask = createTask(mDisplayContent);
-        final TaskFragment bottomTaskFragment = createTaskFragmentWithActivity(parentTask);
-        final ActivityRecord bottomActivity = bottomTaskFragment.getTopMostActivity();
-        bottomActivity.setOccludesParent(true);
-        bottomActivity.setVisible(true);
-
-        final TaskFragment verifiedTaskFragment = createTaskFragmentWithActivity(parentTask);
-        final ActivityRecord activity = verifiedTaskFragment.getTopMostActivity();
-        activity.setOccludesParent(true);
-
-        return activity;
-    }
-
-    @Test
-    public void testAppTransitionStateForMultiDisplay() {
-        // Create 2 displays & presume both display the state is ON for ready to display & animate.
-        final DisplayContent dc1 = createNewDisplay(Display.STATE_ON);
-        final DisplayContent dc2 = createNewDisplay(Display.STATE_ON);
-
-        // Create 2 app window tokens to represent 2 activity window.
-        final ActivityRecord activity1 = createActivityRecord(dc1);
-        final ActivityRecord activity2 = createActivityRecord(dc2);
-
-        activity1.allDrawn = true;
-        activity1.startingMoved = true;
-
-        // Simulate activity resume / finish flows to prepare app transition & set visibility,
-        // make sure transition is set as expected for each display.
-        dc1.prepareAppTransition(TRANSIT_OPEN);
-        dc2.prepareAppTransition(TRANSIT_CLOSE);
-        // One activity window is visible for resuming & the other activity window is invisible
-        // for finishing in different display.
-        activity1.setVisibility(true);
-        activity2.setVisibility(false);
-
-        // Make sure each display is in animating stage.
-        assertTrue(dc1.mOpeningApps.size() > 0);
-        assertTrue(dc2.mClosingApps.size() > 0);
-        assertTrue(dc1.isAppTransitioning());
-        assertTrue(dc2.isAppTransitioning());
-    }
-
-    @Test
-    public void testCleanAppTransitionWhenRootTaskReparent() {
-        // Create 2 displays & presume both display the state is ON for ready to display & animate.
-        final DisplayContent dc1 = createNewDisplay(Display.STATE_ON);
-        final DisplayContent dc2 = createNewDisplay(Display.STATE_ON);
-
-        final Task rootTask1 = createTask(dc1);
-        final Task task1 = createTaskInRootTask(rootTask1, 0 /* userId */);
-        final ActivityRecord activity1 = createNonAttachedActivityRecord(dc1);
-        task1.addChild(activity1, 0);
-
-        // Simulate same app is during opening / closing transition set stage.
-        dc1.mClosingApps.add(activity1);
-        assertTrue(dc1.mClosingApps.size() > 0);
-
-        dc1.prepareAppTransition(TRANSIT_OPEN);
-        assertTrue(dc1.mAppTransition.containsTransitRequest(TRANSIT_OPEN));
-        assertTrue(dc1.mAppTransition.isTransitionSet());
-
-        dc1.mOpeningApps.add(activity1);
-        assertTrue(dc1.mOpeningApps.size() > 0);
-
-        // Move root task to another display.
-        rootTask1.reparent(dc2.getDefaultTaskDisplayArea(), true);
-
-        // Verify if token are cleared from both pending transition list in former display.
-        assertFalse(dc1.mOpeningApps.contains(activity1));
-        assertFalse(dc1.mOpeningApps.contains(activity1));
-    }
-
-    @Test
-    public void testLoadAnimationSafely() {
-        DisplayContent dc = createNewDisplay(Display.STATE_ON);
-        assertNull(dc.mAppTransition.loadAnimationSafely(
-                getInstrumentation().getTargetContext(), -1));
-    }
-
-    @Test
-    public void testCancelRemoteAnimationWhenFreeze() {
-        final DisplayContent dc = createNewDisplay(Display.STATE_ON);
-        doReturn(false).when(dc).onDescendantOrientationChanged(any());
-        final WindowState exitingAppWindow = newWindowBuilder("exiting app",
-                TYPE_BASE_APPLICATION).setDisplay(dc).build();
-        final ActivityRecord exitingActivity = exitingAppWindow.mActivityRecord;
-        // Wait until everything in animation handler get executed to prevent the exiting window
-        // from being removed during WindowSurfacePlacer Traversal.
-        waitUntilHandlersIdle();
-
-        // Set a remote animator.
-        final TestRemoteAnimationRunner runner = new TestRemoteAnimationRunner();
-        final RemoteAnimationAdapter adapter = new RemoteAnimationAdapter(
-                runner, 100, 50, true /* changeNeedsSnapshot */);
-        // RemoteAnimationController will tracking RemoteAnimationAdapter's caller with calling pid.
-        adapter.setCallingPidUid(123, 456);
-
-        // Simulate activity finish flows to prepare app transition & set visibility,
-        // make sure transition is set as expected.
-        dc.prepareAppTransition(TRANSIT_CLOSE);
-        assertTrue(dc.mAppTransition.containsTransitRequest(TRANSIT_CLOSE));
-        dc.mAppTransition.overridePendingAppTransitionRemote(adapter);
-        exitingActivity.setVisibility(false);
-        assertTrue(dc.mClosingApps.size() > 0);
-
-        // Make sure window is in animating stage before freeze, and cancel after freeze.
-        assertTrue(dc.isAppTransitioning());
-        assertFalse(runner.mCancelled);
-        dc.mAppTransition.freeze();
-        assertFalse(dc.isAppTransitioning());
-        assertTrue(runner.mCancelled);
-    }
-
-    @Test
-    public void testGetAnimationStyleResId() {
-        // Verify getAnimationStyleResId will return as LayoutParams.windowAnimations when without
-        // specifying window type.
-        final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams();
-        attrs.windowAnimations = 0x12345678;
-        assertEquals(attrs.windowAnimations, mDc.mAppTransition.getAnimationStyleResId(attrs));
-
-        // Verify getAnimationStyleResId will return system resource Id when the window type is
-        // starting window.
-        attrs.type = TYPE_APPLICATION_STARTING;
-        assertEquals(mDc.mAppTransition.getDefaultWindowAnimationStyleResId(),
-                mDc.mAppTransition.getAnimationStyleResId(attrs));
-    }
-
-    @Test
-    public void testActivityRecordReparentedToTaskFragment() {
-        final ActivityRecord activity = createActivityRecord(mDc);
-        final SurfaceControl activityLeash = mock(SurfaceControl.class);
-        doNothing().when(activity).setDropInputMode(anyInt());
-        activity.setVisibility(true);
-        activity.setSurfaceControl(activityLeash);
-        final Task task = activity.getTask();
-
-        // Add a TaskFragment of half of the Task size.
-        final TaskFragmentOrganizer organizer = new TaskFragmentOrganizer(Runnable::run);
-        final ITaskFragmentOrganizer iOrganizer =
-                ITaskFragmentOrganizer.Stub.asInterface(organizer.getOrganizerToken().asBinder());
-        registerTaskFragmentOrganizer(iOrganizer);
-        final TaskFragment taskFragment = new TaskFragmentBuilder(mAtm)
-                .setParentTask(task)
-                .setOrganizer(organizer)
-                .build();
-        final Rect taskBounds = new Rect();
-        task.getBounds(taskBounds);
-        taskFragment.setBounds(0, 0, taskBounds.right / 2, taskBounds.bottom);
-        spyOn(taskFragment);
-
-        assertTrue(mDc.mChangingContainers.isEmpty());
-        assertFalse(mDc.mAppTransition.isTransitionSet());
-
-        // Schedule app transition when reparent activity to a TaskFragment of different size.
-        final Rect startBounds = new Rect(activity.getBounds());
-        activity.reparent(taskFragment, POSITION_TOP);
-
-        // It should transit at TaskFragment level with snapshot on the activity surface.
-        verify(taskFragment).initializeChangeTransition(activity.getBounds(), activityLeash);
-        assertTrue(mDc.mChangingContainers.contains(taskFragment));
-        assertTrue(mDc.mAppTransition.containsTransitRequest(TRANSIT_CHANGE));
-    }
-
-    @Test
-    public void testGetNextAppTransitionBackgroundColor() {
-        assumeFalse(WindowManagerService.sEnableShellTransitions);
-
-        // No override by default.
-        assertEquals(0, mDc.mAppTransition.getNextAppTransitionBackgroundColor());
-
-        // Override with a custom color.
-        mDc.mAppTransition.prepareAppTransition(TRANSIT_OPEN, 0);
-        final int testColor = 123;
-        mDc.mAppTransition.overridePendingAppTransition("testPackage", 0 /* enterAnim */,
-                0 /* exitAnim */, testColor, null /* startedCallback */, null /* endedCallback */,
-                false /* overrideTaskTransaction */);
-
-        assertEquals(testColor, mDc.mAppTransition.getNextAppTransitionBackgroundColor());
-        assertTrue(mDc.mAppTransition.isNextAppTransitionOverrideRequested());
-
-        // Override with ActivityEmbedding remote animation. Background color should be kept.
-        mDc.mAppTransition.overridePendingAppTransitionRemote(mock(RemoteAnimationAdapter.class),
-                false /* sync */, true /* isActivityEmbedding */);
-
-        assertEquals(testColor, mDc.mAppTransition.getNextAppTransitionBackgroundColor());
-        assertFalse(mDc.mAppTransition.isNextAppTransitionOverrideRequested());
-
-        // Background color should not be cleared anymore after #clear().
-        mDc.mAppTransition.clear();
-        assertEquals(0, mDc.mAppTransition.getNextAppTransitionBackgroundColor());
-        assertFalse(mDc.mAppTransition.isNextAppTransitionOverrideRequested());
-    }
-
-    @Test
-    public void testGetNextAppRequestedAnimation() {
-        assumeFalse(WindowManagerService.sEnableShellTransitions);
-        final String packageName = "testPackage";
-        final int enterAnimResId = 1;
-        final int exitAnimResId = 2;
-        final int testColor = 123;
-        final Animation enterAnim = mock(Animation.class);
-        final Animation exitAnim = mock(Animation.class);
-        final TransitionAnimation transitionAnimation = mDc.mAppTransition.mTransitionAnimation;
-        spyOn(transitionAnimation);
-        doReturn(enterAnim).when(transitionAnimation)
-                .loadAppTransitionAnimation(packageName, enterAnimResId);
-        doReturn(exitAnim).when(transitionAnimation)
-                .loadAppTransitionAnimation(packageName, exitAnimResId);
-
-        // No override by default.
-        assertNull(mDc.mAppTransition.getNextAppRequestedAnimation(true /* enter */));
-        assertNull(mDc.mAppTransition.getNextAppRequestedAnimation(false /* enter */));
-
-        // Override with a custom animation.
-        mDc.mAppTransition.prepareAppTransition(TRANSIT_OPEN, 0);
-        mDc.mAppTransition.overridePendingAppTransition(packageName, enterAnimResId, exitAnimResId,
-                testColor, null /* startedCallback */, null /* endedCallback */,
-                false /* overrideTaskTransaction */);
-
-        assertEquals(enterAnim, mDc.mAppTransition.getNextAppRequestedAnimation(true /* enter */));
-        assertEquals(exitAnim, mDc.mAppTransition.getNextAppRequestedAnimation(false /* enter */));
-        assertTrue(mDc.mAppTransition.isNextAppTransitionOverrideRequested());
-
-        // Override with ActivityEmbedding remote animation. Custom animation should be kept.
-        mDc.mAppTransition.overridePendingAppTransitionRemote(mock(RemoteAnimationAdapter.class),
-                false /* sync */, true /* isActivityEmbedding */);
-
-        assertEquals(enterAnim, mDc.mAppTransition.getNextAppRequestedAnimation(true /* enter */));
-        assertEquals(exitAnim, mDc.mAppTransition.getNextAppRequestedAnimation(false /* enter */));
-        assertFalse(mDc.mAppTransition.isNextAppTransitionOverrideRequested());
-
-        // Custom animation should not be cleared anymore after #clear().
-        mDc.mAppTransition.clear();
-        assertNull(mDc.mAppTransition.getNextAppRequestedAnimation(true /* enter */));
-        assertNull(mDc.mAppTransition.getNextAppRequestedAnimation(false /* enter */));
-    }
-
-    private class TestRemoteAnimationRunner implements IRemoteAnimationRunner {
-        boolean mCancelled = false;
-        @Override
-        public void onAnimationStart(@WindowManager.TransitionOldType int transit,
-                RemoteAnimationTarget[] apps,
-                RemoteAnimationTarget[] wallpapers,
-                RemoteAnimationTarget[] nonApps,
-                IRemoteAnimationFinishedCallback finishedCallback) throws RemoteException {
-        }
-
-        @Override
-        public void onAnimationCancelled() {
-            mCancelled = true;
-        }
-
-        @Override
-        public IBinder asBinder() {
-            return null;
-        }
-    }
-}
diff --git a/services/tests/wmtests/src/com/android/server/wm/DesktopModeHelperTest.java b/services/tests/wmtests/src/com/android/server/wm/DesktopModeHelperTest.java
index eaffc48..e6c3fb3 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DesktopModeHelperTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DesktopModeHelperTest.java
@@ -177,22 +177,41 @@
     }
 
     @Test
-    public void isDeviceEligibleForDesktopMode_configDEModeOn_returnsTrue() {
+    public void isDeviceEligibleForDesktopMode_configDEModeOnAndIntDispHostsDesktop_returnsTrue() {
+        doReturn(true).when(mMockResources).getBoolean(eq(R.bool.config_isDesktopModeSupported));
+        doReturn(true).when(mMockResources)
+                .getBoolean(eq(R.bool.config_canInternalDisplayHostDesktops));
+
+        assertThat(DesktopModeHelper.isDeviceEligibleForDesktopMode(mMockContext)).isTrue();
+    }
+
+    @Test
+    public void isDeviceEligibleForDesktopMode_configDEModeOffAndIntDispHostsDesktop_returnsFalse() {
+        doReturn(true).when(mMockResources).getBoolean(eq(R.bool.config_isDesktopModeSupported));
+        doReturn(false).when(mMockResources)
+                .getBoolean(eq(R.bool.config_canInternalDisplayHostDesktops));
+
+        assertThat(DesktopModeHelper.isDeviceEligibleForDesktopMode(mMockContext)).isFalse();
+    }
+
+    @Test
+    public void isDeviceEligibleForDesktopMode_configDEModeOnAndIntDispHostsDesktopOff_returnsFalse() {
+        doReturn(false).when(mMockResources).getBoolean(eq(R.bool.config_isDesktopModeSupported));
         doReturn(true).when(mMockResources).getBoolean(eq(R.bool.config_canInternalDisplayHostDesktops));
 
-        assertThat(DesktopModeHelper.isInternalDisplayEligibleToHostDesktops(mMockContext)).isTrue();
+        assertThat(DesktopModeHelper.isDeviceEligibleForDesktopMode(mMockContext)).isFalse();
     }
 
     @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_MODE_THROUGH_DEV_OPTION)
     @Test
     public void isDeviceEligibleForDesktopMode_supportFlagOff_returnsFalse() {
-        assertThat(DesktopModeHelper.isInternalDisplayEligibleToHostDesktops(mMockContext)).isFalse();
+        assertThat(DesktopModeHelper.isDeviceEligibleForDesktopMode(mMockContext)).isFalse();
     }
 
     @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_MODE_THROUGH_DEV_OPTION)
     @Test
     public void isDeviceEligibleForDesktopMode_supportFlagOn_returnsFalse() {
-        assertThat(DesktopModeHelper.isInternalDisplayEligibleToHostDesktops(mMockContext)).isFalse();
+        assertThat(DesktopModeHelper.isDeviceEligibleForDesktopMode(mMockContext)).isFalse();
     }
 
     @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_MODE_THROUGH_DEV_OPTION)
@@ -202,7 +221,7 @@
                 eq(R.bool.config_isDesktopModeDevOptionSupported)
         );
 
-        assertThat(DesktopModeHelper.isInternalDisplayEligibleToHostDesktops(mMockContext)).isTrue();
+        assertThat(DesktopModeHelper.isDeviceEligibleForDesktopMode(mMockContext)).isTrue();
     }
 
     private void resetEnforceDeviceRestriction() throws Exception {
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
index 0964ebe..82435b2 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
@@ -1172,11 +1172,12 @@
                 .setScreenOrientation(getRotatedOrientation(mDisplayContent)).build();
         prev.setVisibleRequested(false);
         final ActivityRecord top = new ActivityBuilder(mAtm).setCreateTask(true)
+                .setVisible(false)
                 .setScreenOrientation(SCREEN_ORIENTATION_BEHIND).build();
         assertNotEquals(WindowConfiguration.ROTATION_UNDEFINED,
                 mDisplayContent.rotationForActivityInDifferentOrientation(top));
 
-        mDisplayContent.requestTransitionAndLegacyPrepare(WindowManager.TRANSIT_OPEN, 0);
+        requestTransition(top, WindowManager.TRANSIT_OPEN);
         top.setVisibility(true);
         mDisplayContent.updateOrientation();
         // The top uses "behind", so the orientation is decided by the previous.
@@ -1609,8 +1610,7 @@
         final ActivityRecord app = mAppWindow.mActivityRecord;
         app.setVisible(false);
         app.setVisibleRequested(false);
-        registerTestTransitionPlayer();
-        mDisplayContent.requestTransitionAndLegacyPrepare(WindowManager.TRANSIT_OPEN, 0);
+        requestTransition(app, WindowManager.TRANSIT_OPEN);
         app.setVisibility(true);
         final int newOrientation = getRotatedOrientation(mDisplayContent);
         app.setRequestedOrientation(newOrientation);
diff --git a/services/tests/wmtests/src/com/android/server/wm/RemoteAnimationControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/RemoteAnimationControllerTest.java
deleted file mode 100644
index 20381ba2..0000000
--- a/services/tests/wmtests/src/com/android/server/wm/RemoteAnimationControllerTest.java
+++ /dev/null
@@ -1,757 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.wm;
-
-import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
-import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
-import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
-import static android.view.WindowManager.TRANSIT_OLD_ACTIVITY_OPEN;
-import static android.view.WindowManager.TRANSIT_OLD_KEYGUARD_GOING_AWAY;
-import static android.view.WindowManager.TRANSIT_OLD_KEYGUARD_GOING_AWAY_ON_WALLPAPER;
-import static android.view.WindowManager.TRANSIT_OLD_NONE;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_CHANGE_WINDOWING_MODE;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_OPEN;
-
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.atLeast;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.never;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.verifyNoMoreInteractions;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.when;
-import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_APP_TRANSITION;
-import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_WINDOW_ANIMATION;
-
-import static junit.framework.Assert.fail;
-
-import static org.junit.Assert.assertEquals;
-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.eq;
-import static org.mockito.Mockito.mock;
-
-import android.graphics.Point;
-import android.graphics.Rect;
-import android.os.Binder;
-import android.os.IBinder;
-import android.os.IInterface;
-import android.os.RemoteException;
-import android.platform.test.annotations.Presubmit;
-import android.view.IRemoteAnimationFinishedCallback;
-import android.view.IRemoteAnimationRunner;
-import android.view.RemoteAnimationAdapter;
-import android.view.RemoteAnimationTarget;
-import android.view.SurfaceControl;
-import android.view.SurfaceControl.Transaction;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.server.testutils.OffsettableClock;
-import com.android.server.testutils.TestHandler;
-import com.android.server.wm.RemoteAnimationController.RemoteAnimationRecord;
-import com.android.server.wm.SurfaceAnimator.OnAnimationFinishedCallback;
-
-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;
-
-/**
- * Build/Install/Run:
- * atest WmTests:RemoteAnimationControllerTest
- */
-@SmallTest
-@Presubmit
-@RunWith(WindowTestRunner.class)
-public class RemoteAnimationControllerTest extends WindowTestsBase {
-
-    @Mock
-    SurfaceControl mMockLeash;
-    @Mock
-    SurfaceControl mMockThumbnailLeash;
-    @Mock
-    Transaction mMockTransaction;
-    @Mock
-    OnAnimationFinishedCallback mFinishedCallback;
-    @Mock
-    OnAnimationFinishedCallback mThumbnailFinishedCallback;
-    @Mock
-    IRemoteAnimationRunner mMockRunner;
-    private RemoteAnimationAdapter mAdapter;
-    private RemoteAnimationController mController;
-    private final OffsettableClock mClock = new OffsettableClock.Stopped();
-    private TestHandler mHandler;
-
-    @Before
-    public void setUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
-
-        when(mMockRunner.asBinder()).thenReturn(new Binder());
-        mAdapter = new RemoteAnimationAdapter(mMockRunner, 100, 50, true /* changeNeedsSnapshot */);
-        mAdapter.setCallingPidUid(123, 456);
-        runWithScissors(mWm.mH, () -> mHandler = new TestHandler(null, mClock), 0);
-        mController = new RemoteAnimationController(mWm, mDisplayContent, mAdapter,
-                mHandler, false /*isActivityEmbedding*/);
-        mWm.mAnimator.ready();
-    }
-
-    private WindowState createAppOverlayWindow() {
-        final WindowState win = newWindowBuilder("testOverlayWindow",
-                TYPE_APPLICATION_OVERLAY).build();
-        win.mActivityRecord = null;
-        win.mHasSurface = true;
-        return win;
-    }
-
-    @Test
-    public void testForwardsShowBackdrop() throws Exception {
-        final WindowState win = createTestWindow();
-        mDisplayContent.mOpeningApps.add(win.mActivityRecord);
-        final WindowState overlayWin = createAppOverlayWindow();
-        try {
-            final AnimationAdapter adapter = mController.createRemoteAnimationRecord(
-                    win.mActivityRecord,
-                    new Point(50, 100), null, new Rect(50, 100, 150, 150), null,
-                    true /* showBackdrop */).mAdapter;
-            adapter.startAnimation(mMockLeash, mMockTransaction, ANIMATION_TYPE_APP_TRANSITION,
-                    mFinishedCallback);
-            mController.goodToGo(TRANSIT_OLD_ACTIVITY_OPEN);
-            waitUntilWindowAnimatorIdle();
-            final ArgumentCaptor<RemoteAnimationTarget[]> appsCaptor =
-                    ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
-            final ArgumentCaptor<RemoteAnimationTarget[]> wallpapersCaptor =
-                    ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
-            final ArgumentCaptor<RemoteAnimationTarget[]> nonAppsCaptor =
-                    ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
-            final ArgumentCaptor<IRemoteAnimationFinishedCallback> finishedCaptor =
-                    ArgumentCaptor.forClass(IRemoteAnimationFinishedCallback.class);
-            verify(mMockRunner).onAnimationStart(eq(TRANSIT_OLD_ACTIVITY_OPEN),
-                    appsCaptor.capture(), wallpapersCaptor.capture(), nonAppsCaptor.capture(),
-                    finishedCaptor.capture());
-            assertEquals(1, appsCaptor.getValue().length);
-            final RemoteAnimationTarget app = appsCaptor.getValue()[0];
-            assertTrue(app.showBackdrop);
-        } finally {
-            mDisplayContent.mOpeningApps.clear();
-        }
-    }
-
-    @Test
-    public void testRun() throws Exception {
-        final WindowState win = createTestWindow();
-        mDisplayContent.mOpeningApps.add(win.mActivityRecord);
-        final WindowState overlayWin = createAppOverlayWindow();
-        try {
-            final AnimationAdapter adapter = mController.createRemoteAnimationRecord(
-                    win.mActivityRecord,
-                    new Point(50, 100), null, new Rect(50, 100, 150, 150), null, false).mAdapter;
-            adapter.startAnimation(mMockLeash, mMockTransaction, ANIMATION_TYPE_APP_TRANSITION,
-                    mFinishedCallback);
-            mController.goodToGo(TRANSIT_OLD_ACTIVITY_OPEN);
-            waitUntilWindowAnimatorIdle();
-            final ArgumentCaptor<RemoteAnimationTarget[]> appsCaptor =
-                    ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
-            final ArgumentCaptor<RemoteAnimationTarget[]> wallpapersCaptor =
-                    ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
-            final ArgumentCaptor<RemoteAnimationTarget[]> nonAppsCaptor =
-                    ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
-            final ArgumentCaptor<IRemoteAnimationFinishedCallback> finishedCaptor =
-                    ArgumentCaptor.forClass(IRemoteAnimationFinishedCallback.class);
-            verify(mMockRunner).onAnimationStart(eq(TRANSIT_OLD_ACTIVITY_OPEN),
-                    appsCaptor.capture(), wallpapersCaptor.capture(), nonAppsCaptor.capture(),
-                    finishedCaptor.capture());
-            assertEquals(1, appsCaptor.getValue().length);
-            final RemoteAnimationTarget app = appsCaptor.getValue()[0];
-            assertEquals(new Point(50, 100), app.position);
-            assertEquals(new Rect(50, 100, 150, 150), app.sourceContainerBounds);
-            assertEquals(win.mActivityRecord.getPrefixOrderIndex(), app.prefixOrderIndex);
-            assertEquals(win.mActivityRecord.getTask().mTaskId, app.taskId);
-            assertEquals(mMockLeash, app.leash);
-            assertEquals(false, app.isTranslucent);
-            verify(mMockTransaction).setPosition(mMockLeash, app.position.x, app.position.y);
-            verify(mMockTransaction).setWindowCrop(mMockLeash, 100, 50);
-
-            finishedCaptor.getValue().onAnimationFinished();
-            verify(mFinishedCallback).onAnimationFinished(eq(ANIMATION_TYPE_APP_TRANSITION),
-                    eq(adapter));
-            assertEquals(0, nonAppsCaptor.getValue().length);
-        } finally {
-            mDisplayContent.mOpeningApps.clear();
-        }
-    }
-
-    @Test
-    public void testCancel() throws Exception {
-        final WindowState win = createTestWindow();
-        final AnimationAdapter adapter = mController.createRemoteAnimationRecord(
-                win.mActivityRecord,
-                new Point(50, 100), null, new Rect(50, 100, 150, 150), null, false).mAdapter;
-        adapter.startAnimation(mMockLeash, mMockTransaction, ANIMATION_TYPE_APP_TRANSITION,
-                mFinishedCallback);
-        mController.goodToGo(TRANSIT_OLD_ACTIVITY_OPEN);
-
-        adapter.onAnimationCancelled(mMockLeash);
-        verify(mMockRunner).onAnimationCancelled();
-    }
-
-    @Test
-    public void testTimeout() throws Exception {
-        final WindowState win = createTestWindow();
-        final AnimationAdapter adapter = mController.createRemoteAnimationRecord(
-                win.mActivityRecord,
-                new Point(50, 100), null, new Rect(50, 100, 150, 150), null, false).mAdapter;
-        adapter.startAnimation(mMockLeash, mMockTransaction, ANIMATION_TYPE_APP_TRANSITION,
-                mFinishedCallback);
-        mController.goodToGo(TRANSIT_OLD_ACTIVITY_OPEN);
-
-        mClock.fastForward(10500);
-        mHandler.timeAdvance();
-
-        verify(mMockRunner).onAnimationCancelled();
-        verify(mFinishedCallback).onAnimationFinished(eq(ANIMATION_TYPE_APP_TRANSITION),
-                eq(adapter));
-    }
-
-    @Test
-    public void testTimeout_scaled() throws Exception {
-        try {
-            mWm.setAnimationScale(2, 5.0f);
-            final WindowState win = createTestWindow();
-            final AnimationAdapter adapter = mController.createRemoteAnimationRecord(
-                    win.mActivityRecord, new Point(50, 100), null, new Rect(50, 100, 150, 150),
-                    null, false).mAdapter;
-            adapter.startAnimation(mMockLeash, mMockTransaction, ANIMATION_TYPE_APP_TRANSITION,
-                    mFinishedCallback);
-            mController.goodToGo(TRANSIT_OLD_ACTIVITY_OPEN);
-
-            mClock.fastForward(10500);
-            mHandler.timeAdvance();
-
-            verify(mMockRunner, never()).onAnimationCancelled();
-
-            mClock.fastForward(52500);
-            mHandler.timeAdvance();
-
-            verify(mMockRunner).onAnimationCancelled();
-            verify(mFinishedCallback).onAnimationFinished(eq(ANIMATION_TYPE_APP_TRANSITION),
-                    eq(adapter));
-        } finally {
-            mWm.setAnimationScale(2, 1.0f);
-        }
-    }
-
-    @Test
-    public void testZeroAnimations() throws Exception {
-        mController.goodToGo(TRANSIT_OLD_NONE);
-        verify(mMockRunner, never()).onAnimationStart(anyInt(), any(), any(), any(), any());
-        verify(mMockRunner).onAnimationCancelled();
-    }
-
-    @Test
-    public void testNotReallyStarted() throws Exception {
-        final WindowState win = createTestWindow();
-        mController.createRemoteAnimationRecord(win.mActivityRecord,
-                new Point(50, 100), null, new Rect(50, 100, 150, 150), null, false);
-        mController.goodToGo(TRANSIT_OLD_ACTIVITY_OPEN);
-        verify(mMockRunner, never()).onAnimationStart(anyInt(), any(), any(), any(), any());
-        verify(mMockRunner).onAnimationCancelled();
-    }
-
-    @Test
-    public void testOneNotStarted() throws Exception {
-        final WindowState win1 = newWindowBuilder("testWin1", TYPE_BASE_APPLICATION).build();
-        final WindowState win2 = newWindowBuilder("testWin2", TYPE_BASE_APPLICATION).build();
-        mController.createRemoteAnimationRecord(win1.mActivityRecord,
-                new Point(50, 100), null, new Rect(50, 100, 150, 150), null, false);
-        final AnimationAdapter adapter = mController.createRemoteAnimationRecord(
-                win2.mActivityRecord,
-                new Point(50, 100), null, new Rect(50, 100, 150, 150), null, false).mAdapter;
-        adapter.startAnimation(mMockLeash, mMockTransaction, ANIMATION_TYPE_APP_TRANSITION,
-                mFinishedCallback);
-        mController.goodToGo(TRANSIT_OLD_ACTIVITY_OPEN);
-        waitUntilWindowAnimatorIdle();
-        final ArgumentCaptor<RemoteAnimationTarget[]> appsCaptor =
-                ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
-        final ArgumentCaptor<RemoteAnimationTarget[]> wallpapersCaptor =
-                ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
-        final ArgumentCaptor<RemoteAnimationTarget[]> nonAppsCaptor =
-                ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
-        final ArgumentCaptor<IRemoteAnimationFinishedCallback> finishedCaptor =
-                ArgumentCaptor.forClass(IRemoteAnimationFinishedCallback.class);
-        verify(mMockRunner).onAnimationStart(eq(TRANSIT_OLD_ACTIVITY_OPEN),
-                appsCaptor.capture(), wallpapersCaptor.capture(), nonAppsCaptor.capture(),
-                finishedCaptor.capture());
-        assertEquals(1, appsCaptor.getValue().length);
-        assertEquals(mMockLeash, appsCaptor.getValue()[0].leash);
-    }
-
-    @Test
-    public void testRemovedBeforeStarted() throws Exception {
-        final WindowState win = createTestWindow();
-        final AnimationAdapter adapter = mController.createRemoteAnimationRecord(
-                win.mActivityRecord,
-                new Point(50, 100), null, new Rect(50, 100, 150, 150), null, false).mAdapter;
-        adapter.startAnimation(mMockLeash, mMockTransaction, ANIMATION_TYPE_APP_TRANSITION,
-                mFinishedCallback);
-        win.mActivityRecord.removeImmediately();
-        mController.goodToGo(TRANSIT_OLD_ACTIVITY_OPEN);
-        verify(mMockRunner, never()).onAnimationStart(anyInt(), any(), any(), any(), any());
-        verify(mMockRunner).onAnimationCancelled();
-        verify(mFinishedCallback).onAnimationFinished(eq(ANIMATION_TYPE_APP_TRANSITION),
-                eq(adapter));
-    }
-
-    @Test
-    public void testOpeningTaskWithTopFinishingActivity() {
-        final WindowState win = createTestWindow();
-        final Task task = win.getTask();
-        final ActivityRecord topFinishing = new ActivityBuilder(mAtm).setTask(task).build();
-        // Now the task contains:
-        //     - Activity[1] (top, finishing, no window)
-        //     - Activity[0] (has window)
-        topFinishing.finishing = true;
-        spyOn(mDisplayContent.mAppTransition);
-        doReturn(mController).when(mDisplayContent.mAppTransition).getRemoteAnimationController();
-        task.applyAnimationUnchecked(null /* lp */, true /* enter */, TRANSIT_OLD_TASK_OPEN,
-                false /* isVoiceInteraction */, null /* sources */);
-        mController.goodToGo(TRANSIT_OLD_TASK_OPEN);
-        waitUntilWindowAnimatorIdle();
-        final ArgumentCaptor<RemoteAnimationTarget[]> appsCaptor =
-                ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
-        try {
-            verify(mMockRunner).onAnimationStart(eq(TRANSIT_OLD_TASK_OPEN),
-                    appsCaptor.capture(), any(), any(), any());
-        } catch (RemoteException ignored) {
-        }
-        assertEquals(1, appsCaptor.getValue().length);
-        assertEquals(RemoteAnimationTarget.MODE_OPENING, appsCaptor.getValue()[0].mode);
-    }
-
-    @Test
-    public void testChangeToSmallerSize() throws Exception {
-        final WindowState win = createTestWindow();
-        mDisplayContent.mChangingContainers.add(win.mActivityRecord);
-        try {
-            final RemoteAnimationRecord record = mController.createRemoteAnimationRecord(
-                    win.mActivityRecord, new Point(50, 100), null, new Rect(50, 100, 150, 150),
-                    new Rect(0, 0, 200, 200), false);
-            assertNotNull(record.mThumbnailAdapter);
-            ((AnimationAdapter) record.mAdapter)
-                    .startAnimation(mMockLeash, mMockTransaction, ANIMATION_TYPE_WINDOW_ANIMATION,
-                            mFinishedCallback);
-            ((AnimationAdapter) record.mThumbnailAdapter).startAnimation(mMockThumbnailLeash,
-                    mMockTransaction, ANIMATION_TYPE_WINDOW_ANIMATION, mThumbnailFinishedCallback);
-            mController.goodToGo(TRANSIT_OLD_TASK_CHANGE_WINDOWING_MODE);
-            waitUntilWindowAnimatorIdle();
-            final ArgumentCaptor<RemoteAnimationTarget[]> appsCaptor =
-                    ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
-            final ArgumentCaptor<RemoteAnimationTarget[]> wallpapersCaptor =
-                    ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
-            final ArgumentCaptor<RemoteAnimationTarget[]> nonAppsCaptor =
-                    ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
-            final ArgumentCaptor<IRemoteAnimationFinishedCallback> finishedCaptor =
-                    ArgumentCaptor.forClass(IRemoteAnimationFinishedCallback.class);
-            verify(mMockRunner).onAnimationStart(eq(TRANSIT_OLD_TASK_CHANGE_WINDOWING_MODE),
-                    appsCaptor.capture(), wallpapersCaptor.capture(), nonAppsCaptor.capture(),
-                    finishedCaptor.capture());
-            assertEquals(1, appsCaptor.getValue().length);
-            final RemoteAnimationTarget app = appsCaptor.getValue()[0];
-            assertEquals(RemoteAnimationTarget.MODE_CHANGING, app.mode);
-            assertEquals(new Point(50, 100), app.position);
-            assertEquals(new Rect(50, 100, 150, 150), app.sourceContainerBounds);
-            assertEquals(new Rect(0, 0, 200, 200), app.startBounds);
-            assertEquals(mMockLeash, app.leash);
-            assertEquals(mMockThumbnailLeash, app.startLeash);
-            assertEquals(false, app.isTranslucent);
-            verify(mMockTransaction).setPosition(
-                    mMockLeash, app.startBounds.left, app.startBounds.top);
-            verify(mMockTransaction).setWindowCrop(
-                    mMockLeash, app.startBounds.width(), app.startBounds.height());
-            verify(mMockTransaction).setPosition(mMockThumbnailLeash, 0, 0);
-            verify(mMockTransaction).setWindowCrop(mMockThumbnailLeash, app.startBounds.width(),
-                    app.startBounds.height());
-
-            finishedCaptor.getValue().onAnimationFinished();
-            verify(mFinishedCallback).onAnimationFinished(eq(ANIMATION_TYPE_WINDOW_ANIMATION),
-                    eq(record.mAdapter));
-            verify(mThumbnailFinishedCallback).onAnimationFinished(
-                    eq(ANIMATION_TYPE_WINDOW_ANIMATION), eq(record.mThumbnailAdapter));
-        } finally {
-            mDisplayContent.mChangingContainers.clear();
-        }
-    }
-
-    @Test
-    public void testChangeTolargerSize() throws Exception {
-        final WindowState win = createTestWindow();
-        mDisplayContent.mChangingContainers.add(win.mActivityRecord);
-        try {
-            final RemoteAnimationRecord record = mController.createRemoteAnimationRecord(
-                    win.mActivityRecord, new Point(0, 0), null, new Rect(0, 0, 200, 200),
-                    new Rect(50, 100, 150, 150), false);
-            assertNotNull(record.mThumbnailAdapter);
-            ((AnimationAdapter) record.mAdapter)
-                    .startAnimation(mMockLeash, mMockTransaction, ANIMATION_TYPE_WINDOW_ANIMATION,
-                            mFinishedCallback);
-            ((AnimationAdapter) record.mThumbnailAdapter).startAnimation(mMockThumbnailLeash,
-                    mMockTransaction, ANIMATION_TYPE_WINDOW_ANIMATION, mThumbnailFinishedCallback);
-            mController.goodToGo(TRANSIT_OLD_TASK_CHANGE_WINDOWING_MODE);
-            waitUntilWindowAnimatorIdle();
-            final ArgumentCaptor<RemoteAnimationTarget[]> appsCaptor =
-                    ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
-            final ArgumentCaptor<RemoteAnimationTarget[]> wallpapersCaptor =
-                    ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
-            final ArgumentCaptor<RemoteAnimationTarget[]> nonAppsCaptor =
-                    ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
-            final ArgumentCaptor<IRemoteAnimationFinishedCallback> finishedCaptor =
-                    ArgumentCaptor.forClass(IRemoteAnimationFinishedCallback.class);
-            verify(mMockRunner).onAnimationStart(eq(TRANSIT_OLD_TASK_CHANGE_WINDOWING_MODE),
-                    appsCaptor.capture(), wallpapersCaptor.capture(), nonAppsCaptor.capture(),
-                    finishedCaptor.capture());
-            assertEquals(1, appsCaptor.getValue().length);
-            final RemoteAnimationTarget app = appsCaptor.getValue()[0];
-            assertEquals(RemoteAnimationTarget.MODE_CHANGING, app.mode);
-            assertEquals(new Point(0, 0), app.position);
-            assertEquals(new Rect(0, 0, 200, 200), app.sourceContainerBounds);
-            assertEquals(new Rect(50, 100, 150, 150), app.startBounds);
-            assertEquals(mMockLeash, app.leash);
-            assertEquals(mMockThumbnailLeash, app.startLeash);
-            assertEquals(false, app.isTranslucent);
-            verify(mMockTransaction).setPosition(
-                    mMockLeash, app.startBounds.left, app.startBounds.top);
-            verify(mMockTransaction).setWindowCrop(
-                    mMockLeash, app.startBounds.width(), app.startBounds.height());
-            verify(mMockTransaction).setPosition(mMockThumbnailLeash, 0, 0);
-            verify(mMockTransaction).setWindowCrop(mMockThumbnailLeash, app.startBounds.width(),
-                    app.startBounds.height());
-
-            finishedCaptor.getValue().onAnimationFinished();
-            verify(mFinishedCallback).onAnimationFinished(eq(ANIMATION_TYPE_WINDOW_ANIMATION),
-                    eq(record.mAdapter));
-            verify(mThumbnailFinishedCallback).onAnimationFinished(
-                    eq(ANIMATION_TYPE_WINDOW_ANIMATION), eq(record.mThumbnailAdapter));
-        } finally {
-            mDisplayContent.mChangingContainers.clear();
-        }
-    }
-
-    @Test
-    public void testChangeToDifferentPosition() throws Exception {
-        final WindowState win = createTestWindow();
-        mDisplayContent.mChangingContainers.add(win.mActivityRecord);
-        try {
-            final RemoteAnimationRecord record = mController.createRemoteAnimationRecord(
-                    win.mActivityRecord, new Point(100, 100), null, new Rect(150, 150, 400, 400),
-                    new Rect(50, 100, 150, 150), false);
-            assertNotNull(record.mThumbnailAdapter);
-            ((AnimationAdapter) record.mAdapter)
-                    .startAnimation(mMockLeash, mMockTransaction, ANIMATION_TYPE_WINDOW_ANIMATION,
-                            mFinishedCallback);
-            ((AnimationAdapter) record.mThumbnailAdapter).startAnimation(mMockThumbnailLeash,
-                    mMockTransaction, ANIMATION_TYPE_WINDOW_ANIMATION, mThumbnailFinishedCallback);
-            mController.goodToGo(TRANSIT_OLD_TASK_CHANGE_WINDOWING_MODE);
-            waitUntilWindowAnimatorIdle();
-            final ArgumentCaptor<RemoteAnimationTarget[]> appsCaptor =
-                    ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
-            final ArgumentCaptor<RemoteAnimationTarget[]> wallpapersCaptor =
-                    ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
-            final ArgumentCaptor<RemoteAnimationTarget[]> nonAppsCaptor =
-                    ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
-            final ArgumentCaptor<IRemoteAnimationFinishedCallback> finishedCaptor =
-                    ArgumentCaptor.forClass(IRemoteAnimationFinishedCallback.class);
-            verify(mMockRunner).onAnimationStart(eq(TRANSIT_OLD_TASK_CHANGE_WINDOWING_MODE),
-                    appsCaptor.capture(), wallpapersCaptor.capture(), nonAppsCaptor.capture(),
-                    finishedCaptor.capture());
-            assertEquals(1, appsCaptor.getValue().length);
-            final RemoteAnimationTarget app = appsCaptor.getValue()[0];
-            assertEquals(RemoteAnimationTarget.MODE_CHANGING, app.mode);
-            assertEquals(new Point(100, 100), app.position);
-            assertEquals(new Rect(150, 150, 400, 400), app.sourceContainerBounds);
-            assertEquals(new Rect(50, 100, 150, 150), app.startBounds);
-            assertEquals(mMockLeash, app.leash);
-            assertEquals(mMockThumbnailLeash, app.startLeash);
-            assertEquals(false, app.isTranslucent);
-            verify(mMockTransaction).setPosition(
-                    mMockLeash, app.position.x + app.startBounds.left - app.screenSpaceBounds.left,
-                    app.position.y + app.startBounds.top - app.screenSpaceBounds.top);
-            verify(mMockTransaction).setWindowCrop(
-                    mMockLeash, app.startBounds.width(), app.startBounds.height());
-            verify(mMockTransaction).setPosition(mMockThumbnailLeash, 0, 0);
-            verify(mMockTransaction).setWindowCrop(mMockThumbnailLeash, app.startBounds.width(),
-                    app.startBounds.height());
-
-            finishedCaptor.getValue().onAnimationFinished();
-            verify(mFinishedCallback).onAnimationFinished(eq(ANIMATION_TYPE_WINDOW_ANIMATION),
-                    eq(record.mAdapter));
-            verify(mThumbnailFinishedCallback).onAnimationFinished(
-                    eq(ANIMATION_TYPE_WINDOW_ANIMATION), eq(record.mThumbnailAdapter));
-        } finally {
-            mDisplayContent.mChangingContainers.clear();
-        }
-    }
-
-    @Test
-    public void testWallpaperIncluded_expectTarget() throws Exception {
-        final WindowToken wallpaperWindowToken = new WallpaperWindowToken(mWm, mock(IBinder.class),
-                true, mDisplayContent, true /* ownerCanManageAppTokens */);
-        spyOn(mDisplayContent.mWallpaperController);
-        doReturn(true).when(mDisplayContent.mWallpaperController).isWallpaperVisible();
-        final WindowState win = createTestWindow();
-        mDisplayContent.mOpeningApps.add(win.mActivityRecord);
-        try {
-            final AnimationAdapter adapter = mController.createRemoteAnimationRecord(
-                    win.mActivityRecord,
-                    new Point(50, 100), null, new Rect(50, 100, 150, 150), null, false).mAdapter;
-            adapter.startAnimation(mMockLeash, mMockTransaction, ANIMATION_TYPE_APP_TRANSITION,
-                    mFinishedCallback);
-            mController.goodToGo(TRANSIT_OLD_ACTIVITY_OPEN);
-            waitUntilWindowAnimatorIdle();
-            final ArgumentCaptor<RemoteAnimationTarget[]> appsCaptor =
-                    ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
-            final ArgumentCaptor<RemoteAnimationTarget[]> wallpapersCaptor =
-                    ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
-            final ArgumentCaptor<RemoteAnimationTarget[]> nonAppsCaptor =
-                    ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
-            final ArgumentCaptor<IRemoteAnimationFinishedCallback> finishedCaptor =
-                    ArgumentCaptor.forClass(IRemoteAnimationFinishedCallback.class);
-            verify(mMockRunner).onAnimationStart(eq(TRANSIT_OLD_ACTIVITY_OPEN),
-                    appsCaptor.capture(), wallpapersCaptor.capture(), nonAppsCaptor.capture(),
-                    finishedCaptor.capture());
-            assertEquals(1, wallpapersCaptor.getValue().length);
-        } finally {
-            mDisplayContent.mOpeningApps.clear();
-        }
-    }
-
-    @Test
-    public void testWallpaperAnimatorCanceled_expectAnimationKeepsRunning() throws Exception {
-        final WindowToken wallpaperWindowToken = new WallpaperWindowToken(mWm, mock(IBinder.class),
-                true, mDisplayContent, true /* ownerCanManageAppTokens */);
-        spyOn(mDisplayContent.mWallpaperController);
-        doReturn(true).when(mDisplayContent.mWallpaperController).isWallpaperVisible();
-        final WindowState win = createTestWindow();
-        mDisplayContent.mOpeningApps.add(win.mActivityRecord);
-        try {
-            final AnimationAdapter adapter = mController.createRemoteAnimationRecord(
-                    win.mActivityRecord,
-                    new Point(50, 100), null, new Rect(50, 100, 150, 150), null, false).mAdapter;
-            adapter.startAnimation(mMockLeash, mMockTransaction, ANIMATION_TYPE_APP_TRANSITION,
-                    mFinishedCallback);
-            mController.goodToGo(TRANSIT_OLD_ACTIVITY_OPEN);
-            waitUntilWindowAnimatorIdle();
-            final ArgumentCaptor<RemoteAnimationTarget[]> appsCaptor =
-                    ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
-            final ArgumentCaptor<RemoteAnimationTarget[]> wallpapersCaptor =
-                    ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
-            final ArgumentCaptor<RemoteAnimationTarget[]> nonAPpsCaptor =
-                    ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
-            final ArgumentCaptor<IRemoteAnimationFinishedCallback> finishedCaptor =
-                    ArgumentCaptor.forClass(IRemoteAnimationFinishedCallback.class);
-            verify(mMockRunner).onAnimationStart(eq(TRANSIT_OLD_ACTIVITY_OPEN),
-                    appsCaptor.capture(), wallpapersCaptor.capture(), nonAPpsCaptor.capture(),
-                    finishedCaptor.capture());
-            assertEquals(1, wallpapersCaptor.getValue().length);
-
-            // Cancel the wallpaper window animator and ensure the runner is not canceled
-            wallpaperWindowToken.cancelAnimation();
-            verify(mMockRunner, never()).onAnimationCancelled();
-        } finally {
-            mDisplayContent.mOpeningApps.clear();
-        }
-    }
-
-    @Test
-    public void testNonAppIncluded_keygaurdGoingAway() throws Exception {
-        final WindowState win = createTestWindow();
-        mDisplayContent.mOpeningApps.add(win.mActivityRecord);
-        // Add overlay window hidden by the keyguard.
-        final WindowState overlayWin = createAppOverlayWindow();
-        overlayWin.hide(false /* doAnimation */, false /* requestAnim */);
-        try {
-            final AnimationAdapter adapter = mController.createRemoteAnimationRecord(
-                    win.mActivityRecord, new Point(50, 100), null,
-                    new Rect(50, 100, 150, 150), null, false).mAdapter;
-            adapter.startAnimation(mMockLeash, mMockTransaction, ANIMATION_TYPE_APP_TRANSITION,
-                    mFinishedCallback);
-            mController.goodToGo(TRANSIT_OLD_KEYGUARD_GOING_AWAY);
-            waitUntilWindowAnimatorIdle();
-            final ArgumentCaptor<RemoteAnimationTarget[]> appsCaptor =
-                    ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
-            final ArgumentCaptor<RemoteAnimationTarget[]> wallpapersCaptor =
-                    ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
-            final ArgumentCaptor<RemoteAnimationTarget[]> nonAppsCaptor =
-                    ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
-            final ArgumentCaptor<IRemoteAnimationFinishedCallback> finishedCaptor =
-                    ArgumentCaptor.forClass(IRemoteAnimationFinishedCallback.class);
-            verify(mMockRunner).onAnimationStart(eq(TRANSIT_OLD_KEYGUARD_GOING_AWAY),
-                    appsCaptor.capture(), wallpapersCaptor.capture(), nonAppsCaptor.capture(),
-                    finishedCaptor.capture());
-            assertEquals(1, appsCaptor.getValue().length);
-            final RemoteAnimationTarget app = appsCaptor.getValue()[0];
-            assertEquals(new Point(50, 100), app.position);
-            assertEquals(new Rect(50, 100, 150, 150), app.sourceContainerBounds);
-            assertEquals(win.mActivityRecord.getPrefixOrderIndex(), app.prefixOrderIndex);
-            assertEquals(win.mActivityRecord.getTask().mTaskId, app.taskId);
-            assertEquals(mMockLeash, app.leash);
-            assertEquals(false, app.isTranslucent);
-            verify(mMockTransaction).setPosition(mMockLeash, app.position.x, app.position.y);
-            verify(mMockTransaction).setWindowCrop(mMockLeash, 100, 50);
-
-            finishedCaptor.getValue().onAnimationFinished();
-            verify(mFinishedCallback).onAnimationFinished(eq(ANIMATION_TYPE_APP_TRANSITION),
-                    eq(adapter));
-            assertEquals(1, nonAppsCaptor.getValue().length);
-        } finally {
-            mDisplayContent.mOpeningApps.clear();
-        }
-    }
-
-    @Test
-    public void testNonAppIncluded_keygaurdGoingAwayToWallpaper() throws Exception {
-        final WindowToken wallpaperWindowToken = new WallpaperWindowToken(mWm, mock(IBinder.class),
-                true, mDisplayContent, true /* ownerCanManageAppTokens */);
-        spyOn(mDisplayContent.mWallpaperController);
-        doReturn(true).when(mDisplayContent.mWallpaperController).isWallpaperVisible();
-        final WindowState win = createTestWindow();
-        mDisplayContent.mOpeningApps.add(win.mActivityRecord);
-        // Add overlay window hidden by the keyguard.
-        final WindowState overlayWin = createAppOverlayWindow();
-        overlayWin.hide(false /* doAnimation */, false /* requestAnim */);
-        try {
-            final AnimationAdapter adapter = mController.createRemoteAnimationRecord(
-                    win.mActivityRecord, new Point(50, 100), null,
-                    new Rect(50, 100, 150, 150), null, false).mAdapter;
-            adapter.startAnimation(mMockLeash, mMockTransaction, ANIMATION_TYPE_APP_TRANSITION,
-                    mFinishedCallback);
-            mController.goodToGo(TRANSIT_OLD_KEYGUARD_GOING_AWAY_ON_WALLPAPER);
-            waitUntilWindowAnimatorIdle();
-            final ArgumentCaptor<RemoteAnimationTarget[]> appsCaptor =
-                    ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
-            final ArgumentCaptor<RemoteAnimationTarget[]> wallpapersCaptor =
-                    ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
-            final ArgumentCaptor<RemoteAnimationTarget[]> nonAppsCaptor =
-                    ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
-            final ArgumentCaptor<IRemoteAnimationFinishedCallback> finishedCaptor =
-                    ArgumentCaptor.forClass(IRemoteAnimationFinishedCallback.class);
-            verify(mMockRunner).onAnimationStart(eq(TRANSIT_OLD_KEYGUARD_GOING_AWAY_ON_WALLPAPER),
-                    appsCaptor.capture(), wallpapersCaptor.capture(), nonAppsCaptor.capture(),
-                    finishedCaptor.capture());
-            assertEquals(1, wallpapersCaptor.getValue().length);
-            assertEquals(1, nonAppsCaptor.getValue().length);
-        } finally {
-            mDisplayContent.mOpeningApps.clear();
-        }
-    }
-
-    @Test
-    public void testNonAppTarget_sendNavBar() throws Exception {
-        final int transit = TRANSIT_OLD_TASK_OPEN;
-        final AnimationAdapter adapter = setupForNonAppTargetNavBar(transit, true);
-
-        final ArgumentCaptor<RemoteAnimationTarget[]> nonAppsCaptor =
-                ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
-        final ArgumentCaptor<IRemoteAnimationFinishedCallback> finishedCaptor =
-                ArgumentCaptor.forClass(IRemoteAnimationFinishedCallback.class);
-        verify(mMockRunner).onAnimationStart(eq(transit), any(), any(),
-                nonAppsCaptor.capture(), finishedCaptor.capture());
-        boolean containNavTarget = false;
-        for (int i = 0; i < nonAppsCaptor.getValue().length; i++) {
-            if (nonAppsCaptor.getValue()[0].windowType == TYPE_NAVIGATION_BAR) {
-                containNavTarget = true;
-                break;
-            }
-        }
-        assertTrue(containNavTarget);
-        assertEquals(1, mController.mPendingNonAppAnimations.size());
-        final NonAppWindowAnimationAdapter nonAppAdapter =
-                mController.mPendingNonAppAnimations.get(0);
-        spyOn(nonAppAdapter.getLeashFinishedCallback());
-
-        finishedCaptor.getValue().onAnimationFinished();
-        verify(mFinishedCallback).onAnimationFinished(eq(ANIMATION_TYPE_APP_TRANSITION),
-                eq(adapter));
-        verify(nonAppAdapter.getLeashFinishedCallback())
-                .onAnimationFinished(nonAppAdapter.getLastAnimationType(), nonAppAdapter);
-    }
-
-    @Test
-    public void testNonAppTarget_notSendNavBar_notAttachToApp() throws Exception {
-        final int transit = TRANSIT_OLD_TASK_OPEN;
-        setupForNonAppTargetNavBar(transit, false);
-
-        final ArgumentCaptor<RemoteAnimationTarget[]> nonAppsCaptor =
-                ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
-        verify(mMockRunner).onAnimationStart(eq(transit),
-                any(), any(), nonAppsCaptor.capture(), any());
-        for (int i = 0; i < nonAppsCaptor.getValue().length; i++) {
-            if (nonAppsCaptor.getValue()[0].windowType == TYPE_NAVIGATION_BAR) {
-                fail("Non-app animation target must not contain navbar");
-            }
-        }
-    }
-
-    @Test
-    public void testNonAppTarget_notSendNavBar_controlledByFadeRotation() throws Exception {
-        final AsyncRotationController mockController =
-                mock(AsyncRotationController.class);
-        doReturn(mockController).when(mDisplayContent).getAsyncRotationController();
-        final int transit = TRANSIT_OLD_TASK_OPEN;
-        setupForNonAppTargetNavBar(transit, true);
-
-        final ArgumentCaptor<RemoteAnimationTarget[]> nonAppsCaptor =
-                ArgumentCaptor.forClass(RemoteAnimationTarget[].class);
-        verify(mMockRunner).onAnimationStart(eq(transit),
-                any(), any(), nonAppsCaptor.capture(), any());
-        for (int i = 0; i < nonAppsCaptor.getValue().length; i++) {
-            if (nonAppsCaptor.getValue()[0].windowType == TYPE_NAVIGATION_BAR) {
-                fail("Non-app animation target must not contain navbar");
-            }
-        }
-    }
-
-    private AnimationAdapter setupForNonAppTargetNavBar(int transit, boolean shouldAttachNavBar) {
-        final WindowState win = createTestWindow();
-        mDisplayContent.mOpeningApps.add(win.mActivityRecord);
-        final WindowState navBar = newWindowBuilder("NavigationBar", TYPE_NAVIGATION_BAR).build();
-        mDisplayContent.getDisplayPolicy().addWindowLw(navBar, navBar.mAttrs);
-        final DisplayPolicy policy = mDisplayContent.getDisplayPolicy();
-        spyOn(policy);
-        doReturn(shouldAttachNavBar).when(policy).shouldAttachNavBarToAppDuringTransition();
-
-        final AnimationAdapter adapter = mController.createRemoteAnimationRecord(
-                win.mActivityRecord, new Point(50, 100), null,
-                new Rect(50, 100, 150, 150), null, false).mAdapter;
-        adapter.startAnimation(mMockLeash, mMockTransaction, ANIMATION_TYPE_APP_TRANSITION,
-                mFinishedCallback);
-        mController.goodToGo(transit);
-        waitUntilWindowAnimatorIdle();
-        return adapter;
-    }
-
-    private static void verifyNoMoreInteractionsExceptAsBinder(IInterface binder) {
-        verify(binder, atLeast(0)).asBinder();
-        verifyNoMoreInteractions(binder);
-    }
-
-    private WindowState createTestWindow() {
-        return newWindowBuilder("testWin", TYPE_BASE_APPLICATION).build();
-    }
-}
diff --git a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
index fc4f54a..e4a1bf6 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
@@ -454,31 +454,6 @@
     }
 
     @Test
-    public void testMovingBottomMostRootTaskActivityToPinnedRootTask() {
-        final Task fullscreenTask = mRootWindowContainer.getDefaultTaskDisplayArea().createRootTask(
-                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
-        final ActivityRecord firstActivity = new ActivityBuilder(mAtm)
-                .setTask(fullscreenTask).build();
-        final Task task = firstActivity.getTask();
-
-        final ActivityRecord secondActivity = new ActivityBuilder(mAtm)
-                .setTask(fullscreenTask).build();
-
-        fullscreenTask.moveTaskToBack(task);
-
-        // Ensure full screen task has both tasks.
-        ensureTaskPlacement(fullscreenTask, firstActivity, secondActivity);
-        assertEquals(task.getTopMostActivity(), secondActivity);
-        firstActivity.setState(STOPPED, "testMovingBottomMostRootTaskActivityToPinnedRootTask");
-
-
-        // Move first activity to pinned root task.
-        mRootWindowContainer.moveActivityToPinnedRootTask(secondActivity, "initialMove");
-
-        assertTrue(firstActivity.mRequestForceTransition);
-    }
-
-    @Test
     public void testMultipleActivitiesTaskEnterPip() {
         // Enable shell transition because the order of setting windowing mode is different.
         registerTestTransitionPlayer();
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 dba463a..1dc32b0 100644
--- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
@@ -1811,9 +1811,9 @@
         }
         addStatusBar(mActivity.mDisplayContent);
 
-        mActivity.setVisible(false);
-        mActivity.mDisplayContent.prepareAppTransition(WindowManager.TRANSIT_OPEN);
-        mActivity.mDisplayContent.mOpeningApps.add(mActivity);
+        mActivity.setVisibleRequested(false);
+        requestTransition(mActivity, WindowManager.TRANSIT_OPEN);
+        mActivity.setVisibility(true);
         final float maxAspect = 1.8f;
         prepareUnresizable(mActivity, maxAspect, SCREEN_ORIENTATION_LANDSCAPE);
 
@@ -4486,6 +4486,49 @@
     }
 
     @Test
+    @EnableFlags(Flags.FLAG_EXCLUDE_CAPTION_FROM_APP_BOUNDS)
+    @DisableCompatChanges({ActivityInfo.INSETS_DECOUPLED_CONFIGURATION_ENFORCED})
+    public void testInFreeform_boundsSandboxedToAppBounds() {
+        allowDesktopMode();
+        final int dw = 2800;
+        final int dh = 1400;
+        final int notchHeight = 100;
+        final DisplayContent display = new TestDisplayContent.Builder(mAtm, dw, dh)
+                .setNotch(notchHeight)
+                .build();
+        setUpApp(display);
+        prepareUnresizable(mActivity, SCREEN_ORIENTATION_PORTRAIT);
+
+        mTask.mDisplayContent.getDefaultTaskDisplayArea()
+                .setWindowingMode(WindowConfiguration.WINDOWING_MODE_FREEFORM);
+        mTask.setWindowingMode(WINDOWING_MODE_FREEFORM);
+        Rect appBounds = new Rect(0, 0, 1000, 500);
+        Rect bounds = new Rect(0, 0, 1000, 600);
+        mTask.getWindowConfiguration().setAppBounds(appBounds);
+        mTask.getWindowConfiguration().setBounds(bounds);
+        mActivity.onConfigurationChanged(mTask.getConfiguration());
+
+        // Bounds are sandboxed to appBounds in freeform.
+        assertDownScaled();
+        assertEquals(mActivity.getWindowConfiguration().getAppBounds(),
+                mActivity.getWindowConfiguration().getBounds());
+
+        // Exit freeform.
+        mTask.mDisplayContent.getDefaultTaskDisplayArea()
+                .setWindowingMode(WindowConfiguration.WINDOWING_MODE_FULLSCREEN);
+        mTask.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
+        mTask.getWindowConfiguration().setBounds(new Rect(0, 0, dw, dh));
+        mActivity.onConfigurationChanged(mTask.getConfiguration());
+        assertFitted();
+        appBounds = mActivity.getWindowConfiguration().getAppBounds();
+        bounds = mActivity.getWindowConfiguration().getBounds();
+        // Bounds are not sandboxed to appBounds.
+        assertNotEquals(appBounds, bounds);
+        assertEquals(notchHeight, appBounds.top - bounds.top);
+    }
+
+
+    @Test
     @EnableFlags(Flags.FLAG_IGNORE_ASPECT_RATIO_RESTRICTIONS_FOR_RESIZEABLE_FREEFORM_ACTIVITIES)
     public void testUserAspectRatioOverridesNotAppliedToResizeableFreeformActivity() {
         final TaskBuilder taskBuilder =
diff --git a/services/tests/wmtests/src/com/android/server/wm/SurfaceAnimatorTest.java b/services/tests/wmtests/src/com/android/server/wm/SurfaceAnimatorTest.java
index 7dba142..2544550 100644
--- a/services/tests/wmtests/src/com/android/server/wm/SurfaceAnimatorTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/SurfaceAnimatorTest.java
@@ -22,6 +22,7 @@
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
 import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_APP_TRANSITION;
+import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_WINDOW_ANIMATION;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -69,7 +70,6 @@
 
     private MyAnimatable mAnimatable;
     private MyAnimatable mAnimatable2;
-    private DeferFinishAnimatable mDeferFinishAnimatable;
 
     @Before
     public void setUp() throws Exception {
@@ -77,14 +77,12 @@
 
         mAnimatable = new MyAnimatable(mWm, mTransaction);
         mAnimatable2 = new MyAnimatable(mWm, mTransaction);
-        mDeferFinishAnimatable = new DeferFinishAnimatable(mWm, mTransaction);
     }
 
     @After
     public void tearDown() {
         mAnimatable = null;
         mAnimatable2 = null;
-        mDeferFinishAnimatable = null;
     }
 
     @Test
@@ -202,41 +200,33 @@
     }
 
     @Test
-    public void testDeferFinish() {
-
-        // Start animation
-        final OnAnimationFinishedCallback onFinishedCallback = startDeferFinishAnimatable(mSpec);
-
-        // Finish the animation but then make sure we are deferring.
-        onFinishedCallback.onAnimationFinished(ANIMATION_TYPE_APP_TRANSITION, mSpec);
-        assertAnimating(mDeferFinishAnimatable);
-
-        // Now end defer finishing.
-        mDeferFinishAnimatable.mEndDeferFinishCallback.run();
-        assertNotAnimating(mAnimatable2);
-        assertTrue(mDeferFinishAnimatable.mFinishedCallbackCalled);
-        assertEquals(ANIMATION_TYPE_APP_TRANSITION, mDeferFinishAnimatable.mFinishedAnimationType);
-        verify(mTransaction).remove(eq(mDeferFinishAnimatable.mLeash));
-    }
-
-    @Test
     public void testDeferFinishDoNotFinishNextAnimation() {
+        final DeferredFinishAdapter deferredFinishAdapter = new DeferredFinishAdapter();
+        spyOn(deferredFinishAdapter);
         // Start the first animation.
-        final OnAnimationFinishedCallback onFinishedCallback = startDeferFinishAnimatable(mSpec);
-        onFinishedCallback.onAnimationFinished(ANIMATION_TYPE_APP_TRANSITION, mSpec);
+        mAnimatable.mSurfaceAnimator.startAnimation(mTransaction, deferredFinishAdapter,
+                true /* hidden */, ANIMATION_TYPE_WINDOW_ANIMATION);
+        assertAnimating(mAnimatable);
+        final ArgumentCaptor<OnAnimationFinishedCallback> callbackCaptor = ArgumentCaptor.forClass(
+                OnAnimationFinishedCallback.class);
+        verify(deferredFinishAdapter).startAnimation(any(), any(),
+                eq(ANIMATION_TYPE_WINDOW_ANIMATION), callbackCaptor.capture());
+        final OnAnimationFinishedCallback onFinishedCallback = callbackCaptor.getValue();
+        onFinishedCallback.onAnimationFinished(ANIMATION_TYPE_APP_TRANSITION,
+                deferredFinishAdapter);
         // The callback is the resetAndInvokeFinish in {@link SurfaceAnimator#getFinishedCallback}.
-        final Runnable firstDeferFinishCallback = mDeferFinishAnimatable.mEndDeferFinishCallback;
+        final Runnable firstDeferFinishCallback = deferredFinishAdapter.mEndDeferFinishCallback;
 
         // Start the second animation.
-        mDeferFinishAnimatable.mSurfaceAnimator.cancelAnimation();
-        startDeferFinishAnimatable(mSpec2);
-        mDeferFinishAnimatable.mFinishedCallbackCalled = false;
+        mAnimatable.mSurfaceAnimator.cancelAnimation();
+        mAnimatable.mSurfaceAnimator.startAnimation(mTransaction, mSpec2,
+                true /* hidden */, ANIMATION_TYPE_WINDOW_ANIMATION);
+        mAnimatable.mFinishedCallbackCalled = false;
 
-        // Simulate the first deferred callback is executed from
-        // {@link AnimatingActivityRegistry#endDeferringFinished}.
+        // Simulate the first deferred callback is executed.
         firstDeferFinishCallback.run();
         // The second animation should not be finished.
-        assertFalse(mDeferFinishAnimatable.mFinishedCallbackCalled);
+        assertFalse(mAnimatable.mFinishedCallbackCalled);
     }
 
     @Test
@@ -260,17 +250,6 @@
         verify(mTransaction).remove(eq(deferredFinishAdapter.mAnimationLeash));
     }
 
-    private OnAnimationFinishedCallback startDeferFinishAnimatable(AnimationAdapter anim) {
-        mDeferFinishAnimatable.mSurfaceAnimator.startAnimation(mTransaction, anim,
-                true /* hidden */, ANIMATION_TYPE_APP_TRANSITION);
-        final ArgumentCaptor<OnAnimationFinishedCallback> callbackCaptor = ArgumentCaptor.forClass(
-                OnAnimationFinishedCallback.class);
-        assertAnimating(mDeferFinishAnimatable);
-        verify(anim).startAnimation(any(), any(), eq(ANIMATION_TYPE_APP_TRANSITION),
-                callbackCaptor.capture());
-        return callbackCaptor.getValue();
-    }
-
     private void assertAnimating(MyAnimatable animatable) {
         assertTrue(animatable.mSurfaceAnimator.isAnimating());
         assertNotNull(animatable.mSurfaceAnimator.getAnimation());
@@ -370,21 +349,6 @@
         };
     }
 
-    private static class DeferFinishAnimatable extends MyAnimatable {
-
-        Runnable mEndDeferFinishCallback;
-
-        DeferFinishAnimatable(WindowManagerService wm, Transaction transaction) {
-            super(wm, transaction);
-        }
-
-        @Override
-        public boolean shouldDeferAnimationFinish(Runnable endDeferFinishCallback) {
-            mEndDeferFinishCallback = endDeferFinishCallback;
-            return true;
-        }
-    }
-
     private static class DeferredFinishAdapter implements AnimationAdapter {
 
         private Runnable mEndDeferFinishCallback;
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentOrganizerControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentOrganizerControllerTest.java
index 546ecc6..ab76ae8 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentOrganizerControllerTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentOrganizerControllerTest.java
@@ -29,14 +29,14 @@
 import static android.window.TaskFragmentOperation.OP_TYPE_CREATE_OR_MOVE_TASK_FRAGMENT_DECOR_SURFACE;
 import static android.window.TaskFragmentOperation.OP_TYPE_CREATE_TASK_FRAGMENT;
 import static android.window.TaskFragmentOperation.OP_TYPE_DELETE_TASK_FRAGMENT;
+import static android.window.TaskFragmentOperation.OP_TYPE_PRIVILEGED_REORDER_TO_BOTTOM_OF_TASK;
+import static android.window.TaskFragmentOperation.OP_TYPE_PRIVILEGED_REORDER_TO_TOP_OF_TASK;
+import static android.window.TaskFragmentOperation.OP_TYPE_PRIVILEGED_SET_CAN_AFFECT_SYSTEM_UI_FLAGS;
 import static android.window.TaskFragmentOperation.OP_TYPE_REMOVE_TASK_FRAGMENT_DECOR_SURFACE;
-import static android.window.TaskFragmentOperation.OP_TYPE_REORDER_TO_BOTTOM_OF_TASK;
 import static android.window.TaskFragmentOperation.OP_TYPE_REORDER_TO_FRONT;
-import static android.window.TaskFragmentOperation.OP_TYPE_REORDER_TO_TOP_OF_TASK;
 import static android.window.TaskFragmentOperation.OP_TYPE_REPARENT_ACTIVITY_TO_TASK_FRAGMENT;
 import static android.window.TaskFragmentOperation.OP_TYPE_SET_ADJACENT_TASK_FRAGMENTS;
 import static android.window.TaskFragmentOperation.OP_TYPE_SET_ANIMATION_PARAMS;
-import static android.window.TaskFragmentOperation.OP_TYPE_SET_CAN_AFFECT_SYSTEM_UI_FLAGS;
 import static android.window.TaskFragmentOperation.OP_TYPE_SET_DIM_ON_TASK;
 import static android.window.TaskFragmentOperation.OP_TYPE_START_ACTIVITY_IN_TASK_FRAGMENT;
 import static android.window.TaskFragmentOrganizer.KEY_ERROR_CALLBACK_OP_TYPE;
@@ -1821,7 +1821,7 @@
 
         // Reorder TaskFragment to bottom
         final TaskFragmentOperation operation = new TaskFragmentOperation.Builder(
-                OP_TYPE_REORDER_TO_BOTTOM_OF_TASK).build();
+                OP_TYPE_PRIVILEGED_REORDER_TO_BOTTOM_OF_TASK).build();
         mTransaction.addTaskFragmentOperation(tf1.getFragmentToken(), operation);
         assertApplyTransactionAllowed(mTransaction);
 
@@ -1858,7 +1858,7 @@
 
         // Reorder TaskFragment to top
         final TaskFragmentOperation operation = new TaskFragmentOperation.Builder(
-                OP_TYPE_REORDER_TO_TOP_OF_TASK).build();
+                OP_TYPE_PRIVILEGED_REORDER_TO_TOP_OF_TASK).build();
         mTransaction.addTaskFragmentOperation(tf0.getFragmentToken(), operation);
         assertApplyTransactionAllowed(mTransaction);
 
@@ -1903,13 +1903,13 @@
     @Test
     public void testApplyTransaction_reorderToBottomOfTask_failsIfNotSystemOrganizer() {
         testApplyTransaction_reorder_failsIfNotSystemOrganizer_common(
-                OP_TYPE_REORDER_TO_BOTTOM_OF_TASK);
+                OP_TYPE_PRIVILEGED_REORDER_TO_BOTTOM_OF_TASK);
     }
 
     @Test
     public void testApplyTransaction_reorderToTopOfTask_failsIfNotSystemOrganizer() {
         testApplyTransaction_reorder_failsIfNotSystemOrganizer_common(
-                OP_TYPE_REORDER_TO_TOP_OF_TASK);
+                OP_TYPE_PRIVILEGED_REORDER_TO_TOP_OF_TASK);
     }
 
     @Test
@@ -1922,7 +1922,7 @@
 
         // Setting the flag to false.
         TaskFragmentOperation operation = new TaskFragmentOperation.Builder(
-                OP_TYPE_SET_CAN_AFFECT_SYSTEM_UI_FLAGS).setBooleanValue(false).build();
+                OP_TYPE_PRIVILEGED_SET_CAN_AFFECT_SYSTEM_UI_FLAGS).setBooleanValue(false).build();
         mTransaction.addTaskFragmentOperation(tf.getFragmentToken(), operation);
 
         assertApplyTransactionAllowed(mTransaction);
@@ -1931,7 +1931,7 @@
 
         // Setting the flag back to true.
         operation = new TaskFragmentOperation.Builder(
-                OP_TYPE_SET_CAN_AFFECT_SYSTEM_UI_FLAGS).setBooleanValue(true).build();
+                OP_TYPE_PRIVILEGED_SET_CAN_AFFECT_SYSTEM_UI_FLAGS).setBooleanValue(true).build();
         mTransaction.addTaskFragmentOperation(tf.getFragmentToken(), operation);
 
         assertApplyTransactionAllowed(mTransaction);
@@ -1945,7 +1945,7 @@
         final TaskFragment tf = createTaskFragment(task);
 
         TaskFragmentOperation operation = new TaskFragmentOperation.Builder(
-                OP_TYPE_SET_CAN_AFFECT_SYSTEM_UI_FLAGS).setBooleanValue(false).build();
+                OP_TYPE_PRIVILEGED_SET_CAN_AFFECT_SYSTEM_UI_FLAGS).setBooleanValue(false).build();
         mTransaction
                 .addTaskFragmentOperation(tf.getFragmentToken(), operation)
                 .setErrorCallbackToken(mErrorToken);
@@ -1955,7 +1955,7 @@
         // The pending event will be dispatched on the handler (from requestTraversal).
         waitHandlerIdle(mWm.mAnimationHandler);
 
-        assertTaskFragmentErrorTransaction(OP_TYPE_SET_CAN_AFFECT_SYSTEM_UI_FLAGS,
+        assertTaskFragmentErrorTransaction(OP_TYPE_PRIVILEGED_SET_CAN_AFFECT_SYSTEM_UI_FLAGS,
                 SecurityException.class);
     }
 
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 0014465..edffab8 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
@@ -32,8 +32,6 @@
 import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
 import static android.view.WindowManager.TRANSIT_CLOSE;
 import static android.view.WindowManager.TRANSIT_OLD_TASK_CLOSE;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_OPEN;
-import static android.view.WindowManager.TRANSIT_OPEN;
 import static android.window.DisplayAreaOrganizer.FEATURE_DEFAULT_TASK_CONTAINER;
 
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.any;
@@ -85,12 +83,8 @@
 import android.platform.test.annotations.Presubmit;
 import android.platform.test.annotations.RequiresFlagsEnabled;
 import android.util.ArraySet;
-import android.view.IRemoteAnimationFinishedCallback;
-import android.view.IRemoteAnimationRunner;
 import android.view.InsetsFrameProvider;
 import android.view.InsetsSource;
-import android.view.RemoteAnimationAdapter;
-import android.view.RemoteAnimationTarget;
 import android.view.SurfaceControl;
 import android.view.SurfaceSession;
 import android.view.WindowInsets;
@@ -1055,25 +1049,6 @@
     }
 
     @Test
-    public void testTaskCanApplyAnimation() {
-        final Task rootTask = createTask(mDisplayContent);
-        final Task task = createTaskInRootTask(rootTask, 0 /* userId */);
-        final ActivityRecord activity2 = createActivityRecord(mDisplayContent, task);
-        final ActivityRecord activity1 = createActivityRecord(mDisplayContent, task);
-        verifyWindowContainerApplyAnimation(task, activity1, activity2);
-    }
-
-    @Test
-    public void testRootTaskCanApplyAnimation() {
-        final Task rootTask = createTask(mDisplayContent);
-        final ActivityRecord activity2 = createActivityRecord(mDisplayContent,
-                createTaskInRootTask(rootTask, 0 /* userId */));
-        final ActivityRecord activity1 = createActivityRecord(mDisplayContent,
-                createTaskInRootTask(rootTask, 0 /* userId */));
-        verifyWindowContainerApplyAnimation(rootTask, activity1, activity2);
-    }
-
-    @Test
     public void testGetDisplayArea() {
         // WindowContainer
         final WindowContainer windowContainer = new WindowContainer(mWm);
@@ -1103,59 +1078,6 @@
         assertEquals(displayArea, displayArea.getDisplayArea());
     }
 
-    private void verifyWindowContainerApplyAnimation(WindowContainer wc, ActivityRecord act,
-            ActivityRecord act2) {
-        // Initial remote animation for app transition.
-        final RemoteAnimationAdapter adapter = new RemoteAnimationAdapter(
-                new IRemoteAnimationRunner.Stub() {
-                    @Override
-                    public void onAnimationStart(@WindowManager.TransitionOldType int transit,
-                            RemoteAnimationTarget[] apps,
-                            RemoteAnimationTarget[] wallpapers,
-                            RemoteAnimationTarget[] nonApps,
-                            IRemoteAnimationFinishedCallback finishedCallback) {
-                        try {
-                            finishedCallback.onAnimationFinished();
-                        } catch (RemoteException e) {
-                            e.printStackTrace();
-                        }
-                    }
-
-                    @Override
-                    public void onAnimationCancelled() {
-                    }
-                }, 0, 0, false);
-        adapter.setCallingPidUid(123, 456);
-        wc.getDisplayContent().prepareAppTransition(TRANSIT_OPEN);
-        wc.getDisplayContent().mAppTransition.overridePendingAppTransitionRemote(adapter);
-        spyOn(wc);
-        doReturn(true).when(wc).okToAnimate();
-
-        // Make sure animating state is as expected after applied animation.
-
-        // Animation target is promoted from act to wc. act2 is a descendant of wc, but not a source
-        // of the animation.
-        ArrayList<WindowContainer<WindowState>> sources = new ArrayList<>();
-        sources.add(act);
-        assertTrue(wc.applyAnimation(null, TRANSIT_OLD_TASK_OPEN, true, false, sources));
-
-        assertEquals(act, wc.getTopMostActivity());
-        assertTrue(wc.isAnimating());
-        assertTrue(wc.isAnimating(0, ANIMATION_TYPE_APP_TRANSITION));
-        assertTrue(wc.getAnimationSources().contains(act));
-        assertFalse(wc.getAnimationSources().contains(act2));
-        assertTrue(act.isAnimating(PARENTS));
-        assertTrue(act.isAnimating(PARENTS, ANIMATION_TYPE_APP_TRANSITION));
-        assertEquals(wc, act.getAnimatingContainer(PARENTS, ANIMATION_TYPE_APP_TRANSITION));
-
-        // Make sure animation finish callback will be received and reset animating state after
-        // animation finish.
-        wc.getDisplayContent().mAppTransition.goodToGo(TRANSIT_OLD_TASK_OPEN, act);
-        verify(wc).onAnimationFinished(eq(ANIMATION_TYPE_APP_TRANSITION), any());
-        assertFalse(wc.isAnimating());
-        assertFalse(act.isAnimating(PARENTS));
-    }
-
     @Test
     public void testRegisterWindowContainerListener() {
         final WindowContainer container = new WindowContainer(mWm);
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowContainerThumbnailTest.java b/services/tests/wmtests/src/com/android/server/wm/WindowContainerThumbnailTest.java
deleted file mode 100644
index 849072e..0000000
--- a/services/tests/wmtests/src/com/android/server/wm/WindowContainerThumbnailTest.java
+++ /dev/null
@@ -1,65 +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.
- */
-
-package com.android.server.wm;
-
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.when;
-
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.mockito.ArgumentMatchers.any;
-
-import android.hardware.HardwareBuffer;
-import android.platform.test.annotations.Presubmit;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.server.testutils.StubTransaction;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-/**
- * Test class for {@link TaskSnapshotSurface}.
- *
- * Build/Install/Run:
- *  atest WmTests:WindowContainerThumbnailTest
- *
- */
-@SmallTest
-@Presubmit
-@RunWith(WindowTestRunner.class)
-public class WindowContainerThumbnailTest extends WindowTestsBase {
-    private WindowContainerThumbnail buildThumbnail() {
-        final HardwareBuffer buffer = HardwareBuffer.create(1, 1, HardwareBuffer.RGBA_8888,
-                1, HardwareBuffer.USAGE_CPU_READ_RARELY);
-        final ActivityRecord mockAr = mock(ActivityRecord.class);
-        when(mockAr.getPendingTransaction()).thenReturn(new StubTransaction());
-        when(mockAr.makeChildSurface(any())).thenReturn(new MockSurfaceControlBuilder());
-        when(mockAr.makeSurface()).thenReturn(new MockSurfaceControlBuilder());
-        return new WindowContainerThumbnail(new StubTransaction(), mockAr, buffer,
-                mock(SurfaceAnimator.class));
-    }
-
-    @Test
-    public void testDestroy_nullsSurface() {
-        final WindowContainerThumbnail t = buildThumbnail();
-        assertNotNull(t.getSurfaceControl());
-        t.destroy();
-        assertNull(t.getSurfaceControl());
-    }
-}
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java
index 1281be51..7030d986 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java
@@ -26,6 +26,7 @@
 import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
 import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
 import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
+import static android.content.pm.ActivityInfo.CONFIG_UI_MODE;
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET;
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
@@ -33,6 +34,8 @@
 import static android.content.pm.PackageManager.PERMISSION_GRANTED;
 import static android.content.res.Configuration.SCREEN_HEIGHT_DP_UNDEFINED;
 import static android.content.res.Configuration.SCREEN_WIDTH_DP_UNDEFINED;
+import static android.content.res.Configuration.UI_MODE_NIGHT_NO;
+import static android.content.res.Configuration.UI_MODE_NIGHT_YES;
 import static android.view.InsetsSource.FLAG_FORCE_CONSUMING;
 import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
 import static android.window.DisplayAreaOrganizer.FEATURE_VENDOR_FIRST;
@@ -1983,6 +1986,30 @@
         testSetAlwaysOnTop(displayArea);
     }
 
+    @Test
+    public void testConfigurationsAreEqualForOrganizer() {
+        Configuration config1 = new Configuration();
+        config1.smallestScreenWidthDp = 300;
+        config1.uiMode = UI_MODE_NIGHT_YES;
+
+        Configuration config2 = new Configuration(config1);
+        config2.uiMode = UI_MODE_NIGHT_NO;
+
+        Configuration config3 = new Configuration(config1);
+        config3.smallestScreenWidthDp = 500;
+
+        // Should be equal for non-controllable configuration changes.
+        assertTrue(WindowOrganizerController.configurationsAreEqualForOrganizer(config1, config2));
+
+        // Should be unequal for non-controllable configuration changes if the organizer is
+        // interested in that change.
+        assertFalse(WindowOrganizerController.configurationsAreEqualForOrganizer(
+                config1, config2, CONFIG_UI_MODE));
+
+        // Should be unequal for controllable configuration changes.
+        assertFalse(WindowOrganizerController.configurationsAreEqualForOrganizer(config1, config3));
+    }
+
     private void testSetAlwaysOnTop(WindowContainer wc) {
         final WindowContainerTransaction t = new WindowContainerTransaction();
         t.setAlwaysOnTop(wc.mRemoteToken.toWindowContainerToken(), true);
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java
index a718c06..59ee2f5 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java
@@ -1281,6 +1281,7 @@
 
         // Simulate app plays closing transition to app2.
         app.mActivityRecord.commitVisibility(false, false);
+        mDisplayContent.computeImeTarget(true /* updateImeTarget */);
         assertTrue(app.mActivityRecord.mLastImeShown);
 
         // Verify the IME insets is visible on app, but not for app2 during app task switching.
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 b16f528..7f9e591 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
@@ -961,6 +961,15 @@
         return testPlayer;
     }
 
+    void requestTransition(WindowContainer<?> wc, int transit) {
+        final TransitionController controller = mRootWindowContainer.mTransitionController;
+        if (controller.getTransitionPlayer() == null) {
+            registerTestTransitionPlayer();
+        }
+        controller.requestTransitionIfNeeded(transit, 0 /* flags */, null /* trigger */,
+                wc.mDisplayContent);
+    }
+
     /** Overrides the behavior of config_reverseDefaultRotation for the given display. */
     void setReverseDefaultRotation(DisplayContent dc, boolean reverse) {
         final DisplayRotation displayRotation = dc.getDisplayRotation();
@@ -1417,7 +1426,9 @@
             activity.setProcess(wpc);
 
             // Resume top activities to make sure all other signals in the system are connected.
-            mService.mRootWindowContainer.resumeFocusedTasksTopActivities();
+            if (mVisible) {
+                mService.mRootWindowContainer.resumeFocusedTasksTopActivities();
+            }
             return activity;
         }
     }
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTracingPerfettoTest.java b/services/tests/wmtests/src/com/android/server/wm/WindowTracingPerfettoTest.java
index 12b7445..9367941 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowTracingPerfettoTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowTracingPerfettoTest.java
@@ -18,12 +18,16 @@
 
 import static android.tools.traces.Utils.busyWaitForDataSourceRegistration;
 
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.times;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.verifyZeroInteractions;
 
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
 
@@ -34,11 +38,15 @@
 import android.tools.ScenarioBuilder;
 import android.tools.traces.io.ResultWriter;
 import android.tools.traces.monitors.PerfettoTraceMonitor;
+import android.util.Log;
 import android.view.Choreographer;
 
+import androidx.test.filters.FlakyTest;
 import androidx.test.filters.SmallTest;
+import androidx.test.uiautomator.UiDevice;
 
 import org.junit.After;
+import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -51,14 +59,15 @@
 /**
  * Test class for {@link WindowTracingPerfetto}.
  */
+@FlakyTest(bugId = 372558379)
 @SmallTest
 @Presubmit
 public class WindowTracingPerfettoTest {
     private static final String TEST_DATA_SOURCE_NAME = "android.windowmanager.test";
 
     private static WindowManagerService sWmMock;
-    private static Choreographer sChoreographer;
     private static WindowTracing sWindowTracing;
+    private static Boolean sIsDataSourceRegisteredSuccessfully;
 
     private PerfettoTraceMonitor mTraceMonitor;
 
@@ -66,19 +75,39 @@
     public static void setUpOnce() throws Exception {
         sWmMock = Mockito.mock(WindowManagerService.class);
         Mockito.doNothing().when(sWmMock).dumpDebugLocked(Mockito.any(), Mockito.anyInt());
-        sChoreographer = Mockito.mock(Choreographer.class);
-        sWindowTracing = new WindowTracingPerfetto(sWmMock, sChoreographer,
+        sWindowTracing = new WindowTracingPerfetto(sWmMock, Mockito.mock(Choreographer.class),
                 new WindowManagerGlobalLock(), TEST_DATA_SOURCE_NAME);
-        busyWaitForDataSourceRegistration(TEST_DATA_SOURCE_NAME);
+    }
+
+    @AfterClass
+    public static void tearDownOnce() {
+        sWmMock = null;
+        sWindowTracing = null;
     }
 
     @Before
     public void setUp() throws IOException {
-        Mockito.clearInvocations(sWmMock);
+        if (sIsDataSourceRegisteredSuccessfully != null) {
+            assumeTrue("Failed to register data source", sIsDataSourceRegisteredSuccessfully);
+            return;
+        }
+        try {
+            busyWaitForDataSourceRegistration(TEST_DATA_SOURCE_NAME);
+            sIsDataSourceRegisteredSuccessfully = true;
+        } catch (Exception e) {
+            sIsDataSourceRegisteredSuccessfully = false;
+            final String perfettoStatus = UiDevice.getInstance(getInstrumentation())
+                    .executeShellCommand("perfetto --query");
+            Log.e(WindowTracingPerfettoTest.class.getSimpleName(),
+                    "Failed to register data source: " + perfettoStatus);
+            // Only fail once. The rest tests will be skipped by assumeTrue.
+            fail("Failed to register data source");
+        }
     }
 
     @After
     public void tearDown() throws IOException {
+        Mockito.clearInvocations(sWmMock);
         stopTracing();
     }
 
diff --git a/services/usb/java/com/android/server/usb/UsbPortManager.java b/services/usb/java/com/android/server/usb/UsbPortManager.java
index 55a8923..86468b0 100644
--- a/services/usb/java/com/android/server/usb/UsbPortManager.java
+++ b/services/usb/java/com/android/server/usb/UsbPortManager.java
@@ -200,7 +200,11 @@
         mHandler.sendEmptyMessage(MSG_SYSTEM_READY);
     }
 
-    private void updateContaminantNotification() {
+    private void updateContaminantNotificationLocked() {
+        if (mNotificationManager == null) {
+            return;
+        }
+
         PortInfo currentPortInfo = null;
         Resources r = mContext.getResources();
         int contaminantStatus = UsbPortStatus.CONTAMINANT_DETECTION_NOT_DETECTED;
@@ -1171,7 +1175,7 @@
     private void handlePortLocked(PortInfo portInfo, IndentingPrintWriter pw) {
         sendPortChangedBroadcastLocked(portInfo);
         logToStatsd(portInfo, pw);
-        updateContaminantNotification();
+        updateContaminantNotificationLocked();
     }
 
     private void handlePortAddedLocked(PortInfo portInfo, IndentingPrintWriter pw) {
@@ -1433,6 +1437,9 @@
                 case MSG_SYSTEM_READY: {
                     mNotificationManager = (NotificationManager)
                             mContext.getSystemService(Context.NOTIFICATION_SERVICE);
+                    synchronized (mLock) {
+                        updateContaminantNotificationLocked();
+                    }
                     break;
                 }
             }
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index 0b3d720..1a932859 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -10207,6 +10207,17 @@
             "carrier_supported_satellite_notification_hysteresis_sec_int";
 
     /**
+     * Satellite notification display restriction reset time in seconds.
+     *
+     * The device shows a notification when it connects to a satellite.  If the user interacts
+     * with the notification, it won't be shown again immediately.  Instead, the notification
+     * will only reappear after below key mentioned amount of time has passed.
+     */
+    @FlaggedApi(Flags.FLAG_SATELLITE_25Q4_APIS)
+    public static final String KEY_SATELLITE_CONNECTED_NOTIFICATION_THROTTLE_MILLIS_INT =
+            "satellite_connected_notification_throttle_millis_int";
+
+    /**
      * An integer key holds the timeout duration in seconds used to determine whether to exit
      * carrier-roaming NB-IOT satellite mode.
      *
@@ -11428,6 +11439,10 @@
         sDefaults.putInt(KEY_CARRIER_ROAMING_NTN_EMERGENCY_CALL_TO_SATELLITE_HANDOVER_TYPE_INT,
                 SatelliteManager.EMERGENCY_CALL_TO_SATELLITE_HANDOVER_TYPE_T911);
         sDefaults.putInt(KEY_CARRIER_SUPPORTED_SATELLITE_NOTIFICATION_HYSTERESIS_SEC_INT, 180);
+        if (Flags.starlinkDataBugfix()) {
+            sDefaults.putLong(KEY_SATELLITE_CONNECTED_NOTIFICATION_THROTTLE_MILLIS_INT,
+                    TimeUnit.DAYS.toMillis(7));
+        }
         sDefaults.putInt(KEY_SATELLITE_ROAMING_SCREEN_OFF_INACTIVITY_TIMEOUT_SEC_INT, 30);
         sDefaults.putInt(KEY_SATELLITE_ROAMING_P2P_SMS_INACTIVITY_TIMEOUT_SEC_INT, 180);
         sDefaults.putInt(KEY_SATELLITE_ROAMING_ESOS_INACTIVITY_TIMEOUT_SEC_INT, 600);
diff --git a/tests/AttestationVerificationTest/AndroidManifest.xml b/tests/AttestationVerificationTest/AndroidManifest.xml
index 37321ad8..758852b 100644
--- a/tests/AttestationVerificationTest/AndroidManifest.xml
+++ b/tests/AttestationVerificationTest/AndroidManifest.xml
@@ -18,7 +18,7 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="android.security.attestationverification">
 
-    <uses-sdk android:minSdkVersion="30" android:targetSdkVersion="30" />
+    <uses-sdk android:minSdkVersion="30" android:targetSdkVersion="34" />
     <uses-permission android:name="android.permission.USE_ATTESTATION_VERIFICATION_SERVICE" />
 
     <application>
diff --git a/tests/AttestationVerificationTest/assets/test_revocation_list_no_test_certs.json b/tests/AttestationVerificationTest/assets/test_revocation_list_no_test_certs.json
new file mode 100644
index 0000000..2a3ba5e
--- /dev/null
+++ b/tests/AttestationVerificationTest/assets/test_revocation_list_no_test_certs.json
@@ -0,0 +1,12 @@
+{
+  "entries": {
+    "6681152659205225093" : {
+      "status": "REVOKED",
+      "reason": "KEY_COMPROMISE"
+    },
+    "8350192447815228107" : {
+      "status": "REVOKED",
+      "reason": "KEY_COMPROMISE"
+    }
+  }
+}
\ No newline at end of file
diff --git a/tests/AttestationVerificationTest/assets/test_revocation_list_with_test_certs.json b/tests/AttestationVerificationTest/assets/test_revocation_list_with_test_certs.json
new file mode 100644
index 0000000..e22a834
--- /dev/null
+++ b/tests/AttestationVerificationTest/assets/test_revocation_list_with_test_certs.json
@@ -0,0 +1,16 @@
+{
+  "entries": {
+    "6681152659205225093" : {
+      "status": "REVOKED",
+      "reason": "KEY_COMPROMISE"
+    },
+    "353017e73dc205a73a9c3de142230370" : {
+      "status": "REVOKED",
+      "reason": "KEY_COMPROMISE"
+    },
+    "8350192447815228107" : {
+      "status": "REVOKED",
+      "reason": "KEY_COMPROMISE"
+    }
+  }
+}
\ No newline at end of file
diff --git a/tests/AttestationVerificationTest/src/com/android/server/security/CertificateRevocationStatusManagerTest.java b/tests/AttestationVerificationTest/src/com/android/server/security/CertificateRevocationStatusManagerTest.java
new file mode 100644
index 0000000..586bb76
--- /dev/null
+++ b/tests/AttestationVerificationTest/src/com/android/server/security/CertificateRevocationStatusManagerTest.java
@@ -0,0 +1,369 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.security;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertThrows;
+
+import android.content.Context;
+import android.os.SystemClock;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import org.json.JSONObject;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.security.cert.CertPathValidatorException;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateFactory;
+import java.security.cert.X509Certificate;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RunWith(AndroidJUnit4.class)
+public class CertificateRevocationStatusManagerTest {
+
+    private static final String TEST_CERTIFICATE_FILE_1 = "test_attestation_with_root_certs.pem";
+    private static final String TEST_CERTIFICATE_FILE_2 = "test_attestation_wrong_root_certs.pem";
+    private static final String TEST_REVOCATION_LIST_FILE_NAME = "test_revocation_list.json";
+    private static final String REVOCATION_LIST_WITHOUT_CERTIFICATES_USED_IN_THIS_TEST =
+            "test_revocation_list_no_test_certs.json";
+    private static final String REVOCATION_LIST_WITH_CERTIFICATES_USED_IN_THIS_TEST =
+            "test_revocation_list_with_test_certs.json";
+    private static final String TEST_REVOCATION_STATUS_FILE_NAME = "test_revocation_status.txt";
+    private static final String FILE_URL_PREFIX = "file://";
+    private final Context mContext = InstrumentationRegistry.getInstrumentation().getContext();
+
+    private CertificateFactory mFactory;
+    private List<X509Certificate> mCertificates1;
+    private List<X509Certificate> mCertificates2;
+    private File mRevocationListFile;
+    private String mRevocationListUrl;
+    private String mNonExistentRevocationListUrl;
+    private File mRevocationStatusFile;
+    private CertificateRevocationStatusManager mCertificateRevocationStatusManager;
+
+    @Before
+    public void setUp() throws Exception {
+        mFactory = CertificateFactory.getInstance("X.509");
+        mCertificates1 = getCertificateChain(TEST_CERTIFICATE_FILE_1);
+        mCertificates2 = getCertificateChain(TEST_CERTIFICATE_FILE_2);
+        mRevocationListFile = new File(mContext.getFilesDir(), TEST_REVOCATION_LIST_FILE_NAME);
+        mRevocationListUrl = FILE_URL_PREFIX + mRevocationListFile.getAbsolutePath();
+        File noSuchFile = new File(mContext.getFilesDir(), "file_does_not_exist");
+        mNonExistentRevocationListUrl = FILE_URL_PREFIX + noSuchFile.getAbsolutePath();
+        mRevocationStatusFile = new File(mContext.getFilesDir(), TEST_REVOCATION_STATUS_FILE_NAME);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        mRevocationListFile.delete();
+        mRevocationStatusFile.delete();
+    }
+
+    @Test
+    public void checkRevocationStatus_doesNotExistOnRemoteRevocationList_noException()
+            throws Exception {
+        copyFromAssetToFile(
+                REVOCATION_LIST_WITHOUT_CERTIFICATES_USED_IN_THIS_TEST, mRevocationListFile);
+        mCertificateRevocationStatusManager =
+                new CertificateRevocationStatusManager(
+                        mContext, mRevocationListUrl, mRevocationStatusFile, false);
+
+        mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates1);
+    }
+
+    @Test
+    public void checkRevocationStatus_existsOnRemoteRevocationList_throwsException()
+            throws Exception {
+        copyFromAssetToFile(
+                REVOCATION_LIST_WITH_CERTIFICATES_USED_IN_THIS_TEST, mRevocationListFile);
+        mCertificateRevocationStatusManager =
+                new CertificateRevocationStatusManager(
+                        mContext, mRevocationListUrl, mRevocationStatusFile, false);
+
+        assertThrows(
+                CertPathValidatorException.class,
+                () -> mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates1));
+    }
+
+    @Test
+    public void
+            checkRevocationStatus_cannotReachRemoteRevocationList_noStoredStatus_throwsException()
+                    throws Exception {
+        mCertificateRevocationStatusManager =
+                new CertificateRevocationStatusManager(
+                        mContext, mNonExistentRevocationListUrl, mRevocationStatusFile, false);
+
+        assertThrows(
+                CertPathValidatorException.class,
+                () -> mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates1));
+    }
+
+    @Test
+    public void checkRevocationStatus_savesRevocationStatus() throws Exception {
+        copyFromAssetToFile(
+                REVOCATION_LIST_WITHOUT_CERTIFICATES_USED_IN_THIS_TEST, mRevocationListFile);
+        mCertificateRevocationStatusManager =
+                new CertificateRevocationStatusManager(
+                        mContext, mRevocationListUrl, mRevocationStatusFile, false);
+
+        mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates1);
+
+        assertThat(mRevocationStatusFile.length()).isGreaterThan(0);
+    }
+
+    @Test
+    public void checkRevocationStatus_cannotReachRemoteList_certsSaved_noException()
+            throws Exception {
+        // call checkRevocationStatus once to save the revocation status
+        copyFromAssetToFile(
+                REVOCATION_LIST_WITHOUT_CERTIFICATES_USED_IN_THIS_TEST, mRevocationListFile);
+        mCertificateRevocationStatusManager =
+                new CertificateRevocationStatusManager(
+                        mContext, mRevocationListUrl, mRevocationStatusFile, false);
+        mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates1);
+        // call checkRevocationStatus again with mNonExistentRevocationListUrl
+        mCertificateRevocationStatusManager =
+                new CertificateRevocationStatusManager(
+                        mContext, mNonExistentRevocationListUrl, mRevocationStatusFile, false);
+
+        mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates1);
+    }
+
+    @Test
+    public void checkRevocationStatus_cannotReachRemoteList_someCertsNotSaved_exception()
+            throws Exception {
+        // call checkRevocationStatus once to save the revocation status for mCertificates2
+        copyFromAssetToFile(
+                REVOCATION_LIST_WITHOUT_CERTIFICATES_USED_IN_THIS_TEST, mRevocationListFile);
+        mCertificateRevocationStatusManager =
+                new CertificateRevocationStatusManager(
+                        mContext, mRevocationListUrl, mRevocationStatusFile, false);
+        mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates2);
+        // call checkRevocationStatus again with mNonExistentRevocationListUrl, this time for
+        // mCertificates1
+        mCertificateRevocationStatusManager =
+                new CertificateRevocationStatusManager(
+                        mContext, mNonExistentRevocationListUrl, mRevocationStatusFile, false);
+
+        assertThrows(
+                CertPathValidatorException.class,
+                () -> mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates1));
+    }
+
+    @Test
+    public void checkRevocationStatus_cannotReachRemoteList_someCertsStatusTooOld_exception()
+            throws Exception {
+        mCertificateRevocationStatusManager =
+                new CertificateRevocationStatusManager(
+                        mContext, mNonExistentRevocationListUrl, mRevocationStatusFile, false);
+        LocalDateTime now = LocalDateTime.now();
+        LocalDateTime expiredStatusDate =
+                now.minusDays(CertificateRevocationStatusManager.MAX_DAYS_SINCE_LAST_CHECK + 1);
+        Map<String, LocalDateTime> lastRevocationCheckData = new HashMap<>();
+        lastRevocationCheckData.put(getSerialNumber(mCertificates1.get(0)), expiredStatusDate);
+        for (int i = 1; i < mCertificates1.size(); i++) {
+            lastRevocationCheckData.put(getSerialNumber(mCertificates1.get(i)), now);
+        }
+        mCertificateRevocationStatusManager.storeLastRevocationCheckData(lastRevocationCheckData);
+
+        assertThrows(
+                CertPathValidatorException.class,
+                () -> mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates1));
+    }
+
+    @Test
+    public void checkRevocationStatus_cannotReachRemoteList_allCertResultsFresh_noException()
+            throws Exception {
+        mCertificateRevocationStatusManager =
+                new CertificateRevocationStatusManager(
+                        mContext, mNonExistentRevocationListUrl, mRevocationStatusFile, false);
+        LocalDateTime bearlyNotExpiredStatusDate =
+                LocalDateTime.now()
+                        .minusDays(
+                                CertificateRevocationStatusManager.MAX_DAYS_SINCE_LAST_CHECK - 1);
+        Map<String, LocalDateTime> lastRevocationCheckData = new HashMap<>();
+        for (X509Certificate certificate : mCertificates1) {
+            lastRevocationCheckData.put(getSerialNumber(certificate), bearlyNotExpiredStatusDate);
+        }
+        mCertificateRevocationStatusManager.storeLastRevocationCheckData(lastRevocationCheckData);
+
+        mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates1);
+    }
+
+    @Test
+    public void updateLastRevocationCheckData_correctlySavesStatus() throws Exception {
+        mCertificateRevocationStatusManager =
+                new CertificateRevocationStatusManager(
+                        mContext, mNonExistentRevocationListUrl, mRevocationStatusFile, false);
+        Map<String, Boolean> areCertificatesRevoked = new HashMap<>();
+        for (X509Certificate certificate : mCertificates1) {
+            areCertificatesRevoked.put(getSerialNumber(certificate), false);
+        }
+
+        mCertificateRevocationStatusManager.updateLastRevocationCheckData(areCertificatesRevoked);
+
+        // no exception
+        mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates1);
+        // revoke one certificate and try again
+        areCertificatesRevoked.put(getSerialNumber(mCertificates1.getLast()), true);
+        mCertificateRevocationStatusManager.updateLastRevocationCheckData(areCertificatesRevoked);
+        assertThrows(
+                CertPathValidatorException.class,
+                () -> mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates1));
+    }
+
+    @Test
+    public void updateLastRevocationCheckDataForAllPreviouslySeenCertificates_updatesCorrectly()
+            throws Exception {
+        copyFromAssetToFile(
+                REVOCATION_LIST_WITHOUT_CERTIFICATES_USED_IN_THIS_TEST, mRevocationListFile);
+        mCertificateRevocationStatusManager =
+                new CertificateRevocationStatusManager(
+                        mContext, mRevocationListUrl, mRevocationStatusFile, false);
+        // populate the revocation status file
+        mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates1);
+        // Sleep for 2 second so that the current time changes
+        SystemClock.sleep(2000);
+        LocalDateTime timestampBeforeUpdate = LocalDateTime.now();
+        JSONObject revocationList = mCertificateRevocationStatusManager.fetchRemoteRevocationList();
+        List<String> otherCertificatesToCheck = new ArrayList<>();
+        String serialNumber1 = "1234567"; // not revoked
+        String serialNumber2 = "8350192447815228107"; // revoked
+        String serialNumber3 = "987654"; // not revoked
+        otherCertificatesToCheck.add(serialNumber1);
+        otherCertificatesToCheck.add(serialNumber2);
+        otherCertificatesToCheck.add(serialNumber3);
+
+        mCertificateRevocationStatusManager
+                .updateLastRevocationCheckDataForAllPreviouslySeenCertificates(
+                        revocationList, otherCertificatesToCheck);
+
+        Map<String, LocalDateTime> lastRevocationCheckData =
+                mCertificateRevocationStatusManager.getLastRevocationCheckData();
+        assertThat(lastRevocationCheckData.get(serialNumber1)).isAtLeast(timestampBeforeUpdate);
+        assertThat(lastRevocationCheckData).doesNotContainKey(serialNumber2); // revoked
+        assertThat(lastRevocationCheckData.get(serialNumber3)).isAtLeast(timestampBeforeUpdate);
+        // validate that the existing certificates on the file got updated too
+        for (X509Certificate certificate : mCertificates1) {
+            assertThat(lastRevocationCheckData.get(getSerialNumber(certificate)))
+                    .isAtLeast(timestampBeforeUpdate);
+        }
+    }
+
+    @Test
+    public void checkRevocationStatus_allCertificatesRecentlyChecked_doesNotFetchRemoteCrl()
+            throws Exception {
+        copyFromAssetToFile(
+                REVOCATION_LIST_WITHOUT_CERTIFICATES_USED_IN_THIS_TEST, mRevocationListFile);
+        mCertificateRevocationStatusManager =
+                new CertificateRevocationStatusManager(
+                        mContext, mRevocationListUrl, mRevocationStatusFile, false);
+        mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates1);
+        // indirectly verifies the remote list is not fetched by simulating a remote revocation
+        copyFromAssetToFile(
+                REVOCATION_LIST_WITH_CERTIFICATES_USED_IN_THIS_TEST, mRevocationListFile);
+
+        // no exception
+        mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates1);
+    }
+
+    @Test
+    public void checkRevocationStatus_allCertificatesBarelyRecentlyChecked_doesNotFetchRemoteCrl()
+            throws Exception {
+        copyFromAssetToFile(
+                REVOCATION_LIST_WITH_CERTIFICATES_USED_IN_THIS_TEST, mRevocationListFile);
+        mCertificateRevocationStatusManager =
+                new CertificateRevocationStatusManager(
+                        mContext, mRevocationListUrl, mRevocationStatusFile, false);
+        Map<String, LocalDateTime> lastCheckedDates = new HashMap<>();
+        LocalDateTime barelyRecently =
+                LocalDateTime.now()
+                        .minusHours(
+                                CertificateRevocationStatusManager.NUM_HOURS_BEFORE_NEXT_CHECK - 1);
+        for (X509Certificate certificate : mCertificates1) {
+            lastCheckedDates.put(getSerialNumber(certificate), barelyRecently);
+        }
+        mCertificateRevocationStatusManager.storeLastRevocationCheckData(lastCheckedDates);
+
+        // Indirectly verify the remote CRL is not checked by checking there is no exception despite
+        // a certificate being revoked. This test differs from the next only in the lastCheckedDate,
+        // one before the NUM_HOURS_BEFORE_NEXT_CHECK cutoff and one after
+        mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates1);
+    }
+
+    @Test
+    public void checkRevocationStatus_certificatesRevokedAfterCheck_throwsException()
+            throws Exception {
+        copyFromAssetToFile(
+                REVOCATION_LIST_WITH_CERTIFICATES_USED_IN_THIS_TEST, mRevocationListFile);
+        mCertificateRevocationStatusManager =
+                new CertificateRevocationStatusManager(
+                        mContext, mRevocationListUrl, mRevocationStatusFile, false);
+        Map<String, LocalDateTime> lastCheckedDates = new HashMap<>();
+        // To save network use, we do not check the remote CRL if all the certificates are recently
+        // checked, so we set the lastCheckDate to some time not recent.
+        LocalDateTime notRecently =
+                LocalDateTime.now()
+                        .minusHours(
+                                CertificateRevocationStatusManager.NUM_HOURS_BEFORE_NEXT_CHECK + 1);
+        for (X509Certificate certificate : mCertificates1) {
+            lastCheckedDates.put(getSerialNumber(certificate), notRecently);
+        }
+        mCertificateRevocationStatusManager.storeLastRevocationCheckData(lastCheckedDates);
+
+        assertThrows(
+                CertPathValidatorException.class,
+                () -> mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates1));
+    }
+
+    private List<X509Certificate> getCertificateChain(String fileName) throws Exception {
+        Collection<? extends Certificate> certificates =
+                mFactory.generateCertificates(mContext.getResources().getAssets().open(fileName));
+        ArrayList<X509Certificate> x509Certs = new ArrayList<>();
+        for (Certificate cert : certificates) {
+            x509Certs.add((X509Certificate) cert);
+        }
+        return x509Certs;
+    }
+
+    private void copyFromAssetToFile(String assetFileName, File targetFile) throws Exception {
+        byte[] data;
+        try (InputStream in = mContext.getResources().getAssets().open(assetFileName)) {
+            data = in.readAllBytes();
+        }
+        try (FileOutputStream fileOutputStream = new FileOutputStream(targetFile)) {
+            fileOutputStream.write(data);
+        }
+    }
+
+    private String getSerialNumber(X509Certificate certificate) {
+        return certificate.getSerialNumber().toString(16);
+    }
+}
diff --git a/tests/Input/src/android/hardware/input/KeyboardLayoutPreviewTests.kt b/tests/Input/src/android/hardware/input/KeyboardLayoutPreviewTests.kt
index ae32bda..bcff2fc 100644
--- a/tests/Input/src/android/hardware/input/KeyboardLayoutPreviewTests.kt
+++ b/tests/Input/src/android/hardware/input/KeyboardLayoutPreviewTests.kt
@@ -16,17 +16,11 @@
 
 package android.hardware.input
 
-import android.platform.test.annotations.DisableFlags
-import android.platform.test.annotations.EnableFlags
 import android.content.ContextWrapper
 import android.graphics.drawable.Drawable
 import android.platform.test.annotations.Presubmit
-import android.platform.test.flag.junit.SetFlagsRule
 import androidx.test.platform.app.InstrumentationRegistry
-import com.android.hardware.input.Flags
 import org.junit.Assert.assertEquals
-import org.junit.Assert.assertNull
-import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.junit.MockitoJUnitRunner
@@ -46,9 +40,6 @@
         const val HEIGHT = 100
     }
 
-    @get:Rule
-    val setFlagsRule = SetFlagsRule()
-
     private fun createDrawable(): Drawable? {
         val context = ContextWrapper(InstrumentationRegistry.getInstrumentation().getContext())
         val inputManager = context.getSystemService(InputManager::class.java)!!
@@ -56,16 +47,9 @@
     }
 
     @Test
-    @EnableFlags(Flags.FLAG_KEYBOARD_LAYOUT_PREVIEW_FLAG)
     fun testKeyboardLayoutDrawable_hasCorrectDimensions() {
         val drawable = createDrawable()!!
         assertEquals(WIDTH, drawable.intrinsicWidth)
         assertEquals(HEIGHT, drawable.intrinsicHeight)
     }
-
-    @Test
-    @DisableFlags(Flags.FLAG_KEYBOARD_LAYOUT_PREVIEW_FLAG)
-    fun testKeyboardLayoutDrawable_isNull_ifFlagOff() {
-        assertNull(createDrawable())
-    }
 }
\ No newline at end of file
diff --git a/tests/Input/src/android/hardware/input/StickyModifierStateListenerTest.kt b/tests/Input/src/android/hardware/input/StickyModifierStateListenerTest.kt
index c2f9adf..cc58bbc 100644
--- a/tests/Input/src/android/hardware/input/StickyModifierStateListenerTest.kt
+++ b/tests/Input/src/android/hardware/input/StickyModifierStateListenerTest.kt
@@ -21,9 +21,7 @@
 import android.os.Handler
 import android.os.HandlerExecutor
 import android.os.test.TestLooper
-import android.platform.test.annotations.EnableFlags
 import android.platform.test.annotations.Presubmit
-import android.platform.test.flag.junit.SetFlagsRule
 import android.view.KeyEvent
 import androidx.test.core.app.ApplicationProvider
 import com.android.server.testutils.any
@@ -50,12 +48,9 @@
  */
 @Presubmit
 @RunWith(MockitoJUnitRunner::class)
-@EnableFlags(com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_STICKY_KEYS_FLAG)
 class StickyModifierStateListenerTest {
 
     @get:Rule
-    val rule = SetFlagsRule()
-    @get:Rule
     val inputManagerRule = MockInputManagerRule()
 
     private val testLooper = TestLooper()
diff --git a/tests/Input/src/com/android/server/input/InputManagerServiceTests.kt b/tests/Input/src/com/android/server/input/InputManagerServiceTests.kt
index 5259455..a2f6f00 100644
--- a/tests/Input/src/com/android/server/input/InputManagerServiceTests.kt
+++ b/tests/Input/src/com/android/server/input/InputManagerServiceTests.kt
@@ -333,7 +333,7 @@
     fun testKeyActivenessNotifyEventsLifecycle() {
         service.systemRunning()
 
-        fakePermissionEnforcer.grant(android.Manifest.permission.LISTEN_FOR_KEY_ACTIVITY);
+        fakePermissionEnforcer.grant(android.Manifest.permission.LISTEN_FOR_KEY_ACTIVITY)
 
         val inputManager = context.getSystemService(InputManager::class.java)
 
@@ -358,6 +358,34 @@
         verifyNoMoreInteractions(listener)
     }
 
+    @Test
+    fun testKeyEventsForwardedToFocusedWindow_whenWmAllows() {
+        service.systemRunning()
+        overrideSendActionKeyEventsToFocusedWindow(
+            /* hasPermission = */false,
+            /* hasPrivateFlag = */false
+        )
+        whenever(wmCallbacks.interceptKeyBeforeDispatching(any(), any(), anyInt())).thenReturn(0)
+
+        val event = KeyEvent( /* downTime= */0, /* eventTime= */0, KeyEvent.ACTION_DOWN,
+            KeyEvent.KEYCODE_SPACE, /* repeat= */0, KeyEvent.META_CTRL_ON)
+        assertEquals(0, service.interceptKeyBeforeDispatching(null, event, 0))
+    }
+
+    @Test
+    fun testKeyEventsNotForwardedToFocusedWindow_whenWmConsumes() {
+        service.systemRunning()
+        overrideSendActionKeyEventsToFocusedWindow(
+            /* hasPermission = */false,
+            /* hasPrivateFlag = */false
+        )
+        whenever(wmCallbacks.interceptKeyBeforeDispatching(any(), any(), anyInt())).thenReturn(-1)
+
+        val event = KeyEvent( /* downTime= */0, /* eventTime= */0, KeyEvent.ACTION_DOWN,
+            KeyEvent.KEYCODE_SPACE, /* repeat= */0, KeyEvent.META_CTRL_ON)
+        assertEquals(-1, service.interceptKeyBeforeDispatching(null, event, 0))
+    }
+
     private class AutoClosingVirtualDisplays(val displays: List<VirtualDisplay>) : AutoCloseable {
         operator fun get(i: Int): VirtualDisplay = displays[i]
 
@@ -559,9 +587,6 @@
 
     @Test
     fun handleKeyGestures_a11yBounceKeysShortcut() {
-        ExtendedMockito.doReturn(true).`when` {
-            InputSettings.isAccessibilityBounceKeysFeatureEnabled()
-        }
         val toggleBounceKeysEvent =
             KeyGestureEvent.Builder()
                 .setKeyGestureType(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_BOUNCE_KEYS)
@@ -594,9 +619,6 @@
 
     @Test
     fun handleKeyGestures_a11yStickyKeysShortcut() {
-        ExtendedMockito.doReturn(true).`when` {
-            InputSettings.isAccessibilityStickyKeysFeatureEnabled()
-        }
         val toggleStickyKeysEvent =
             KeyGestureEvent.Builder()
                 .setKeyGestureType(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_STICKY_KEYS)
@@ -610,9 +632,6 @@
 
     @Test
     fun handleKeyGestures_a11ySlowKeysShortcut() {
-        ExtendedMockito.doReturn(true).`when` {
-            InputSettings.isAccessibilitySlowKeysFeatureFlagEnabled()
-        }
         val toggleSlowKeysEvent =
             KeyGestureEvent.Builder()
                 .setKeyGestureType(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_SLOW_KEYS)
diff --git a/tests/Input/src/com/android/server/input/KeyGestureControllerTests.kt b/tests/Input/src/com/android/server/input/KeyGestureControllerTests.kt
index de47f01..88e8496 100644
--- a/tests/Input/src/com/android/server/input/KeyGestureControllerTests.kt
+++ b/tests/Input/src/com/android/server/input/KeyGestureControllerTests.kt
@@ -754,9 +754,6 @@
     @EnableFlags(
         com.android.server.flags.Flags.FLAG_NEW_BUGREPORT_KEYBOARD_SHORTCUT,
         com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_SHORTCUT_CONTROL,
-        com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_BOUNCE_KEYS_FLAG,
-        com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_SLOW_KEYS_FLAG,
-        com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_STICKY_KEYS_FLAG,
         com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_MOUSE_KEYS,
         com.android.hardware.input.Flags.FLAG_ENABLE_TALKBACK_AND_MAGNIFIER_KEY_GESTURES,
         com.android.hardware.input.Flags.FLAG_ENABLE_VOICE_ACCESS_KEY_GESTURES,
@@ -773,9 +770,6 @@
     @EnableFlags(
         com.android.server.flags.Flags.FLAG_NEW_BUGREPORT_KEYBOARD_SHORTCUT,
         com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_SHORTCUT_CONTROL,
-        com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_BOUNCE_KEYS_FLAG,
-        com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_SLOW_KEYS_FLAG,
-        com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_STICKY_KEYS_FLAG,
         com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_MOUSE_KEYS,
         com.android.hardware.input.Flags.FLAG_ENABLE_TALKBACK_AND_MAGNIFIER_KEY_GESTURES,
         com.android.hardware.input.Flags.FLAG_ENABLE_VOICE_ACCESS_KEY_GESTURES,
diff --git a/tests/InputScreenshotTest/src/android/input/screenshot/KeyboardLayoutPreviewAnsiScreenshotTest.kt b/tests/InputScreenshotTest/src/android/input/screenshot/KeyboardLayoutPreviewAnsiScreenshotTest.kt
index e855786..e1294b1 100644
--- a/tests/InputScreenshotTest/src/android/input/screenshot/KeyboardLayoutPreviewAnsiScreenshotTest.kt
+++ b/tests/InputScreenshotTest/src/android/input/screenshot/KeyboardLayoutPreviewAnsiScreenshotTest.kt
@@ -19,12 +19,9 @@
 import android.content.Context
 import android.hardware.input.KeyboardLayout
 import android.os.LocaleList
-import android.platform.test.flag.junit.SetFlagsRule
-import com.android.hardware.input.Flags
 import java.util.Locale
 import org.junit.Rule
 import org.junit.Test
-import org.junit.rules.RuleChain
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 import platform.test.screenshot.DeviceEmulationSpec
@@ -38,18 +35,14 @@
         fun getTestSpecs() = DeviceEmulationSpec.PhoneMinimal
     }
 
-    val setFlagsRule = SetFlagsRule()
+    @get:Rule
     val screenshotRule = InputScreenshotTestRule(
             emulationSpec,
             "frameworks/base/tests/InputScreenshotTest/assets"
     )
 
-    @get:Rule
-    val ruleChain = RuleChain.outerRule(screenshotRule).around(setFlagsRule)
-
     @Test
     fun test() {
-        setFlagsRule.enableFlags(Flags.FLAG_KEYBOARD_LAYOUT_PREVIEW_FLAG)
         screenshotRule.screenshotTest("layout-preview-ansi") {
             context: Context -> LayoutPreview.createLayoutPreview(
                 context,
@@ -66,5 +59,4 @@
             )
         }
     }
-
 }
\ No newline at end of file
diff --git a/tests/InputScreenshotTest/src/android/input/screenshot/KeyboardLayoutPreviewIsoScreenshotTest.kt b/tests/InputScreenshotTest/src/android/input/screenshot/KeyboardLayoutPreviewIsoScreenshotTest.kt
index ab7bb4e..ddad6de 100644
--- a/tests/InputScreenshotTest/src/android/input/screenshot/KeyboardLayoutPreviewIsoScreenshotTest.kt
+++ b/tests/InputScreenshotTest/src/android/input/screenshot/KeyboardLayoutPreviewIsoScreenshotTest.kt
@@ -17,14 +17,8 @@
 package com.android.input.screenshot
 
 import android.content.Context
-import android.hardware.input.KeyboardLayout
-import android.os.LocaleList
-import android.platform.test.flag.junit.SetFlagsRule
-import com.android.hardware.input.Flags
-import java.util.Locale
 import org.junit.Rule
 import org.junit.Test
-import org.junit.rules.RuleChain
 import org.junit.runner.RunWith
 import platform.test.runner.parameterized.ParameterizedAndroidJunit4
 import platform.test.runner.parameterized.Parameters
@@ -39,21 +33,16 @@
         fun getTestSpecs() = DeviceEmulationSpec.PhoneAndTabletMinimal
     }
 
-    val setFlagsRule = SetFlagsRule()
+    @get:Rule
     val screenshotRule = InputScreenshotTestRule(
             emulationSpec,
             "frameworks/base/tests/InputScreenshotTest/assets"
     )
 
-    @get:Rule
-    val ruleChain = RuleChain.outerRule(screenshotRule).around(setFlagsRule)
-
     @Test
     fun test() {
-        setFlagsRule.enableFlags(Flags.FLAG_KEYBOARD_LAYOUT_PREVIEW_FLAG)
         screenshotRule.screenshotTest("layout-preview") {
             context: Context -> LayoutPreview.createLayoutPreview(context, null)
         }
     }
-
 }
diff --git a/tests/InputScreenshotTest/src/android/input/screenshot/KeyboardLayoutPreviewJisScreenshotTest.kt b/tests/InputScreenshotTest/src/android/input/screenshot/KeyboardLayoutPreviewJisScreenshotTest.kt
index 5231c14..8a8e4f0 100644
--- a/tests/InputScreenshotTest/src/android/input/screenshot/KeyboardLayoutPreviewJisScreenshotTest.kt
+++ b/tests/InputScreenshotTest/src/android/input/screenshot/KeyboardLayoutPreviewJisScreenshotTest.kt
@@ -19,12 +19,9 @@
 import android.content.Context
 import android.hardware.input.KeyboardLayout
 import android.os.LocaleList
-import android.platform.test.flag.junit.SetFlagsRule
-import com.android.hardware.input.Flags
 import java.util.Locale
 import org.junit.Rule
 import org.junit.Test
-import org.junit.rules.RuleChain
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 import platform.test.screenshot.DeviceEmulationSpec
@@ -38,18 +35,14 @@
         fun getTestSpecs() = DeviceEmulationSpec.PhoneMinimal
     }
 
-    val setFlagsRule = SetFlagsRule()
+    @get:Rule
     val screenshotRule = InputScreenshotTestRule(
             emulationSpec,
             "frameworks/base/tests/InputScreenshotTest/assets"
     )
 
-    @get:Rule
-    val ruleChain = RuleChain.outerRule(screenshotRule).around(setFlagsRule)
-
     @Test
     fun test() {
-        setFlagsRule.enableFlags(Flags.FLAG_KEYBOARD_LAYOUT_PREVIEW_FLAG)
         screenshotRule.screenshotTest("layout-preview-jis") {
             context: Context -> LayoutPreview.createLayoutPreview(
                 context,
@@ -66,5 +59,4 @@
             )
         }
     }
-
 }
\ No newline at end of file
diff --git a/tests/Tracing/src/com/android/internal/protolog/ProtoLogConfigurationServiceTest.java b/tests/Tracing/src/com/android/internal/protolog/ProtoLogConfigurationServiceTest.java
index a3d03a8..3be7251 100644
--- a/tests/Tracing/src/com/android/internal/protolog/ProtoLogConfigurationServiceTest.java
+++ b/tests/Tracing/src/com/android/internal/protolog/ProtoLogConfigurationServiceTest.java
@@ -38,6 +38,8 @@
 import android.tools.traces.io.ResultWriter;
 import android.tools.traces.monitors.PerfettoTraceMonitor;
 
+import com.android.internal.protolog.IProtoLogConfigurationService.RegisterClientArgs;
+
 import com.google.common.truth.Truth;
 import com.google.protobuf.InvalidProtocolBufferException;
 
@@ -152,10 +154,9 @@
     public void canRegisterClientWithGroupsOnly() throws RemoteException {
         final ProtoLogConfigurationService service = new ProtoLogConfigurationServiceImpl();
 
-        final ProtoLogConfigurationServiceImpl.RegisterClientArgs args =
-                new ProtoLogConfigurationServiceImpl.RegisterClientArgs()
-                        .setGroups(new ProtoLogConfigurationServiceImpl.RegisterClientArgs
-                                .GroupConfig(TEST_GROUP, true));
+        final RegisterClientArgs args = new RegisterClientArgs();
+        args.groups = new String[] { TEST_GROUP };
+        args.groupsDefaultLogcatStatus = new boolean[] { true };
         service.registerClient(mMockClient, args);
 
         Truth.assertThat(service.isLoggingToLogcat(TEST_GROUP)).isTrue();
@@ -167,11 +168,11 @@
             throws RemoteException, InvalidProtocolBufferException {
         final ProtoLogConfigurationService service = new ProtoLogConfigurationServiceImpl();
 
-        final ProtoLogConfigurationServiceImpl.RegisterClientArgs args =
-                new ProtoLogConfigurationServiceImpl.RegisterClientArgs()
-                        .setGroups(new ProtoLogConfigurationServiceImpl.RegisterClientArgs
-                                .GroupConfig(TEST_GROUP, true))
-                        .setViewerConfigFile(mViewerConfigFile.getAbsolutePath());
+        final RegisterClientArgs args = new RegisterClientArgs();
+        args.groups = new String[] { TEST_GROUP };
+        args.groupsDefaultLogcatStatus = new boolean[] { true };
+        args.viewerConfigFile = mViewerConfigFile.getAbsolutePath();
+
         service.registerClient(mMockClient, args);
         service.registerClient(mSecondMockClient, args);
 
@@ -204,11 +205,11 @@
                 Mockito.mock(ProtoLogConfigurationServiceImpl.ViewerConfigFileTracer.class);
         final ProtoLogConfigurationService service = new ProtoLogConfigurationServiceImpl(tracer);
 
-        final ProtoLogConfigurationServiceImpl.RegisterClientArgs args =
-                new ProtoLogConfigurationServiceImpl.RegisterClientArgs()
-                        .setGroups(new ProtoLogConfigurationServiceImpl.RegisterClientArgs
-                                .GroupConfig(TEST_GROUP, true))
-                        .setViewerConfigFile(mViewerConfigFile.getAbsolutePath());
+        final RegisterClientArgs args = new RegisterClientArgs();
+        args.groups = new String[] { TEST_GROUP };
+        args.groupsDefaultLogcatStatus = new boolean[] { true };
+        args.viewerConfigFile = mViewerConfigFile.getAbsolutePath();
+
         service.registerClient(mMockClient, args);
         service.registerClient(mSecondMockClient, args);
 
@@ -227,9 +228,9 @@
     public void sendEnableLoggingToLogcatToClient() throws RemoteException {
         final var service = new ProtoLogConfigurationServiceImpl();
 
-        final var args = new ProtoLogConfigurationServiceImpl.RegisterClientArgs()
-                .setGroups(new ProtoLogConfigurationServiceImpl.RegisterClientArgs
-                        .GroupConfig(TEST_GROUP, false));
+        final RegisterClientArgs args = new RegisterClientArgs();
+        args.groups = new String[] { TEST_GROUP };
+        args.groupsDefaultLogcatStatus = new boolean[] { false };
         service.registerClient(mMockClient, args);
 
         Truth.assertThat(service.isLoggingToLogcat(TEST_GROUP)).isFalse();
@@ -244,10 +245,9 @@
     public void sendDisableLoggingToLogcatToClient() throws RemoteException {
         final ProtoLogConfigurationService service = new ProtoLogConfigurationServiceImpl();
 
-        final ProtoLogConfigurationServiceImpl.RegisterClientArgs args =
-                new ProtoLogConfigurationServiceImpl.RegisterClientArgs()
-                        .setGroups(new ProtoLogConfigurationServiceImpl.RegisterClientArgs
-                                .GroupConfig(TEST_GROUP, true));
+        final RegisterClientArgs args = new RegisterClientArgs();
+        args.groups = new String[] { TEST_GROUP };
+        args.groupsDefaultLogcatStatus = new boolean[] { true };
         service.registerClient(mMockClient, args);
 
         Truth.assertThat(service.isLoggingToLogcat(TEST_GROUP)).isTrue();
@@ -262,10 +262,10 @@
     public void doNotSendLoggingToLogcatToClientWithoutRegisteredGroup() throws RemoteException {
         final ProtoLogConfigurationService service = new ProtoLogConfigurationServiceImpl();
 
-        final ProtoLogConfigurationServiceImpl.RegisterClientArgs args =
-                new ProtoLogConfigurationServiceImpl.RegisterClientArgs()
-                        .setGroups(new ProtoLogConfigurationServiceImpl.RegisterClientArgs
-                                .GroupConfig(TEST_GROUP, false));
+        final RegisterClientArgs args = new RegisterClientArgs();
+        args.groups = new String[] { TEST_GROUP };
+        args.groupsDefaultLogcatStatus = new boolean[] { false };
+
         service.registerClient(mMockClient, args);
 
         Truth.assertThat(service.isLoggingToLogcat(TEST_GROUP)).isFalse();
@@ -283,10 +283,10 @@
         service.enableProtoLogToLogcat(TEST_GROUP);
         Truth.assertThat(service.isLoggingToLogcat(TEST_GROUP)).isTrue();
 
-        final ProtoLogConfigurationServiceImpl.RegisterClientArgs args =
-                new ProtoLogConfigurationServiceImpl.RegisterClientArgs()
-                        .setGroups(new ProtoLogConfigurationServiceImpl.RegisterClientArgs
-                                .GroupConfig(TEST_GROUP, false));
+        final RegisterClientArgs args = new RegisterClientArgs();
+        args.groups = new String[] { TEST_GROUP };
+        args.groupsDefaultLogcatStatus = new boolean[] { false };
+
         service.registerClient(mMockClient, args);
 
         Mockito.verify(mMockClient).toggleLogcat(eq(true),
diff --git a/tests/testables/src/android/testing/TestableLooper.java b/tests/testables/src/android/testing/TestableLooper.java
index 3ee6dc4..1273826 100644
--- a/tests/testables/src/android/testing/TestableLooper.java
+++ b/tests/testables/src/android/testing/TestableLooper.java
@@ -16,6 +16,7 @@
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.os.Build;
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.Looper;
@@ -24,7 +25,7 @@
 import android.os.TestLooperManager;
 import android.util.ArrayMap;
 
-import androidx.test.InstrumentationRegistry;
+import androidx.test.platform.app.InstrumentationRegistry;
 
 import org.junit.runners.model.FrameworkMethod;
 
@@ -33,8 +34,11 @@
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayDeque;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Queue;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
@@ -67,16 +71,38 @@
     private Handler mHandler;
     private TestLooperManager mQueueWrapper;
 
+    /**
+     * Baklava introduces new {@link TestLooperManager} APIs that we can use instead of reflection.
+     */
+    private static boolean isAtLeastBaklava() {
+        Method[] methods = TestLooperManager.class.getMethods();
+        for (Method method : methods) {
+            if (method.getName().equals("peekWhen")) {
+                return true;
+            }
+        }
+        return false;
+        // TODO(shayba): delete the above, uncomment the below.
+        // SDK_INT has not yet ramped to Baklava in all 25Q2 builds.
+        // return Build.VERSION.SDK_INT >= Build.VERSION_CODES.BAKLAVA;
+    }
+
     static {
-        try {
-            MESSAGE_QUEUE_MESSAGES_FIELD = MessageQueue.class.getDeclaredField("mMessages");
-            MESSAGE_QUEUE_MESSAGES_FIELD.setAccessible(true);
-            MESSAGE_NEXT_FIELD = Message.class.getDeclaredField("next");
-            MESSAGE_NEXT_FIELD.setAccessible(true);
-            MESSAGE_WHEN_FIELD = Message.class.getDeclaredField("when");
-            MESSAGE_WHEN_FIELD.setAccessible(true);
-        } catch (NoSuchFieldException e) {
-            throw new RuntimeException("Failed to initialize TestableLooper", e);
+        if (isAtLeastBaklava()) {
+            MESSAGE_QUEUE_MESSAGES_FIELD = null;
+            MESSAGE_NEXT_FIELD = null;
+            MESSAGE_WHEN_FIELD = null;
+        } else {
+            try {
+                MESSAGE_QUEUE_MESSAGES_FIELD = MessageQueue.class.getDeclaredField("mMessages");
+                MESSAGE_QUEUE_MESSAGES_FIELD.setAccessible(true);
+                MESSAGE_NEXT_FIELD = Message.class.getDeclaredField("next");
+                MESSAGE_NEXT_FIELD.setAccessible(true);
+                MESSAGE_WHEN_FIELD = Message.class.getDeclaredField("when");
+                MESSAGE_WHEN_FIELD.setAccessible(true);
+            } catch (NoSuchFieldException e) {
+                throw new RuntimeException("Failed to initialize TestableLooper", e);
+            }
         }
     }
 
@@ -222,8 +248,61 @@
     }
 
     public void moveTimeForward(long milliSeconds) {
+        if (isAtLeastBaklava()) {
+            moveTimeForwardBaklava(milliSeconds);
+        } else {
+            moveTimeForwardLegacy(milliSeconds);
+        }
+    }
+
+    private void moveTimeForwardBaklava(long milliSeconds) {
+        // Drain all Messages from the queue.
+        Queue<Message> messages = new ArrayDeque<>();
+        while (true) {
+            Message message = mQueueWrapper.poll();
+            if (message == null) {
+                break;
+            }
+
+            // Adjust the Message's delivery time.
+            long newWhen = message.when - milliSeconds;
+            if (newWhen < 0) {
+                newWhen = 0;
+            }
+            message.when = newWhen;
+            messages.add(message);
+        }
+
+        // Repost all Messages back to the queuewith a new time.
+        while (true) {
+            Message message = messages.poll();
+            if (message == null) {
+                break;
+            }
+
+            Runnable callback = message.getCallback();
+            Handler handler = message.getTarget();
+            long when = message.getWhen();
+
+            // The Message cannot be re-enqueued because it is marked in use.
+            // Make a copy of the Message and recycle the original.
+            // This resets {@link Message#isInUse()} but retains all other content.
+            {
+                Message newMessage = Message.obtain();
+                newMessage.copyFrom(message);
+                newMessage.setCallback(callback);
+                mQueueWrapper.recycle(message);
+                message = newMessage;
+            }
+
+            // Send the Message back to its Handler to be re-enqueued.
+            handler.sendMessageAtTime(message, when);
+        }
+    }
+
+    private void moveTimeForwardLegacy(long milliSeconds) {
         try {
-            Message msg = getMessageLinkedList();
+            Message msg = (Message) MESSAGE_QUEUE_MESSAGES_FIELD.get(mLooper.getQueue());
             while (msg != null) {
                 long updatedWhen = msg.getWhen() - milliSeconds;
                 if (updatedWhen < 0) {
@@ -237,17 +316,6 @@
         }
     }
 
-    private Message getMessageLinkedList() {
-        try {
-            MessageQueue queue = mLooper.getQueue();
-            return (Message) MESSAGE_QUEUE_MESSAGES_FIELD.get(queue);
-        } catch (IllegalAccessException e) {
-            throw new RuntimeException(
-                    "Access failed in TestableLooper: get - MessageQueue.mMessages",
-                    e);
-        }
-    }
-
     private int processQueuedMessages() {
         int count = 0;
         Runnable barrierRunnable = () -> { };
diff --git a/tests/testables/tests/src/android/animation/AnimatorTestRuleToolkitTest.kt b/tests/testables/tests/src/android/animation/AnimatorTestRuleToolkitTest.kt
index 993c3fe..2eb8ba1 100644
--- a/tests/testables/tests/src/android/animation/AnimatorTestRuleToolkitTest.kt
+++ b/tests/testables/tests/src/android/animation/AnimatorTestRuleToolkitTest.kt
@@ -16,6 +16,7 @@
 
 package android.animation
 
+import android.content.pm.PackageManager
 import android.graphics.Color
 import android.platform.test.annotations.MotionTest
 import android.view.ViewGroup
@@ -23,11 +24,14 @@
 import androidx.test.ext.junit.rules.ActivityScenarioRule
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
+import androidx.test.platform.app.InstrumentationRegistry
 import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
 import com.android.internal.dynamicanimation.animation.DynamicAnimation
 import com.android.internal.dynamicanimation.animation.SpringAnimation
 import com.android.internal.dynamicanimation.animation.SpringForce
 import kotlinx.coroutines.test.TestScope
+import org.junit.Assume.assumeFalse
+import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -65,6 +69,16 @@
             bitmapDiffer = screenshotRule,
         )
 
+    @Before
+    fun setUp() {
+        // Do not run on Automotive.
+        assumeFalse(
+            InstrumentationRegistry.getInstrumentation().context.packageManager.hasSystemFeature(
+                PackageManager.FEATURE_AUTOMOTIVE
+            )
+        )
+    }
+
     @Test
     fun recordFilmstrip_withAnimator() {
         val animatedBox = createScene()
@@ -188,12 +202,7 @@
                 null
             }
         return motionRule.recordMotion(
-            AnimatorRuleRecordingSpec(
-                container,
-                motionControl,
-                sampleIntervalMs,
-                visualCapture,
-            ) {
+            AnimatorRuleRecordingSpec(container, motionControl, sampleIntervalMs, visualCapture) {
                 feature(ViewFeatureCaptures.alpha, "alpha")
             }
         )
diff --git a/tools/aapt2/cmd/Diff.cpp b/tools/aapt2/cmd/Diff.cpp
index d3750a6..b2b9179 100644
--- a/tools/aapt2/cmd/Diff.cpp
+++ b/tools/aapt2/cmd/Diff.cpp
@@ -29,7 +29,8 @@
 
 class DiffContext : public IAaptContext {
  public:
-  DiffContext() : name_mangler_({}), symbol_table_(&name_mangler_) {
+  explicit DiffContext(bool ignore_id_shift)
+      : ignore_id_shift(ignore_id_shift), name_mangler_({}), symbol_table_(&name_mangler_) {
   }
 
   PackageType GetPackageType() override {
@@ -71,6 +72,8 @@
     return empty;
   }
 
+  const bool ignore_id_shift;
+
  private:
   std::string empty_;
   StdErrDiagnostics diagnostics_;
@@ -79,7 +82,7 @@
 };
 
 static void EmitDiffLine(const android::Source& source, StringPiece message) {
-  std::cerr << source << ": " << message << "\n";
+  std::cout << source << ": " << message << "\n";
 }
 
 static bool IsSymbolVisibilityDifferent(const Visibility& vis_a, const Visibility& vis_b) {
@@ -95,8 +98,27 @@
   return false;
 }
 
+class ZeroingIdVisitor : public DescendingValueVisitor {
+ public:
+  using DescendingValueVisitor::Visit;
+
+  void Visit(Reference* ref) override {
+    if (ref->name) {
+      ref->id.reset();
+    }
+  }
+};
+
+static std::unique_ptr<Value> CloneAndClearIds(const Value* value, LoadedApk* apk) {
+  CloningValueTransformer cloner(&apk->GetResourceTable()->string_pool);
+  auto res = value->Transform(cloner);
+  ZeroingIdVisitor visitor;
+  res->Accept(&visitor);
+  return res;
+}
+
 static bool EmitResourceConfigValueDiff(
-    IAaptContext* context, LoadedApk* apk_a, const ResourceTablePackageView& pkg_a,
+    DiffContext* context, LoadedApk* apk_a, const ResourceTablePackageView& pkg_a,
     const ResourceTableTypeView& type_a, const ResourceTableEntryView& entry_a,
     const ResourceConfigValue* config_value_a, LoadedApk* apk_b,
     const ResourceTablePackageView& pkg_b, const ResourceTableTypeView& type_b,
@@ -104,6 +126,14 @@
   Value* value_a = config_value_a->value.get();
   Value* value_b = config_value_b->value.get();
   if (!value_a->Equals(value_b)) {
+    if (context->ignore_id_shift) {
+      // Check if the values are only different because of their IDs
+      auto cleared_a = CloneAndClearIds(value_a, apk_a);
+      auto cleared_b = CloneAndClearIds(value_b, apk_b);
+      if (cleared_a->Equals(cleared_b.get())) {
+        return false;
+      }
+    }
     std::stringstream str_stream;
     str_stream << "value " << pkg_a.name << ":" << type_a.named_type << "/" << entry_a.name
                << " config='" << config_value_a->config << "' does not match:\n";
@@ -116,7 +146,7 @@
   return false;
 }
 
-static bool EmitResourceEntryDiff(IAaptContext* context, LoadedApk* apk_a,
+static bool EmitResourceEntryDiff(DiffContext* context, LoadedApk* apk_a,
                                   const ResourceTablePackageView& pkg_a,
                                   const ResourceTableTypeView& type_a,
                                   const ResourceTableEntryView& entry_a, LoadedApk* apk_b,
@@ -180,90 +210,96 @@
   return diff;
 }
 
-static bool EmitResourceTypeDiff(IAaptContext* context, LoadedApk* apk_a,
+static const ResourceTableEntryView* findEntry(const ResourceTableTypeView& type,
+                                               const ResourceTableEntryView& entry) {
+  auto it = std::ranges::find_if(type.entries, [&](const ResourceTableEntryView& other_entry) {
+    return other_entry.name == entry.name;
+  });
+  return it != std::end(type.entries) ? &*it : nullptr;
+}
+
+static bool EmitResourceTypeDiff(DiffContext* context, LoadedApk* apk_a,
                                  const ResourceTablePackageView& pkg_a,
                                  const ResourceTableTypeView& type_a, LoadedApk* apk_b,
                                  const ResourceTablePackageView& pkg_b,
                                  const ResourceTableTypeView& type_b) {
   bool diff = false;
-  auto entry_a_iter = type_a.entries.begin();
-  auto entry_b_iter = type_b.entries.begin();
-  while (entry_a_iter != type_a.entries.end() || entry_b_iter != type_b.entries.end()) {
-    if (entry_b_iter == type_b.entries.end()) {
+  std::unordered_set<const ResourceTableEntryView*> found_b_entries;
+  for (auto&& entry_a : type_a.entries) {
+    auto entry_b_iter = findEntry(type_b, entry_a);
+    if (!entry_b_iter) {
       // Type A contains a type that type B does not have.
       std::stringstream str_stream;
-      str_stream << "missing " << pkg_a.name << ":" << type_a.named_type << "/"
-                 << entry_a_iter->name;
+      str_stream << "missing " << pkg_a.name << ":" << type_a.named_type << "/" << entry_a.name;
       EmitDiffLine(apk_a->GetSource(), str_stream.str());
       diff = true;
-    } else if (entry_a_iter == type_a.entries.end()) {
-      // Type B contains a type that type A does not have.
+      continue;
+    }
+    const auto& entry_b = *entry_b_iter;
+    found_b_entries.insert(&entry_b);
+    if (IsSymbolVisibilityDifferent(entry_a.visibility, entry_b.visibility)) {
       std::stringstream str_stream;
-      str_stream << "new entry " << pkg_b.name << ":" << type_b.named_type << "/"
-                 << entry_b_iter->name;
+      str_stream << pkg_a.name << ":" << type_a.named_type << "/" << entry_a.name
+                 << " has different visibility (";
+      if (entry_b.visibility.staged_api) {
+        str_stream << "STAGED ";
+      }
+      if (entry_b.visibility.level == Visibility::Level::kPublic) {
+        str_stream << "PUBLIC";
+      } else {
+        str_stream << "PRIVATE";
+      }
+      str_stream << " vs ";
+      if (entry_a.visibility.staged_api) {
+        str_stream << "STAGED ";
+      }
+      if (entry_a.visibility.level == Visibility::Level::kPublic) {
+        str_stream << "PUBLIC";
+      } else {
+        str_stream << "PRIVATE";
+      }
+      str_stream << ")";
       EmitDiffLine(apk_b->GetSource(), str_stream.str());
       diff = true;
-    } else {
-      const auto& entry_a = *entry_a_iter;
-      const auto& entry_b = *entry_b_iter;
-      if (IsSymbolVisibilityDifferent(entry_a.visibility, entry_b.visibility)) {
-        std::stringstream str_stream;
-        str_stream << pkg_a.name << ":" << type_a.named_type << "/" << entry_a.name
-                   << " has different visibility (";
-        if (entry_b.visibility.staged_api) {
-          str_stream << "STAGED ";
-        }
-        if (entry_b.visibility.level == Visibility::Level::kPublic) {
-          str_stream << "PUBLIC";
-        } else {
-          str_stream << "PRIVATE";
-        }
-        str_stream << " vs ";
-        if (entry_a.visibility.staged_api) {
-          str_stream << "STAGED ";
-        }
-        if (entry_a.visibility.level == Visibility::Level::kPublic) {
-          str_stream << "PUBLIC";
-        } else {
-          str_stream << "PRIVATE";
-        }
-        str_stream << ")";
-        EmitDiffLine(apk_b->GetSource(), str_stream.str());
-        diff = true;
-      } else if (IsIdDiff(entry_a.visibility.level, entry_a.id, entry_b.visibility.level,
-                          entry_b.id)) {
-        std::stringstream str_stream;
-        str_stream << pkg_a.name << ":" << type_a.named_type << "/" << entry_a.name
-                   << " has different public ID (";
-        if (entry_b.id) {
-          str_stream << "0x" << std::hex << entry_b.id.value();
-        } else {
-          str_stream << "none";
-        }
-        str_stream << " vs ";
-        if (entry_a.id) {
-          str_stream << "0x " << std::hex << entry_a.id.value();
-        } else {
-          str_stream << "none";
-        }
-        str_stream << ")";
-        EmitDiffLine(apk_b->GetSource(), str_stream.str());
-        diff = true;
+    } else if (!context->ignore_id_shift && IsIdDiff(entry_a.visibility.level, entry_a.id,
+                                                     entry_b.visibility.level, entry_b.id)) {
+      std::stringstream str_stream;
+      str_stream << pkg_a.name << ":" << type_a.named_type << "/" << entry_a.name
+                 << " has different public ID (";
+      if (entry_b.id) {
+        str_stream << "0x" << std::hex << entry_b.id.value();
+      } else {
+        str_stream << "none";
       }
-      diff |= EmitResourceEntryDiff(context, apk_a, pkg_a, type_a, entry_a, apk_b, pkg_b, type_b,
-                                    entry_b);
+      str_stream << " vs ";
+      if (entry_a.id) {
+        str_stream << "0x " << std::hex << entry_a.id.value();
+      } else {
+        str_stream << "none";
+      }
+      str_stream << ")";
+      EmitDiffLine(apk_b->GetSource(), str_stream.str());
+      diff = true;
     }
-    if (entry_a_iter != type_a.entries.end()) {
-      ++entry_a_iter;
-    }
-    if (entry_b_iter != type_b.entries.end()) {
-      ++entry_b_iter;
+    diff |= EmitResourceEntryDiff(context, apk_a, pkg_a, type_a, entry_a, apk_b, pkg_b, type_b,
+                                  entry_b);
+  }
+  if (found_b_entries.size() < type_b.entries.size()) {
+    diff = true;
+    for (auto&& entry_b : type_b.entries) {
+      if (found_b_entries.contains(&entry_b)) {
+        continue;
+      }
+      // Type B contains a type that type A does not have.
+      std::stringstream str_stream;
+      str_stream << "new entry " << pkg_b.name << ":" << type_b.named_type << "/" << entry_b.name;
+      EmitDiffLine(apk_b->GetSource(), str_stream.str());
     }
   }
   return diff;
 }
 
-static bool EmitResourcePackageDiff(IAaptContext* context, LoadedApk* apk_a,
+static bool EmitResourcePackageDiff(DiffContext* context, LoadedApk* apk_a,
                                     const ResourceTablePackageView& pkg_a, LoadedApk* apk_b,
                                     const ResourceTablePackageView& pkg_b) {
   bool diff = false;
@@ -302,7 +338,8 @@
         str_stream << ")";
         EmitDiffLine(apk_b->GetSource(), str_stream.str());
         diff = true;
-      } else if (IsIdDiff(type_a.visibility_level, type_a.id, type_b.visibility_level, type_b.id)) {
+      } else if (!context->ignore_id_shift &&
+                 IsIdDiff(type_a.visibility_level, type_a.id, type_b.visibility_level, type_b.id)) {
         std::stringstream str_stream;
         str_stream << pkg_a.name << ":" << type_a.named_type << " has different public ID (";
         if (type_b.id) {
@@ -332,7 +369,7 @@
   return diff;
 }
 
-static bool EmitResourceTableDiff(IAaptContext* context, LoadedApk* apk_a, LoadedApk* apk_b) {
+static bool EmitResourceTableDiff(DiffContext* context, LoadedApk* apk_a, LoadedApk* apk_b) {
   const auto table_a = apk_a->GetResourceTable()->GetPartitionedView();
   const auto table_b = apk_b->GetResourceTable()->GetPartitionedView();
 
@@ -355,7 +392,7 @@
     } else {
       const auto& package_a = *package_a_iter;
       const auto& package_b = *package_b_iter;
-      if (package_a.id != package_b.id) {
+      if (package_a.id != package_b.id && !context->ignore_id_shift) {
         std::stringstream str_stream;
         str_stream << "package '" << package_a.name << "' has different id (";
         if (package_b.id) {
@@ -405,7 +442,7 @@
 }
 
 int DiffCommand::Action(const std::vector<std::string>& args) {
-  DiffContext context;
+  DiffContext context(ignore_id_shift_);
 
   if (args.size() != 2u) {
     std::cerr << "must have two apks as arguments.\n\n";
diff --git a/tools/aapt2/cmd/Diff.h b/tools/aapt2/cmd/Diff.h
index c388888..32e3944 100644
--- a/tools/aapt2/cmd/Diff.h
+++ b/tools/aapt2/cmd/Diff.h
@@ -14,9 +14,7 @@
  * limitations under the License.
  */
 
-#ifndef AAPT2_DIFF_H
-#define AAPT2_DIFF_H
-
+#pragma once
 #include "Command.h"
 
 namespace aapt {
@@ -25,11 +23,16 @@
  public:
   explicit DiffCommand() : Command("diff") {
     SetDescription("Prints the differences in resources of two apks.");
+    AddOptionalSwitch("--ignore-id-shift",
+                      "Match the resources when their IDs shift, e.g. because of the added\n"
+                      "or deleted entries.",
+                      &ignore_id_shift_);
   }
 
   int Action(const std::vector<std::string>& args) override;
+
+ private:
+  bool ignore_id_shift_ = false;
 };
 
-}// namespace aapt
-
-#endif //AAPT2_DIFF_H
+}  // namespace aapt